如何在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
相关产品推荐
相关产品推荐

