如何将数据标签添加到 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何将单个 vlines 添加到 seaborn FacetGrid 的每个子图