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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:31:35