我有一个看起来像这样的数据框:
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")
输出如下:
但是,我想将字符串“ 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")
我得到的输出为:
答案 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")
答案 1 :(得分:2)
我们现在可以使用内置的 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.catplot
和 kind='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])
这会绘制一个 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])
答案 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
使用您的样本数据,它会产生以下图:
如@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")