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

Matplotlib多子图场景下实现文本自动定位至四个角落

解决Matplotlib多子图场景下的四角文本定位问题

要在多子图的figure四个角落放置文本,且确保文本位于所有其他绘图元素(除自身外)的外侧,核心是基于整个figure的坐标系定位文本,并让保存时的布局计算包含这些文本。以下是可行方案:

实现代码

import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 3)
ax[0, 0].scatter([1, 2, 3], [4, 5, 6])
# 模拟长标签/标题,测试边界适配
ax[0, 0].set_ylabel("1\n2\n3\n4\n5\n6\n7")
ax[0, 0].set_title("a\nb\nc\nd\ne\nf")

# 在figure四个角落添加文本,使用figure坐标系
txt_top_left = fig.text(0, 1, "ABCD", ha='left', va='top', color='red')
txt_top_right = fig.text(1, 1, "EFGH", ha='right', va='top', color='blue')
txt_bottom_left = fig.text(0, 0, "IJKL", ha='left', va='bottom', color='green')
txt_bottom_right = fig.text(1, 0, "MNOP", ha='right', va='bottom', color='purple')

# 关键:将文本加入额外布局元素,避免保存时被裁剪
bbox_extra_artists = [txt_top_left, txt_top_right, txt_bottom_left, txt_bottom_right]

fig.patch.set_linewidth(5)
fig.patch.set_edgecolor("green")

plt.savefig(
    "test.png",
    dpi=900,
    bbox_inches="tight",
    edgecolor=fig.get_edgecolor(),
    bbox_extra_artists=bbox_extra_artists
)
plt.show()
plt.close()

关键说明

  • 使用fig.text()而非子图的annotate:直接基于整个figure的坐标系(默认使用fig.transFigure)定位,无需依赖子图元素的位置,避免子图布局变化导致定位失效。
  • 坐标与对齐设置:
    • 左上角:坐标(0,1),水平左对齐(ha='left')、垂直顶部对齐(va='top')
    • 右上角:坐标(1,1),水平右对齐(ha='right')、垂直顶部对齐(va='top')
    • 左下角:坐标(0,0),水平左对齐(ha='left')、垂直底部对齐(va='bottom')
    • 右下角:坐标(1,0),水平右对齐(ha='right')、垂直底部对齐(va='bottom')
  • bbox_extra_artists参数:告诉Matplotlib在计算bbox_inches='tight'的裁剪范围时,把这四个文本也纳入考量,确保文本不会被裁掉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:22:39