具有新f-字符串格式样式的Matplotlib条形图标签

人气:1,164 发布:2022-10-16 标签: python matplotlib bar-chart

问题描述

自matplotlib 3.4.0起,Axes.bar_label方法允许为条形图添加标签。

但是,标签格式选项适用于旧样式格式,例如fmt='%g'

如何才能使其与新的样式格式一起工作,从而允许我执行百分比、千位分隔符等操作:'{:,.2f}', '{:.2%}', ...

我首先想到的是以某种方式从ax.containers中获取初始标签,然后重新格式化它们,但它还需要适用于不同的条形图结构、不同格式的分组条形图等。

推荐答案

如何使用百分比、千位分隔符等新样式格式?

使用新的bar_label方法,使用labels参数。使用所需的f字符串设置条形容器的datavalues的格式,并将其设置为labels

例如:

千位分隔符f字符串

bars = plt.bar(list('ABC'), [12344.56, 23456.78, 34567.89])

plt.bar_label(bars, labels=[f'${x:,.2f}' for x in bars.datavalues])

f字符串百分比

bars = plt.bar(list('ABC'), [0.123456, 0.567890, 0.789012])

plt.bar_label(bars, labels=[f'{x:.2%}' for x in bars.datavalues])

堆叠百分比f字符串

x = list('ABC')
y = [0.7654, 0.6543, 0.5432]

fig, ax = plt.subplots()
ax.bar(x, y)
ax.bar(x, 1 - np.array(y), bottom=y)

# now 2 bar containers: white labels for blue bars, black labels for orange bars
colors = list('wk')
for bars, color in zip(ax.containers, colors):
    labels = [f'{x:.1%}' for x in bars.datavalues]
    ax.bar_label(bars, labels=labels, color=color, label_type='center')

897