matplotlib 在多个子图行中绘制条形图

wd2eg0qa  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(183)

我有一个简单的长格式数据集,我想从中生成条形图。dataframe看起来像这样:

data = {'Year':[2019,2019,2019,2020,2020,2020,2021,2021,2021],
        'Month_diff':[0,1,2,0,1,2,0,1,2],
        'data': [12,10,13,16,12,18,19,45,34]}
df = pd.DataFrame(data)

我想绘制一个条形图,其中有3行,分别为2019年,2020年和2021年。X轴为month_diffdata在Y轴上。我如何做到这一点?
如果数据在不同的列中,那么我可以使用以下代码:

df.plot(x="X", y=["A", "B", "C"], kind="bar")

但是我的data是在一个单独的列中,理想情况下,我希望每年都有不同的行。

chhkpiq4

chhkpiq41#

1. seaborn.catplot

长格式 Dataframe 最简单的选择是seaborn.catplot Package 器,正如Johan所说:

import seaborn as sns
sns.catplot(data=df, x='Month_diff', y='data', row='Year',
            kind='bar', height=2, aspect=4)

2. pivot + DataFrame.plot

无海运:

  • pivot从长格式到宽格式(每列1年)
  • 使用DataFrame.plotsubplots=True将每一年放入它自己的子图中(也可以选择sharey=True
(df.pivot(index='Month_diff', columns='Year', values='data')
   .plot.bar(subplots=True, sharey=True, legend=False))
plt.tight_layout()

请注意,如果您更喜欢单个分组条形图(您在最后提到),您可以省略subplots参数:

df.pivot(index='Month_diff', columns='Year', values='data').plot.bar()

3. DataFrame.groupby + subplots

你也可以迭代df.groupby('Year')对象:

  • 根据组数(年)创建subplots轴网格
  • 将每个组(年)绘制到其自己的子图行
groups = df.groupby('Year')
fig, axs = plt.subplots(nrows=len(groups), ncols=1, sharex=True, sharey=True)

for (name, group), ax in zip(groups, axs):
    group.plot.bar(x='Month_diff', y='data', legend=False, ax=ax)
    ax.set_title(name)

fig.supylabel('data')
plt.tight_layout()

相关问题