Pat*_*bug 5 python matplotlib bar-chart pandas seaborn
我有一个简单的长格式数据集,我想从中生成条形图。数据框如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
我想绘制一个有 3 行的条形图,每行代表 2019 年、2020 年和 2021 年。X 轴month_diff为dataY 轴。我该怎么做呢?
如果数据位于不同的列中,那么我可以使用以下代码:
df.plot(x="X", y=["A", "B", "C"], kind="bar")
Run Code Online (Sandbox Code Playgroud)
但我的data在单列中,理想情况下,我希望每年都有不同的行。
seaborn.catplot长格式数据帧最简单的选择是seaborn.catplot包装器,正如 Johan 所说:
import seaborn as sns
sns.catplot(data=df, x='Month_diff', y='data', row='Year',
kind='bar', height=2, aspect=4)
Run Code Online (Sandbox Code Playgroud)
pivot+DataFrame.plot没有seaborn:
pivot从长格式到宽格式(每列 1 年)DataFrame.plotwithsubplots=True将每年放入其自己的子图中(并且可选sharey=True)(df.pivot(index='Month_diff', columns='Year', values='data')
.plot.bar(subplots=True, sharey=True, legend=False))
plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)
请注意,如果您更喜欢单个分组条形图(您在最后提到的),您可以省略参数subplots:
df.pivot(index='Month_diff', columns='Year', values='data').plot.bar()
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)