在 seaborn 的 countplot 中添加柱状图顶部百分比的问题

3
在一个计数图中,我需要在柱状图的顶部添加百分比。我已经尝试了this帖子中提供的解决方案。但是我只能得到第一根柱子的百分比,而不是其他的。有没有办法解决这个问题?以下是代码片段:
import pandas as pd
my_data_set = pd.DataFrame({'ydata': ['N', 'N', 'N', 'N', 'N', 'N', 'Y', 'N', 'Y', 'N', 'N'], 
               'p_f_test': ['False', 'True', 'True', 'True', 'False', 'False', 'False', 'False', 'False', 'False', 'True']}) 

total = float(len(my_data_set))
ax = sns.countplot(x='p_f_test',hue='ydata',data=my_data_set)
for p in ax.patches:
    height = p.get_height()
    ax.text(p.get_x()+p.get_width()/2., height + 3, '{:1.2f}'.format(height/total), ha="center").astype(int)

我建议您先删除 .astype(int),因为您无法将 matplotlib.text.Text 元素转换为整数。 - ImportanceOfBeingErnest
如果我移除它,我会得到以下错误:ValueError: 无法将浮点数NaN转换为整数 - ggg_datascience
1
有趣。需要一个 [mcve] 来查看它的来源。 - ImportanceOfBeingErnest
抱歉,我无法解释这个文本。请[编辑]您的问题。提供一个可运行的示例会更有益,例如参见如何创建良好的可重现Pandas示例。最近一个带有此类mcve的好问题是这个 - ImportanceOfBeingErnest
感谢您的回复。我已经使用可重现的pandas代码编辑了问题。 - ggg_datascience
显示剩余2条评论
1个回答

2
您的图表中有一条没有范围的柱形,即get_heightNaN。您需要明确捕获这种情况。可能您想使用0代替。"最初的回答"
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

my_data_set = pd.DataFrame({'ydata': ['N', 'N', 'N', 'N', 'N', 'N', 'Y', 'N', 'Y', 'N', 'N'], 
               'p_f_test': ['False', 'True', 'True', 'True', 'False', 'False', 'False', 'False', 'False', 'False', 'True']}) 

total = float(len(my_data_set))
ax = sns.countplot(x='p_f_test',hue='ydata',data=my_data_set)
for p in ax.patches:
    height = p.get_height()
    if np.isnan(height):
        height=0
    ax.text(p.get_x()+p.get_width()/2., height, '{:1.2f}'.format(height/total), ha="center")

plt.show()

谢谢。这很有帮助。是否可以按p_f_test分组获取百分比?也就是说,False(N + Y)的总和应该为1,True(N + Y)的总和也应该为1。 也就是说,False 'N'的柱状图应该显示0.71而不是0.45,False 'Y'的柱状图应该显示0.28而不是0.18。 同样地,True 'N'应该显示1而不是0.36。 - ggg_datascience
那是一个不同的问题。通常你可以先计算需要的任何数字,然后绘制或注释这些数字。 - ImportanceOfBeingErnest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接