In practicing drawing stacked bars with matplot I get an annoying white space (vertically) in all my charts HERE is an example . What can b e the solution?
Hello Welcome to the forum.
This link leads to the exercise, we are not able to see your code and your output. May I ask you to post your code and screenshot of the result?
Hello there, many thanks for your help here is my code :
from matplotlib import pyplot as plt import numpy as np unit_topics = ['Limits', 'Derivatives', 'Integrals', 'Diff Eq', 'Applications'] As = [6, 3, 4, 3, 5] Bs = [8, 12, 8, 9, 10] Cs = [13, 12, 15, 13, 14] Ds = [2, 3, 3, 2, 1] Fs = [1, 0, 0, 3, 0] x = range(5) plt.figure(figsize = (10,8)) #create d_bottom and f_bottom here c_bottom = np.add(As, Bs) d_bottom = np.add(c_bottom, Cs) f_bottom = np.add(d_bottom, Ds) #create your plot here plt.bar (x, As) plt.bar (x, Bs, bottom = Bs) plt.bar (x, Cs, bottom = c_bottom) plt.bar (x, Ds, bottom = d_bottom) plt.bar (x, Fs, bottom = f_bottom) ax =plt.subplot() ax.set_xticks(range(len(unit_topics))) ax.set_xticklabels(unit_topics) plt.ylabel("Number of Students") plt.xlabel("Unit") plt.title("Grade distribution") plt.savefig("my_stacked_bar.png") plt.show()
This is the result of your code:
Take a look at these two lines from your code:
plt.bar (x, As) plt.bar (x, Bs, bottom = Bs)
So the first line creates a new set of bars, with heights from the list
As. These are the blue bars in your plot.
But in the second line, you create a new set of bars (orange bars in the plot) with heights defined in the list
Bs and with bottom set to the list
Bs. This means that each bar
i will have height
Bs[i] and will be drawn starting at y coordinate =
And this is not what you should have done. You want to draw every next set of bars on the top of the previous set. So the y baseline (
bottom) should be set to the sum of heights of each previous set of bars. So for the second set of bars you want to set
bottom = As.
plt.bar(x, As) plt.bar(x, Bs, bottom = As) plt.bar(x, Cs, bottom = c_bottom) plt.bar(x, Ds, bottom = d_bottom) plt.bar(x, Fs, bottom = f_bottom)
If my explanation is a bit messy - sorry, here is another example. Let’s take a look at how you draw the third set of bars:
c_bottom = np.add(As, Bs) plt.bar(x, Cs, bottom = c_bottom)
In the first line, you calculated the sum of the height of corresponding bars from the set
Bs. And then you draw the new set of bars -
Cs specifying that they should be drawn at
y coordinates equal to the calculated sum.
Understood, thanks a lot for your help
You’re very welcome!