如何将数据标签添加到 seaborn barplot?

Posted

技术标签:

【中文标题】如何将数据标签添加到 seaborn barplot?【英文标题】:How to add data labels to seaborn barplot? 【发布时间】:2020-09-12 02:13:41 【问题描述】:

我有以下代码在 seaborn 中生成条形图

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
print(df):
    A   B   C   D
0   15  21  13   5
1   14  94  99  14
2   11  11  13  69
3   27  90  37   6
4   51  93  92  24
..  ..  ..  ..  ..
95  45  40  85  62
96  44  48  61  43
97  39  66  72  72
98  51  97  17  32
99  51  42  29  15


probbins = [0,10,20,30,40,50,60,70,80,90,100]
df['Groups'] = pd.cut(df['D'],bins=probbins)
plt.figure(figsize=(15,6))
chart = sns.barplot(x=df['Groups'], y=df['C'],estimator=sum,ci=None)
chart.set_title('Profit/Loss')
chart.set_xticklabels(chart.get_xticklabels(), rotation=30)
plt.show()

这给了我:

我怎样才能简单地为这个图添加数据标签?任何帮助将不胜感激!

【问题讨论】:

Seaborn Barplot - Displaying Values这里有和你一样的问题和答案。 感谢@r-beginners。我很难理解for index, row in groupedvalues.iterrows(): g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center") 将如何适用于我的案例。 它的作用是一次一行地从 DF 中获取值以显示该值。由于“g”指向条形图,因此向该条形图添加文本的过程是在循环中完成的。 另一个解决方案here,虽然它是针对barh/ 由于您似乎是 Stack Overflow 的新手,您应该阅读How to create a Minimal, Complete, and Verifiable example 【参考方案1】:

从 matplotlib 3.4.0 开始,我们现在可以使用新的 Axes.bar_label 注释条形图。

在 OP 的代码中,chart 是一个 Axes 对象,所以我们可以使用:

chart = sns.barplot(data=df, x='Groups', y='C', estimator=sum, ci=None)

# new helper method to auto-label bars (matplotlib 3.4.0+)
chart.bar_label(chart.containers[0])

请注意,分组条形图(带有hue)将有多个条形图containers,因此在这种情况下需要迭代containers

for container in chart.containers:
    chart.bar_label(container)

【讨论】:

不幸的是,仅适用于单个系列条形图 @barnhillec 你的意思是分组条形图吗?如果是这样,您可以迭代containers 而不仅仅是标记containers[0]:请参阅***.com/a/68334380/13138364 上的最后一条注释【参考方案2】:

对于那些对我如何解决它感兴趣的人:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
print(df):
    A   B   C   D
0   31  11  65  15
1   83  21   5  87
2   16   6  81  41
3   91  78  95  70
4   26  51  26  61
..  ..  ..  ..  ..
95  31  18  91  24
96  73  97  42  45
97  76  22   2  36
98  12  43  98  27
99  33  96  67  68


probbins = [0,10,20,30,40,50,60,70,80,90,100]
df['Groups'] = pd.cut(df['D'],bins=probbins)
plt.figure(figsize=(15,6))
chart = sns.barplot(x=df['Groups'], y=df['C'],estimator=sum,ci=None)
chart.set_title('Profit/Loss')
chart.set_xticklabels(chart.get_xticklabels(), rotation=30)
# annotation here
for p in chart.patches:
             chart.annotate("%.0f" % p.get_height(), (p.get_x() + p.get_width() / 2., p.get_height()),
                 ha='center', va='center', fontsize=10, color='black', xytext=(0, 5),
                 textcoords='offset points')
plt.show()

【讨论】:

以上是关于如何将数据标签添加到 seaborn barplot?的主要内容,如果未能解决你的问题,请参考以下文章

使用 seaborn 在 x y 散点图中添加标签

如何将时间用作带有seaborn的散点图的x轴?

如何将单个 vlines 添加到 seaborn FacetGrid 的每个子图

将分割图(点图)添加到分组箱线图 - Pandas 和 Seaborn

如何在 Seaborn 中叠加两个图表?

如何在 seaborn FacetGrid 中格式化 y 轴或 x 轴标签