Reputation: 349
I'd like to create five subplots (one for each category in a specific column of a dataframe) on a seaborn histogram (distplot).
My dataset is:
prog score
cool 1.9
cool 3.7
yay 4.5
yay 2.6
neat 1.4
neat 7
neat 6
wow 4.1
wow 1.7
wow 1.4
hooray 6.6
hooray 5.6
hooray 4.9
yikes 1.2
yikes 3.9
yikes 6.9
I don't want all of the 'prog's plotted, just each in a list:
prog_list = ['cool', 'yay', 'neat', 'yikes', 'wow']
scores = df['score']
f, axes = plt.subplots(3, 2, figsize=(15, 15))
# Delete last chart since there are only 5 subplots I need
f.delaxes(ax = axes[2,1])
for i, axes in enumerate(f.axes):
scores = df.loc[(df['prog'] == prog_list[i])]['score']
axes = sns.distplot(scores, norm_hist=True, color='b')
sigma = round(scores.std(), 3)
mu = round(scores.mean(), 2)
axes.set_xlim(1,7)
axes.set_xticks(range(2,8))
axes.set_xlabel('Score - Mean: {} (σ {})'.format(mu, sigma))
axes.set_ylabel('Density')
But when I do this, it just plots each subset onto the same plot (which is kind of cool, but definitely not what I want here).
Upvotes: 0
Views: 5505
Reputation: 150825
Try this:
# your code use axes and redefine it after every iteration
# I think this would be better
for prog, ax in zip(prog_list, axes.flatten()[:5]):
scores = df.loc[(df['prog'] == prog)]['score']
# note how I put 'ax' here
sns.distplot(scores, norm_hist=True, ax=ax, color='b')
# change all the axes into ax
sigma = round(scores.std(), 3)
mu = round(scores.mean(), 2)
ax.set_xlim(1,7)
ax.set_xticks(range(2,8))
ax.set_xlabel('Score - Mean: {} (σ {})'.format(mu, sigma))
ax.set_ylabel('Density')
plt.show()
Output:
Upvotes: 5