如何在Matplotlib中使文本与Y轴标签对齐?
在Matplotlib子图中对齐"a)""b)""c)"文本与Y轴标签的解决方案
由于子图Y轴刻度标签长度不同,轴原点到Y轴标签的间距会动态变化,试错法定位文本效率低下,直接获取Y轴标签位置也无法直接用于对齐。以下是两种无需试错的精准对齐实现方法:
方法一:基于图坐标系的全局对齐
通过获取Y轴标签在图坐标系中的位置,统一控制文本的水平偏移,确保所有子图的标注与Y轴标签垂直对齐。
import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 1, 0.01) y = np.sin(x) fig, axs = plt.subplots(1, 3, figsize=(6, 4)) axs[0].plot(x, y) axs[1].plot(x, y*0.1) axs[2].plot(x, y*0.02) # 配置子图样式 for ax in axs: ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_ylabel('Sine') ax.set_xlabel('x') plt.tight_layout() # 必须先绘制画布,才能获取tight_layout后的准确布局位置 fig.canvas.draw() abc = 'abc' for idx, ax in enumerate(axs): y_label = ax.get_yaxis().get_label() # 将标签位置转换为图坐标系(0-1范围) label_display_pos = y_label.get_transform().transform(y_label.get_position()) fig_pos = fig.transFigure.inverted().transform(label_display_pos) # 在Y轴标签左侧放置标注,垂直居中对齐 ax.text(fig_pos[0] - 0.05, fig_pos[1], f'{abc[idx]})', transform=fig.transFigure, va='center') plt.show()
关键说明
fig.canvas.draw()是核心步骤:tight_layout的布局计算在绘制阶段完成,只有绘制后才能获取标签的准确位置。- 转换为图坐标系后,所有子图的标注位置基于全局画布比例,能自动适配不同子图的Y轴标签偏移。
方法二:基于轴坐标系的局部对齐
通过获取Y轴标签的窗口范围,转换为对应子图的轴坐标系,在轴内实现标注与标签的对齐。
import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 1, 0.01) y = np.sin(x) fig, axs = plt.subplots(1, 3, figsize=(6, 4)) axs[0].plot(x, y) axs[1].plot(x, y*0.1) axs[2].plot(x, y*0.02) # 配置子图样式 for ax in axs: ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.set_ylabel('Sine') ax.set_xlabel('x') plt.tight_layout() fig.canvas.draw() abc = 'abc' for idx, ax in enumerate(axs): y_label = ax.get_yaxis().get_label() # 获取标签的窗口范围 label_bbox = y_label.get_window_extent() # 转换为当前轴的坐标系 ax_pos = ax.transAxes.inverted().transform(label_bbox.get_points()[0]) # 在标签左侧放置标注,垂直居中对齐Y轴 ax.text(ax_pos[0] - 0.1, 0.5, f'{abc[idx]})', transform=ax.transAxes, va='center') plt.show()
关键说明
- 利用
get_window_extent()获取标签的实际显示范围,转换为轴坐标系后,偏移量基于轴的宽度比例,适配不同子图的布局。
内容的提问来源于stack exchange,提问作者user198811
相关产品推荐
相关产品推荐

