问题描述
自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')