You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python绘图中让每组文本的指定单词对齐至相同坐标

解决Matplotlib分组文本单位对齐问题

针对你遇到的因字符宽度不一致导致单位(unit)无法精确对齐的问题,提供三种可靠解决方法:

方法一:使用等宽字体

直接将文本字体设置为等宽字体(如monospace),这类字体中每个字符宽度完全一致,通过补空格的方式就能实现精准对齐,无需额外计算。

修改代码中plt.text的参数,添加fontfamily='monospace':

plt.text(x_bar_poss[i][j], 0.75, plt_text, rotation=90, ha='center', va='bottom', fontfamily='monospace')

保留原有的空格补全逻辑,所有组的unit部分会自然对齐。

方法二:分块绘制文本(精确控制位置)

如果不想改变字体,可将文本拆分为四个部分分别绘制,通过计算每部分的宽度来固定unit的起始坐标,确保同一组内的unit完全对齐。

修改循环内的文本绘制逻辑:

# 拆分文本各部分
val_str = str(Inputs[i][j])
unit_str = units_ravel[i]
arrow_str = r"$\longmapsto$"
result_str = f'{area_ratio[i][j]:.5f}'

# 获取当前文本渲染器
renderer = fig.canvas.get_renderer()

# 预计算当前组最长value的宽度(仅在每组第一个元素时计算)
if j == 0:
    max_val_width = 0
    for val in Inputs[i]:
        temp_text = ax.text(0, 0, str(val), rotation=90)
        temp_bb = temp_text.get_window_extent(renderer=renderer)
        # 转换为数据坐标的宽度绝对值
        temp_width = abs(ax.transData.inverted().transform(temp_bb)[0][0])
        max_val_width = max(max_val_width, temp_width)
        temp_text.remove()
    # 设置unit的起始偏移(可根据需求调整额外间距)
    unit_x_offset = max_val_width + 0.05

# 分块绘制文本,控制对齐方式
ax.text(x_bar_poss[i][j], 0.75, val_str, rotation=90, ha='right', va='bottom')
ax.text(x_bar_poss[i][j] + unit_x_offset, 0.75, unit_str, rotation=90, ha='left', va='bottom')
ax.text(x_bar_poss[i][j] + unit_x_offset + 0.1, 0.75, arrow_str, rotation=90, ha='left', va='bottom')
ax.text(x_bar_poss[i][j] + unit_x_offset + 0.2, 0.75, result_str, rotation=90, ha='left', va='bottom')

这种方法通过精确计算文本宽度,手动控制每部分的位置,完全避免字体宽度差异的影响,对齐精度最高。

方法三:使用表格布局(可选)

如果文本结构规整,也可以用matplotlib的table组件来实现对齐,将每组文本放入表格单元格中,自动实现列对齐:

# 准备表格数据
table_data = []
for i, row in enumerate(area_ratio):
    for j, k in enumerate(row):
        table_data.append([str(Inputs[i][j]), units_ravel[i], r"$\longmapsto$", f'{area_ratio[i][j]:.5f}'])

# 创建表格,调整bbox参数控制位置和大小
table = ax.table(cellText=table_data, 
                 loc='bottom', 
                 cellLoc='center',
                 bbox=[0.1, -0.3, 0.8, 0.2])
table.auto_set_font_size(False)
table.set_fontsize(10)

这种方式适合文本较多且需要整体规整布局的场景,无需手动计算宽度。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:01:20