Matplotlib Ribbon Plot (fill_between) with a Categorical X-Axis
Clash Royale CLAN TAG#URR8PPP
Matplotlib Ribbon Plot (fill_between) with a Categorical X-Axis
I have the mean and standard deviations of a group and I want to create a ribbon plot with the mean and shadowed by the standard deviation, however I have categorical x_axis columns. There appears to be an autosorting function that throws everything off.
## Environmental Variables
x_axis = ['Hematite','Illmenite','Goethite','Magnetite','Quartz','Gibbsite','1:1 Clay','Maghemite','Carbonate Minerals','Plagioclase','2:1 Clays','Dolomite','Pyroxene','Calcite','Olivine','Glass']
negative_means = numpy.array([0.14335727,0.05707763,-0.25710322,-0.31085691,0.45552229,0.0092398,0.33358032,-0.31261271,-0.34325373,-0.32826959,-0.22494553,-0.13867505,0.42883104,0.52948655, -0.13867505,0.52948655])
negative_std = numpy.array([0.9218578779912541,1.0417523903222377,0.7225001946958459,0.6634664468936872,1.8400873597252276,1.2279905419059247,1.3735242455660657,0.721879847038041,0.5543207488394122,0.7817647212788771,0.0,0.0,2.088217480513372,2.2160413265187904,0.0,2.216041326518791])
fig, ax = plt.subplots(1)
ax.plot(negative_means, lw=2, label='mean population 1', color='blue')
plt.fill_between(x_axis, negative_means+negative_std, negative_means-negative_std, facecolor='blue', alpha=0.5)
## Set x labels
ax.set_xticklabels(x_axis)
x_max = int(max(plt.xticks()[0]))
# manually set xtick labels
plt.xticks(range(0, x_max + 1), x_axis, rotation=45)
The resulting plot is shown below:
How can I formulate my plot to appear similar to the question below with a categorical x_axis.
Plot yerr/xerr as shaded region rather than error bars
When I add x_axis to the ax.plot function the resulting graph is produced:
plot
ax.plot(x_axis, negative_means)
Hi @ImportanceOfBeingErnest, thank you for pointing that out. When I add x_axis as a parameter the line in plot also becomes skewed. I think the same autosorting that I deal with using set_xticklabels is happening to the fill_between information and I have no idea how to correct that.
– Cody Glickman
7 mins ago
Sorry, it seems you are using an older version of matplotlib. Could you simply update to 2.2.2 or 2.2.3?
– ImportanceOfBeingErnest
4 mins ago
Hi @ImportanceOfBeingErnest, I will try that out! I really hope that is the case! I had matplotlib 2.1.1 :/
– Cody Glickman
2 mins ago
1 Answer
1
I just changed the x
parameter for the fill between using a range
x
plt.fill_between(range(len(x_axis)), negative_means-negative_std, negative_means+negative_std, facecolor='blue', alpha=0.3)
Output
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
I guess you forgot to supply the x argument to
plot
,ax.plot(x_axis, negative_means)
. You are then responsible for sorting the values yourself, matplotlib will simply plot them in the order they are given to it.– ImportanceOfBeingErnest
10 mins ago