Matplotlib subfigure功能:能否在子图间绘制连线?connection patch无效
在Matplotlib的subfigure之间绘制连线的可行方法
因为subfigure是独立的子figure结构,原本针对subplot设计的ConnectionPatch无法直接跨subfigure工作,核心解决思路是将两个subfigure内的目标点坐标转换到主figure的统一坐标系,再在主figure层面绘制连线。
具体实现步骤及代码示例
import matplotlib.pyplot as plt from matplotlib.lines import Line2D # 创建主figure和两个并排的subfigure fig = plt.figure(constrained_layout=True) sf_left = fig.subfigure(1, 2, 0) sf_right = fig.subfigure(1, 2, 1) # 左侧subfigure:绘制内容并标记要连线的点 ax_left = sf_left.subplots() ax_left.plot([1, 2, 3], [4, 5, 6], 'ro') # 将数据坐标转换为主figure的像素坐标 point_left_pixel = ax_left.transData.transform((2, 5)) # 右侧subfigure:绘制内容并标记要连线的点 ax_right = sf_right.subplots() ax_right.plot([1, 2, 3], [6, 5, 4], 'bo') # 将数据坐标转换为主figure的像素坐标 point_right_pixel = ax_right.transData.transform((2, 5)) # 将像素坐标转换为主figure的归一化坐标(范围0-1,对应figure的宽高) point_left_fig = fig.transFigure.inverted().transform(point_left_pixel) point_right_fig = fig.transFigure.inverted().transform(point_right_pixel) # 在主figure层面添加跨subfigure的连线 connect_line = Line2D( [point_left_fig[0], point_right_fig[0]], [point_left_fig[1], point_right_fig[1]], color='darkgray', linestyle='--', linewidth=1.5, transform=fig.transFigure ) fig.add_artist(connect_line) plt.show()
关键原理说明
- 坐标转换逻辑:先通过
ax.transData.transform()把subfigure轴内的数据坐标转成主figure的像素坐标,再用fig.transFigure.inverted().transform()把像素坐标转成主figure的归一化坐标(不受figure尺寸缩放影响)。 - 直接在主figure添加连线:通过
fig.add_artist()把连线添加到主figure层级,这样就能跨两个独立的subfigure显示。
注意事项
- 建议开启
constrained_layout=True(或提前用tight_layout()固定布局),避免布局变动导致坐标转换失效。 - 如果需要绘制带箭头的连线,可以把
Line2D换成FancyArrowPatch,同样基于主figure的归一化坐标创建即可。
内容的提问来源于stack exchange,提问作者Luke Bhan
相关产品推荐
相关产品推荐

