首页 > 解决方案 > 在 seaborn barplot 顶部显示计数

问题描述

我有一个看起来像这样的数据框:

  User   A       B     C
   ABC   100    121   OPEN
   BCD   200    255   CLOSE
   BCD   500    134   OPEN
   DEF   600    125   CLOSE
   ABC   900    632   OPEN
   ABC   150    875   CLOSE
   DEF   690    146   OPEN

我正在尝试在“用户”列上显示计数图。代码如下:

fig, ax1 = plt.subplots(figsize=(20,10))
graph = sns.countplot(ax=ax1,x='User', data=df)
graph.set_xticklabels(graph.get_xticklabels(),rotation=90)
for p in graph.patches:
    height = p.get_height()
    graph.text(p.get_x()+p.get_width()/2., height + 0.1,
        'Hello',ha="center")

输出如下所示:

在此处输入图像描述

但是,我想用列“用户”的 value_counts 替换字符串“Hello”。当我添加代码以将标签添加到图形时:

for p in graph.patches:
    height = p.get_height()
    graph.text(p.get_x()+p.get_width()/2., height + 0.1,
        df['User'].value_counts(),ha="center")

我得到的输出为:

在此处输入图像描述

标签: pythonpandasmatplotlibseaborn

解决方案


matplotlib 3.4.0 中的新功能

我们现在可以使用内置的自动注释条形图Axes.bar_label,所以我们需要做的就是访问/提取 seaborn 图的Axes.

Seaborn 提供了几种绘制计数的方法,每种方法的计数聚合和Axes处理略有不同:

  • seaborn.countplot(最直接)

    这会自动聚合计数并返回一个Axes,所以只需直接 label ax.containers[0]

    ax = sns.countplot(x='User', data=df)
    ax.bar_label(ax.containers[0])
    
  • seaborn.catplotkind='count'

    这会将 a 绘制countplot到 a 上FacetGrid,因此Axes在标记 之前首先从网格中提取ax.containers[0]

    grid = sns.catplot(x='User', kind='count', data=df)
    ax = grid.axes[0, 0]
    ax.bar_label(ax.containers[0])
    
  • seaborn.barplot

    这将返回一个Axes但不聚合计数,因此Series.value_counts在标记之前首先计算ax.containers[0]

    counts = df.User.value_counts().rename_axis('user').reset_index(name='count')
    
    ax = sns.barplot(x='user', y='count', data=counts)
    ax.bar_label(ax.containers[0])
    

如果您正在使用hue

  • hue绘图将包含在多个条形组中,因此在这种情况下ax.containers需要迭代:

    ax = sns.countplot(x='User', hue='C', data=df)
    for container in ax.containers:
        ax.bar_label(container)
    

带有标签的seaborn酒吧


推荐阅读