Matplotlib 循环遍历 seaborn 图中的轴以获取多个子图

Posted

技术标签:

【中文标题】Matplotlib 循环遍历 seaborn 图中的轴以获取多个子图【英文标题】:Matplotlib loop through axes in a seaborn plot for multiple subplots 【发布时间】:2019-09-10 05:24:30 【问题描述】:

我想在 seaborn 直方图 (distplot) 上创建五个子图(数据帧特定列中的每个类别一个)。

我的数据集是:

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

我不希望 所有 的 'prog's 被绘制,只是列表中的每一个:

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')

但是当我这样做时,它只是将每个子集绘制到同一个图上(这很酷,但绝对不是我想要的)。

【问题讨论】:

【参考方案1】:

试试这个:

# 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()

输出:

【讨论】:

我认为你在压缩时不需要[:5],因为zip 已经处理了不等列表的情况。

以上是关于Matplotlib 循环遍历 seaborn 图中的轴以获取多个子图的主要内容,如果未能解决你的问题,请参考以下文章

将 Matplotlib/Seaborn 散点图变形为平行四边形

如何为多图布局调整 Matplotlib/Seaborn 子图之间的空间

Matplotlib学习---用seaborn画矩阵图(pair plot)

seaborn + matplotlib 画图(四): 自定义子图+拟合线

使用 pandas/matplotlib 或 seaborn 排序的条形图

如何在 matplotlib 或 seaborn 中创建带有系列的堆叠条形图? [复制]