使用 Seaborn 中的值标记水平条形图

max*_*max 4 python matplotlib seaborn

我有一个水平条形图,例如,seaborn 文档中示例的简化版本:https ://seaborn.pydata.org/examples/horizo​​ntal_barplot.html

import seaborn as sns
import matplotlib.pyplot as plt

f, ax = plt.subplots(figsize=(6, 15))

crashes = sns.load_dataset("car_crashes").sort_values("total", ascending=False)

sns.barplot(x="total", y="abbrev", data=crashes,
            label="Total", color="b")

ax.set(xlim=(0, 24), ylabel="",
       xlabel="Automobile collisions per billion miles")


plt.show()
Run Code Online (Sandbox Code Playgroud)

如何获得标有每个条形值的条形?

我为垂直条尝试了这种方法(如何在 seaborn 的条上添加百分比?),但它似乎不起作用。将高度更改为宽度不会产生我认为的效果。

for p in ax.patches:
    height = p.get_width()
    ax.text(p.get_y()+p.get_height()/2.,
            height + 3,
            '{:1.2f}'.format(height),
            ha="center")
Run Code Online (Sandbox Code Playgroud)

我假设水平图的工作方式不同?

tdy*_*tdy 7

从 matplotlib 3.4.0 开始

使用新的内置ax.bar_label,它将自动为条形容器添加标签,无论方向如何:

fig, ax = plt.subplots(figsize=(6, 8))
sns.barplot(x="total", y="abbrev", data=crashes)

# new helper method to auto-label bars
ax.bar_label(ax.containers[0])
Run Code Online (Sandbox Code Playgroud)

如果条形图按 分组hue,则调用ax.bar_label所有容器:

fig, ax = plt.subplots(figsize=(5, 6))
ax = sns.barplot(x="tip", y="day", hue="smoker", data=tips)

# grouped bars will have multiple containers
for container in ax.containers:
    ax.bar_label(container)
Run Code Online (Sandbox Code Playgroud)


max*_*max 6

明白了,感谢@ImportanceOfBeingErnest

这对我有用

for p in ax.patches:
    width = p.get_width()    # get bar length
    ax.text(width + 1,       # set the text at 1 unit right of the bar
            p.get_y() + p.get_height() / 2, # get Y coordinate + X coordinate / 2
            '{:1.2f}'.format(width), # set variable to display, 2 decimals
            ha = 'left',   # horizontal alignment
            va = 'center')  # vertical alignment
Run Code Online (Sandbox Code Playgroud)