在海洋条形图的顶部显示计数

时间:2019-03-11 15:04:49

标签: python pandas matplotlib seaborn

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

  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")

输出如下:

enter image description here

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

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")

我得到的输出为:

enter image description here

3 个答案:

答案 0 :(得分:2)

其他解决方案

#data
labels=data['Sistema Operativo'].value_counts().index
values=data['Sistema Operativo'].value_counts().values

plt.figure(figsize = (15, 8))
ax = sns.barplot(x=labels, y=values)
for i, p in enumerate(ax.patches):
    height = p.get_height()
    ax.text(p.get_x()+p.get_width()/2., height + 0.1, values[i],ha="center")

Chart Image

答案 1 :(得分:2)

matplotlib 3.4.0 中的新功能

我们现在可以使用内置的 automatically annotate bar plots Axes.bar_label,所以我们需要做的就是访问/提取 seaborn 情节的 Axes

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

  • seaborn.countplot(最直接)

    这会自动将计数和绘图聚合到 Axes,因此只需直接标记 ax.containers[0]

    fig, ax = plt.subplots(figsize=(20, 10))
    sns.countplot(ax=ax, x='User', data=df)
    ax.bar_label(ax.containers[0])
    
  • seaborn.catplotkind='count'

    这将 countplot 绘制到 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 但不聚合计数,因此在标记 ax.containers[0] 之前首先计算 Series.value_counts

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

seaborn bars with labels

答案 2 :(得分:1)

df['User'].value_counts()将返回一个“系列”,其中包含“用户”列的唯一值的计数。

无需详细分析代码,您可以通过使用计数器索引value_counts的结果来更正代码:

fig, ax1 = plt.subplots(figsize=(20,10))
graph = sns.countplot(ax=ax1,x='User', data=df)
graph.set_xticklabels(graph.get_xticklabels(),rotation=90)
i=0
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()[i],ha="center")
    i += 1

使用您的样本数据,它会产生以下图:

enter image description here

如@ImportanceOfBeingErnest所建议的,以下代码使用height变量本身而不是索引的value_counts,使用更简单的代码生成相同的输出:

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,height ,ha="center")