如何使用Python中的百分比值从数据帧创建堆叠百分比条形图?

如何使用Python中的百分比值从数据帧创建堆叠百分比条形图?,python,pandas,matplotlib,Python,Pandas,Matplotlib,我有以下数据帧: 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

我有以下数据帧:

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:空“DataFrame”:没有要打印的数字数据

给出了错误:

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)

我读了很多关于如何做到这一点的帖子,但我似乎没有弄明白。

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

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)

你可以为你的每一个孩子买*100stack@roganjosh舍入只是为了这里的帖子,我编辑并包含了实际值,您使用哪些库来处理dataframe和绘图?添加他们的标记可能很有用。这是一个数据框架df.set_index'Class'.T.plotkind='bar',stacked=True by Seaborn感谢您的明确回答。还有一个问题:你到底在哪里使用Seaborn?@Robvh我很抱歉给你带来困惑。我的习惯是设置seaborn风格。这就是我为什么懒散地提到seaborn的原因。谢谢!T.plot函数,它到底是什么?似乎在谷歌上找不到。我知道df.plot是一个熊猫的plot。但是T是什么?@Robvh'T代表转置。它交换列和索引@Robvh这是因为您想堆叠“类”的“百分比”。索引用于X轴,而列用作Y轴,因此,如果我们不转置它,我们将得到每个“类”作为X,一个“百分比”列作为堆栈。在您的情况下,这没有任何意义,因为您只有一个百分比列。
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)