python - 在 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")
我得到的输出为:
解决方案
matplotlib 3.4.0 中的新功能
我们现在可以使用内置的自动注释条形图Axes.bar_label
,所以我们需要做的就是访问/提取 seaborn 图的Axes
.
Seaborn 提供了几种绘制计数的方法,每种方法的计数聚合和Axes
处理略有不同:
seaborn.countplot
(最直接)这会自动聚合计数并返回一个
Axes
,所以只需直接 labelax.containers[0]
:ax = sns.countplot(x='User', data=df) ax.bar_label(ax.containers[0])
seaborn.catplot
和kind='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])
-
这将返回一个
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)
推荐阅读
- javascript - 使用不同的企业 ID 时,信任试点轮播不起作用
- php - redis大通道数性能
- php - 使用 PHP 将 JSON 中的“false”值转换为空字符串
- php - Joomla 插件将 Javascript 片段注入所有页面
- android - 在 Outterclass 中应用更改的 Runnable 匿名类模拟示例?
- ios - 无法在桥文件中导入“fscalendar.h”
- html - 如何使手风琴面板可点击,而不仅仅是文本
- objective-c - 读取对象上未找到的字典元素的预期方法
- r - 用相同位数的随机数替换数字
- hive - Hive 表是 MANAGED 或 EXTERNAL - 发布表类型转换