你好,我试图添加百分比到我的countplot
与5类别和2值(旧的和年轻的)。我试着从How to add percentages on top of bars in seaborn?添加def和循环
我的代码:
plt.figure(figsize =(7,5))
ax = sb.countplot(data = df_x_1, x = 'concern_virus', hue = 'age')
plt.xticks(size =12)
plt.xlabel('Level of Concern', size = 14)
plt.yticks(size = 12)
plt.ylabel('Number of People', size = 12)
plt.title("Older and Younger People's Concern over the Virus", size = 16)
ax.set_xticklabels(ax.get_xticklabels(), rotation=40, ha="right");
for p in ax.patches:
percentage = '{:.1f}%'.format(100 * p.get_height()/total)
x = p.get_x() + p.get_width()
y = p.get_height()
ax.annotate(percentage, (x, y),ha='center')
plt.show()
正如你所见,这些百分比没有意义。
2条答案
按热度按时间svujldwt1#
问题似乎出在上面代码中未定义的变量:
total
。total
应该是您要调用100%
的数字,例如 Dataframe 中的行数。这样,所有显示的百分比总和为100。下面是一些示例代码:
要使文本位于栏的中心,选择
ha='center'
并将宽度的一半添加到x位置会有所帮助。在文本后面附加一个换行符可以帮助文本很好地定位在栏的顶部。plt.tight_layout()
可以帮助将所有标签都适合图。Seaborn允许您通过
order=...
固定x轴的顺序。图例元素的顺序和相应的颜色可以通过hue_order=...
和palette=...
设置。PS:对于新问题,每个年龄组的总数,而不是直接循环通过所有的条,第一个循环可以访问组:
c9qzyr3d2#
matplotlib.pyplot.bar_label
可以更容易地完成这一点*在
python 3.11.2
、pandas 2.0.0
、matplotlib 3.7.1
、seaborn 0.12.2
中测试导入和DataFrame
按年龄总数百分比绘制
按年龄组总数百分比绘制