Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python/pandas/seaborn将分类数据绘制成相对频率的单条形图_Python_Pandas_Bar Chart_Seaborn - Fatal编程技术网

使用python/pandas/seaborn将分类数据绘制成相对频率的单条形图

使用python/pandas/seaborn将分类数据绘制成相对频率的单条形图,python,pandas,bar-chart,seaborn,Python,Pandas,Bar Chart,Seaborn,我有一大堆调查中的分类数据,我想用与图中所示相同的方式来绘制。实际上,它是一个条形饼图 数据在熊猫数据框中,下面是一个我尝试做的玩具示例: import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # create toy dataframe df = pd.DataFrame({'Names': ['Steve','Steve','Steve','Jon','Michael','Michael','E

我有一大堆调查中的分类数据,我想用与图中所示相同的方式来绘制。实际上,它是一个条形饼图

数据在熊猫数据框中,下面是一个我尝试做的玩具示例:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt


# create toy dataframe
df = pd.DataFrame({'Names': ['Steve','Steve','Steve','Jon','Michael','Michael','Eric'] })


# get pd.Series of counts of each name
data_counts = df['Names'].value_counts()


# return the name of each category, and its counts separately
category_names = data_counts.index
category_counts = data_counts.get_values()


# attempt to plot
f, ax = plt.subplots(figsize=(10, 10))
colors = ['red', 'green', 'blue', 'yellow']
i=0
for name, data in zip(category_names, category_counts):

    sns.barplot(x=data, label=name, color=colors[i])
    i+=1

handles, labels = ax.get_legend_handles_labels()
ax.legend(loc='upper right', prop={'size':12})
这会产生一种堆叠的直方图,但每个类别并不是按比例表示的。每个条形图都是过度绘制的,而不是作为分数共享绘制的


这是正确的吗?

首先,您没有正确使用子批次,请参见此处:

其次,可以使用pandas的基本绘图功能绘制堆叠条形图:

pd.DataFrame(data_counts).transpose().plot(kind='barh', stacked=True)
请注意,对于要堆叠的条形图,必须转置数据,并且为了转置熊猫系列,需要首先将其转换为数据帧


最后,如果您确实想使用Seaborn,此链接可能会有所帮助:

不是最优雅的,但它可以:

x = df.Names.value_counts()
y = x.reset_index()
y["name_of_column"] = ""
y.pivot(index="name_of_column", columns="index", values=0).plot(kind="bar", stacked=True)

你知道你会的,对吧?这将帮助将来有类似问题的其他人。感谢您的帮助!我不知道“接受回答”有时间限制。谢谢你的提醒,你实际上对答案投了赞成票,但没有接受:)你可以对任何好的答案投赞成票,但你只能接受一个答案。你应该接受最适合你的答案(可能是主观的)。很高兴我能帮忙!