pandas 在海运条形图中绘制百分比

hfwmuf9z  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(101)

为了一个框架

import pandas as pd
df = pd.DataFrame(
    {'group': list("AADABCBCCCD"),
     'Values': [1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0]})

字符串
我试图绘制一个条形图,显示A, B, C, D取零(或一)的次数百分比。
这是有效的:

tempdf = df.groupby(['group', 'Values']).Values.count().unstack().fillna(0)
tempdf['total'] = df['group'].value_counts()
tempdf['percent'] = tempdf[0] / tempdf['total'] * 100

tempdf.reset_index(inplace=True)
print(tempdf)

sns.barplot(x='group', y='percent', data=tempdf)


如果它只是绘制平均值,我可以简单地在df上绘制sns.barplot,而不是tempdf。如果我对绘制百分比感兴趣,我不知道如何优雅地做到这一点。

xzabzqsa

xzabzqsa1#

您可以将Pandas与seaborn结合使用,使其更容易:

import pandas as pd
import seaborn as sns

df = sns.load_dataset("tips")
x, y, hue = "day", "proportion", "sex"
hue_order = ["Male", "Female"]

(df[x]
 .groupby(df[hue])
 .value_counts(normalize=True)
 .rename(y)
 .reset_index()
 .pipe((sns.barplot, "data"), x=x, y=y, hue=hue))

字符串


的数据

1szpjjfi

1szpjjfi2#

您可以在sns.barplotestimator中使用自己的函数,从docs开始:

estimator:可调用,Mapvector -> scalar,可选

统计函数用于在每个分类箱内进行估计。
在这种情况下,你可以将函数定义为lambda:

sns.barplot(x='group', y='Values', data=df, estimator=lambda x: sum(x==0)*100.0/len(x))

字符串
x1c 0d1x的数据

umuewwlo

umuewwlo3#

您可以按照以下步骤操作,以便在图中的条形图顶部看到计数和百分比。

with_hue函数将在条形图上绘制百分比,如果您在图中有'hue'参数。它将实际图形,特征,特征中的Number_of_categories和hue_categories(色调特征中的类别数)作为参数。
without_hue函数将在条形图上绘制百分比,如果你有一个正常的图。它将实际的图形和特征作为参数。

def with_hue(plot, feature, Number_of_categories, hue_categories):
    a = [p.get_height() for p in plot.patches]
    patch = [p for p in plot.patches]
    for i in range(Number_of_categories):
        total = feature.value_counts().values[i]
        for j in range(hue_categories):
            percentage = '{:.1f}%'.format(100 * a[(j*Number_of_categories + i)]/total)
            x = patch[(j*Number_of_categories + i)].get_x() + patch[(j*Number_of_categories + i)].get_width() / 2 - 0.15
            y = patch[(j*Number_of_categories + i)].get_y() + patch[(j*Number_of_categories + i)].get_height() 
            ax.annotate(percentage, (x, y), size = 12)
    plt.show()

def without_hue(plot, feature):
    total = len(feature)
    for p in ax.patches:
        percentage = '{:.1f}%'.format(100 * p.get_height()/total)
        x = p.get_x() + p.get_width() / 2 - 0.05
        y = p.get_y() + p.get_height()
        ax.annotate(percentage, (x, y), size = 12)
    plt.show()

字符串


的数据


czq61nw1

czq61nw14#

您可以使用library Dexplot,它能够返回分类变量的相对频率。它具有与Seaborn类似的API。将您想要获取相对频率的列传递给count函数。如果您想要将其细分为另一列,请使用split参数进行操作。以下返回原始计数。

import dexplot as dxp
dxp.count('group', data=df, split='Values')

字符串


的数据
要获取相对频率,请将normalize参数设置为要归一化的列。使用True对总计数进行归一化。

dxp.count('group', data=df, split='Values', normalize='group')



'Values'列进行归一化将生成以下图形,其中所有“0”条的总和为1。

dxp.count('group', data=df, split='Values', normalize='Values')


5f0d552i

5f0d552i5#

未来的我:
Seaborn >=0.13.0通过 stat 参数提供了内置功能:

sns.countplot(data=df, x="jobs_successful",hue="jobs_successful",stat="percent")

字符串
注意:如果您想要不同颜色的不同类别的细分,hue是可选的

相关问题