【问题标题】:How to plot two columns of pandas dataframe as horizontal barplot?如何将两列熊猫数据框绘制为水平条形图?
【发布时间】:2018-12-19 20:20:28
【问题描述】:

我正在尝试比较数据框中的两列,并希望使用 Seaborn 将它们绘制为水平条形图。在下图中,仅绘制了一列('budget2019')。

1) 我如何在它旁边绘制第二列 ('budget2018'),以便更好地查看两列值之间的演变,并直观地比较每个“部”的两个条形?

2) 如何将 x 值放在每个条的末尾,以便人们可以看到(读取)每个条上的 x 值,而不必低头,并尝试近似价值?因为现在在实际情节上,人们无法真正直接从条形图中读取 x 值。 (看图很难得到准确的值)

3) 在我将它绘制在“budget2019”条旁边的“budget2018”条之后,有没有办法将演变百分比也放在图上?为了在视觉上更好地阅读,两列之间的百分比变化是多少?

这是我的数据框:

这是我现在用来绘制的代码:

plt.figure(figsize=(15,8))

sns.set(style="darkgrid")

#ax = sns.barplot(x="budget2018", y="ministere", data=budget, label="Total")
sns.set_color_codes("pastel")
sns.barplot(x="budget2019", y="ministere", data=budget, label="Budget 2019")

sns.despine(left=True, bottom=True)

plt.tight_layout()
plt.show()

PS:如果 Seaborn 不可行,单独使用 Matplotlib 的解决方案也可以。需要的是水平条,就像我的情节一样,否则 yticks 不可读。

编辑(使用 ImportanceOfBeingErnest 评论中的代码后):

@ImportanceOfBeingErnest 评论后,这是我实际看到的情节。它非常接近我的需要。

【问题讨论】:

  • 您应该始终将 df 发布为纯文本,因为人们很难将其输入以帮助您。我们很懒,喜欢复制粘贴!
  • 一次问题太多了。或者说“太宽泛”。您的第一个问题可以通过df.set_index("ministere").plot.bar() 完成。第二个问题经常被问到,实际上很难在搜索时错过其中一个重复项。第三个问题可能很有趣。但你忘了告诉你如何你想象的样子。
  • 非常感谢您的帮助@ImportanceOfBeingErnest 它帮了很多忙!现在,是的,我是怎么想的。我想说,对我来说最好的办法是:1)左侧的“budget2019”的值,按 yticks,在每个 ytick 文本的开头(在括号),以及每个 'ministere' 的每 2 个小节前面的 evolution_percent 值。我希望你明白我的意思? ://

标签: python pandas matplotlib plot seaborn


【解决方案1】:

要使用 seaborn,您必须使用使用 melt 创建的中间数据帧来生成“长格式”数据帧。

df2 = pd.melt(budget, id_vars=['ministere'], value_vars=['budget2018','budget2019'], var_name='year')

然后使用hue= 参数绘制两列:

fig,ax = plt.subplots()
sns.set_color_codes("pastel")
sns.barplot(x="value", y="ministere", hue="year", data=df2, palette='pastel')

根据要求调整标签相当容易(您会在 SO 上找到很多其他示例):

for i,m in budget.iterrows():
    ax.annotate(s='{:.2f}%'.format(m.loc['evolution_percent']),
                xy=(m.loc[['budget2018','budget2019']].max(),i),
                xytext=(10,0),
                textcoords='offset pixels',
                ha='left',
                va='center'
               )

labels = ['{:s}\n(2019: {:.2f}€)'.format(d.ministere,d.budget2019) for _,d in budget.iterrows()]
ax.set_yticklabels(labels)

【讨论】:

  • 完美!谢谢!
  • 我倾向于了解 dfs 中的差异,以便使用 plotlyseaborn 进行绘图。那么,如果我们需要将此图堆叠而不是使用sns 聚类呢?我看到像stacked=True 这样的论点不起作用。
猜你喜欢
  • 2018-08-28
  • 2016-05-16
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2017-06-09
相关资源
最近更新 更多