Note that there are some explanatory texts on larger screens.

plurals
  1. POsetting spacing between grouped bar plots in matplotlib
    text
    copied!<p>I'm trying to make a grouped bar plot in matplotlib, following the example in the gallery. I use the following:</p> <pre><code>import matplotlib.pyplot as plt plt.figure(figsize=(7,7), dpi=300) xticks = [0.1, 1.1] groups = [[1.04, 0.96], [1.69, 4.02]] group_labels = ["G1", "G2"] num_items = len(group_labels) ind = arange(num_items) width = 0.1 s = plt.subplot(1,1,1) for num, vals in enumerate(groups): print "plotting: ", vals group_len = len(vals) gene_rects = plt.bar(ind, vals, width, align="center") ind = ind + width num_groups = len(group_labels) # Make label centered with respect to group of bars # Is there a less complicated way? offset = (num_groups / 2.) * width xticks = arange(num_groups) + offset s.set_xticks(xticks) print "xticks: ", xticks plt.xlim([0 - width, max(xticks) + (num_groups * width)]) s.set_xticklabels(group_labels) </code></pre> <p><img src="https://i.stack.imgur.com/tPn37.png" alt="enter image description here"></p> <p>My questions are:</p> <ol> <li><p>How can I control the space between the groups of bars? Right now the spacing is huge and it looks silly. Note that I do not want to make the bars wider - I want them to have the same width, but be closer together.</p></li> <li><p>How can I get the labels to be centered below the groups of bars? I tried to come up with some arithmetic calculations to position the xlabels in the right place (see code above) but it's still slightly off... it feels a bit like writing a plotting library rather than using one. How can this be fixed? (Is there a wrapper or built in utility for matplotlib where this is default behavior?)</p></li> </ol> <p><strong>EDIT:</strong> Reply to @mlgill: thank you for your answer. Your code is certainly much more elegant but still has the same issue, namely that the width of the bars and the spacing between the groups are not controlled separately. Your graph looks correct but the bars are far too wide -- it looks like an Excel graph -- and I wanted to make the bar thinner.</p> <p>Width and margin are now linked, so if I try:</p> <pre><code>margin = 0.60 width = (1.-2.*margin)/num_items </code></pre> <p>It makes the bar skinnier, but brings the group far apart, so the plot again does not look right.</p> <p>How can I make a grouped bar plot function that takes two parameters: the width of each bar, and the spacing between the bar groups, and plots it correctly like your code did, i.e. with the x-axis labels centered below the groups?</p> <p>I think that since the user has to compute specific low-level layout quantities like margin and width, we are still basically writing a plotting library :) </p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload