You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Matplotlib文本框格式问题:标签左对齐数值右对齐

解决Matplotlib文本框内数值对齐的问题

嘿,我完全懂你这个痛点——手动凑空格、调制表符在非等宽字体下根本不靠谱对吧?其实用Python的字符串格式化功能就能轻松搞定这个对齐问题,不用再跟空格较劲啦。

核心思路

我们可以给数值部分指定固定宽度并设置右对齐,或者给标签(Mean:/Stdev:)设置固定宽度左对齐,这样两行的数值就能精准对齐。这里推荐用f-string格式化,简洁又直观。

修改后的完整代码

import numpy as np
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [4, 7, 9, 10, 13]
fig, ax = plt.subplots()
ax.plot(x, y,)

# 计算均值和标准差,保留两位小数
std = round(np.std(y), 2)
mean = round(np.mean(y), 2)

# 使用f-string格式化,让数值部分右对齐并占用固定宽度
text_content = (
    f"Mean:  {mean:>5.2f} $\AA$\n"
    f"Stdev: {std:>5.2f} $\AA$"
)

# 添加文本框
plt.gcf().text(
    0.14, 0.07, 
    text_content, 
    fontsize=20, 
    bbox=dict(facecolor='none', edgecolor='black', pad=10)
)

plt.subplots_adjust(bottom=0.3)
plt.show()

关键修改点解释

  1. f-string对齐语法{mean:>5.2f}里的>5表示把数值右对齐,且占用至少5个字符宽度;.2f确保数值保留两位小数,和你原本的需求一致。
  2. 标签补位Mean:后面加两个空格,Stdev:后面加一个空格,是因为Stdev:Mean:多一个字符,这样标签部分的总长度一致,配合数值的右对齐,就能实现你想要的效果:
    Mean:  8.60 Å
    Stdev: 3.01 Å
    
    要是想更严谨,也可以给标签设置固定宽度,比如f"{label:<6}{value:>5.2f} $\AA$",其中<6表示标签左对齐占6个字符,不管标签长度差异,都会自动补空格对齐。

为什么之前的方法无效?

  • 手动加空格/制表符:Matplotlib默认用的是非等宽字体(比如DejaVu Sans),不同字符宽度不一样,靠空格数量自然没法对齐。
  • .rjust()方法:你之前没成功是因为没把标签和数值的布局结合起来单独处理数值部分,用格式化字符串能一次性搞定整个文本的对齐逻辑。

内容的提问来源于stack exchange,提问作者David Schroeder

火山引擎 最新活动