使用 Pandas 在多个子图行中绘制条形图

Posted

技术标签:

【中文标题】使用 Pandas 在多个子图行中绘制条形图【英文标题】:Plot bar chart in multiple subplot rows with Pandas 【发布时间】:2021-12-27 03:00:10 【问题描述】:

我有一个简单的长格式数据集,我想从中生成条形图。数据框如下所示:

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 位于一列中,理想情况下,我希望每年有不同的行。

【问题讨论】:

这是 Seaborn 的一个非常典型的用例:sns.catplot(kind='bar', data=df, x='Month_diff', y='data', row='Year', height=2, aspect=4)。 docsresulting plot 【参考方案1】:

1。 seaborn.catplot

正如 Johan 所说,长格式数据框的最简单选项是 seaborn.catplot 包装器:

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

没有seaborn:

pivot 从长篇到宽篇(每栏一年) 使用 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()

【讨论】:

以上是关于使用 Pandas 在多个子图行中绘制条形图的主要内容,如果未能解决你的问题,请参考以下文章

对饼图和条形图 Pandas 使用子图 [重复]

matlab绘图函数条形图极坐标土折线图等matlab图行绘制八

matlab绘图函数条形图极坐标土折线图等matlab图行绘制八

在同一轴上绘制多个条形图

使用日期作为Xticks绘制带有子图的条形图

Pandas 在单个条形图上绘制多列 [重复]