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

