【问题标题】:How to create a stacked percentage bar graph from a dataframe with percentage values in Python?如何从 Python 中具有百分比值的数据框创建堆叠百分比条形图?
【发布时间】:2019-06-27 08:58:05
【问题描述】:

我有以下数据框:

Class     Percentage
class1    0.215854
class2    0.12871
class3    0.122787
class4    0.0680061
class5    0.0670523
class6    0.0826716
class7    0.309828
class8    0
class9    0

如何创建一个堆叠的垂直条形图,其中 y 从 0-100% 变化并绘制百分比数据?我还想添加一个颜色对应于一个类的图例。

我试过的代码:

df.T.plot(kind='bar',stacked=True)

导致错误:TypeError: Empty 'DataFrame': no numeric data to plot

classgraph,texts = plt.bar(df["Percentage"],height=5) #added texts for later legend

报错:

Traceback (most recent call last):

  File "<ipython-input-71-894dc447893f>", line 1, in <module>
    classgraph,texts = plt.bar(dataframe_plot["Percentage"],height=5)

ValueError: too many values to unpack (expected 2)

我阅读了很多关于如何做到这一点的帖子,但我似乎无法弄清楚。

【问题讨论】:

  • 每个堆栈只能 *100
  • @roganjosh 四舍五入只是为了这里的帖子,我编辑并包含了真实值
  • 您使用哪些库来处理数据框和绘图?添加他们的标签可能很有用。
  • 这是一个熊猫数据框
  • df.set_index('Class').T.plot(kind='bar',stacked=True) by Seaborn

标签: python pandas matplotlib


【解决方案1】:

好吧,假设你有这个数据框

import pandas as pd
import seaborn as sns
sns.set_style("darkgrid")

data = {'Class': ['class1', 'class2', 'class3'],
        'mid-term': [345, 123, 74],
        'final':[235, 345, 632]}

df = pd.DataFrame(data)
df.head()


#    Class  mid-term    final
#0  class1  345       235
#1  class2  123       345
#2  class3  74        632

如果你绘制它,结果会很混乱。

df.set_index('Class').T.plot(kind='bar', stacked=True)

为了解决这个问题,你需要计算每一列的百分比。然后绘制它。

df['mid-per'] = (df['mid-term'] / df['mid-term'].sum() * 100)
df['final-per'] = (df['final'] / df['final'].sum() * 100)

df.set_index('Class')[['mid-per', 'final-per']].T.plot(kind='bar', stacked=True)

【讨论】:

  • 感谢您的明确答复。还有一个问题:你到底在哪里使用 Seaborn?
  • @Robvh 很抱歉造成混乱。设置 seaborn 风格是我的习惯。这就是我懒惰地提到 seaborn 的原因。
  • 谢谢! T.plot() 函数,它到底是什么?在 google 上好像找不到。我知道df.plot() 是熊猫情节。但是“T”是什么?
  • @Robvh 'T' 代表转置()。它交换列和索引。 pandas.pydata.org/pandas-docs/stable/reference/api/…
  • @Robvh 那是因为您想堆叠“类”的“百分比”。索引用于 X 轴,而列用作 Y 轴因此,如果我们不转置它,我们会将每个“类”作为 x,而将一个“百分比”列作为堆栈。在您的情况下,这没有任何意义,因为您只有一个百分比列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 2020-05-04
相关资源
最近更新 更多