matplotlib 如何将百分比添加到计数图中?

bweufnob  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(143)

我需要在条形图中显示一个百分比。但是我不知道该怎么做。

sns.set_style('whitegrid')
sns.countplot(y='type',data=df,palette='colorblind')
plt.xlabel('Count')
plt.ylabel('Type')
plt.title('Movie Type in Disney+')
plt.show()

nle07wnf

nle07wnf1#

  • matplotlib v.3.4.0中,注解条形的正确方法是使用.bar_label方法,如How to add value labels on a bar chart中详细描述的
  • seaborn.countplot返回ax : matplotlib.Axes,因此习惯上使用ax作为这个轴级方法的别名。
  • Axes是显式接口。
  • 这将使用来自其他question的数据。
    *python 3.11.2pandas 2.0.0matplotlib 3.7.1seaborn 0.12.2中测试
ax = sns.countplot(y='type', data=df, palette='colorblind')

# get the total count of the type column
total = df['type'].count()

# annotate the bars with fmt from matplotlib v3.7.0
ax.bar_label(ax.containers[0], fmt=lambda x: f'{(x/total)*100:0.1f}%')

# add space at the end of the bar for the labels
ax.margins(x=0.1)

ax.set(xlabel='Count', ylabel='Type', title='Movie Type in Disney+')
plt.show()

  • 同样的实现也适用于竖线
ax = sns.countplot(x='type', data=df, palette='colorblind')

# get the total count of the type column
total = df['type'].count()

# annotate the bars with fmt from matplotlib v3.7.0
ax.bar_label(ax.containers[0], fmt=lambda x: f'{(x/total)*100:0.1f}%')
plt.show()

  • v3.4.0 <= matplotlib < v3.7.0使用labels参数。
# for horizontal bars
labels = [f'{(w/total)*100:0.1f}%' if (w := v.get_width()) > 0 else '' for v in ax.containers[0]]

# for vertical bars
# labels = [f'{(h/total)*100:0.1f}%' if (h := v.get_height()) > 0 else '' for v in ax.containers[0]]

ax.bar_label(ax.containers[0], labels=labels)
oprakyz7

oprakyz72#

开头的代码看起来很棒!您只需要通过将条形宽度除以总计数并乘以100来计算每个条形的百分比值。然后使用annotate函数将那些计算为文本的值添加到栏中。试试下面的代码,看看它是否适合你!

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_style('whitegrid')

# Create the countplot and naming it 'plot'. 
plot = sns.countplot(y='type', data=df, palette='colorblind')

plt.xlabel('Count')
plt.ylabel('Type')
plt.title('Movie Type in Disney+')

total = len(df['type']) 

for p in plot.patches:
    percentage = '{:.1f}%'.format(100 * p.get_width() / total)
    x = p.get_x() + p.get_width() + 0.02
    y = p.get_y() + p.get_height() / 2
    plot.annotate(percentage, (x, y))
plt.show()

相关问题