具有新的f字符串格式样式的Matplotlib条形标注

oyjwcjzk  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(171)

从matplotlib 3.4.0开始,Axes.bar_label方法允许标记条形图。
但是,标注格式选项适用于旧样式格式,例如fmt='%g'
我怎样才能使它与新的样式格式,将允许我做的事情,如百分比,千位分隔符等:'{:,.2f}', '{:.2%}', ...
我想到的第一件事是从ax.containers中取出初始标签,然后重新格式化它们,但它还需要适用于不同的条形结构、不同格式的分组条形等。

wpx232ag

wpx232ag1#

如何使bar_label处理新样式的格式,如百分比、千位分隔符等?

      • 自matplotlib 3.7起**

fmt参数现在直接支持基于{}的格式字符串,例如:

# >= 3.7
plt.bar_label(bars, fmt='{:,.2f}')
#                       ^no f here (not an actual f-string)
      • matplotlib 3.7之前的版本**

fmt参数不支持基于{}的格式字符串,因此使用labels参数。使用f字符串格式化bar容器的datavalues,并将其设置为labels,例如:

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

示例:

      • 千位分隔符标签**

一个二个一个一个

      • 标签百分比**
bars = plt.bar(list('ABC'), [0.123456, 0.567890, 0.789012])

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

      • 堆叠百分比标签**
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')

# >= 3.7
for bars, color in zip(ax.containers, colors):
    ax.bar_label(bars, fmt='{:.1%}', color=color, label_type='center')
# < 3.7
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')

相关问题