来自 Pandas 数据框的 Matplotlib 中堆积条形图中的标签问题

Posted

技术标签:

【中文标题】来自 Pandas 数据框的 Matplotlib 中堆积条形图中的标签问题【英文标题】:Issue with Label in Stacked Bar chart in Matplotlib from a Pandas Dataframe 【发布时间】:2021-06-04 07:56:15 【问题描述】:

我有一个数据框,其中有一列(例如“Col”),其值来自此列表 ['PO101','NI101','NE101']。

计数是:

PO101 = 30000 NI101 = 5000 NE101 = 3000

我试图在堆积条形图上显示有多少。

我使用以下代码创建了堆积图:

df.assign(dummy=1).groupby(['dummy','Col']).size().to_frame().unstack().plot(
    kind='bar',
    stacked=True,
    legend=True)

这将创建图表,但图例具有奇怪的元组值,其中包含如下虚拟对象:

所以我把上面的图例设置为False,用下面的方式生成新的图例。

current_handles, _ = plt.gca().get_legend_handles_labels()
reversed_handles = reversed(current_handles)
labels = reversed(df['Col'].unique())
plt.legend(reversed_handles,labels,loc='lower right')

这生成了具有正确名称的图例,但是,它没有向我显示正确的颜色代码,如下所示:

绿色(图表中最大的部分)应该是 PO101,而不是显示为 NI101。

谁能解释一下为什么?

我认为生成图表的顺序和列出唯一值的顺序可能不同。

在这里感谢一些指导。

编辑: 附上图表输出的截图供您参考。

【问题讨论】:

即使我将数据 PO101,NI101,NE101 更改为 1,0,-1 也会发生这种情况。但如果我将值分别更改为 A、B、O,它就解决了。 Dataframe 有一列(比如“Col”),其值来自此列表 ['PO101','NI101','NE101'],计数为...我认为您可以/应该只创建一个计数为3,4,5 的小样本,以便您的代码可以运行并将其放入问题中。 我可以在问题中添加输出图表吗?由于代码仅生成输出图表。我在这里找不到上传图片的方法。 见this guide。 不是我的 DV,但要求某人创建一个虚拟数据集而不是自己提供一个可能是它被否决的原因。 【参考方案1】:

试试:

(df['col'].value_counts()
  .to_frame().T
  .plot.bar(stacked=True)
)

你会得到类似这样的东西:

【讨论】:

谢谢广。如果可以的话,你能告诉我如何在同一个图中添加另一列来创建一个两个条形堆积图吗?在我之前尝试的代码中,我可以在 groupby 中添加多个列而不是 dummy 以获得双堆叠条。在这个版本中我该怎么做? @Meet 其他列是否具有相同的三个值?同样,您应该包含代表您的完整问题的示例数据。你不应该问一个部分问题,然后像这样扩展它。 好的。我可以在评论部分看到其他问题,其中讨论了相关查询,因此不需要针对另一点提出新问题。虽然下次我问这个问题时我会记住这一点。 我可以得到解决方案。不过谢谢。对于其他人,groupby() 和 unstack() 将有助于使用 Quang 的版本完成此操作。 @Meet 是的,这就是我想要的解决方案。不过,我之前的评论是有效的,因为其他人不太可能在上面查看您的评论 :-)

以上是关于来自 Pandas 数据框的 Matplotlib 中堆积条形图中的标签问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 matplotlib 绘制堆积条形图,保持 pandas 数据框的顺序,因为它使用 python

来自 pandas 数据框的 2 列的 Seaborn 散点图

将实际数据覆盖在来自 pandas 数据框的箱线图上

来自带有 NaN 的 pandas 数据框的 seaborn 热图

如何从 Pandas 数据框对象显示 X 轴到 Matplotlib 条形图

将来自一个数据框的值合并到 Pandas 中的新列中[重复]