Matplotlib Ribbon Plot (fill_between) with a Categorical X-Axis

The name of the pictureThe name of the pictureThe name of the pictureClash 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:
enter image description here



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:



enter image description here





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


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



enter image description here






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.

Popular posts from this blog

Firebase Auth - with Email and Password - Check user already registered

Dynamically update html content plain JS

How to determine optimal route across keyboard