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

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()

关键原理说明

  1. 坐标转换逻辑:先通过ax.transData.transform()把subfigure轴内的数据坐标转成主figure的像素坐标,再用fig.transFigure.inverted().transform()把像素坐标转成主figure的归一化坐标(不受figure尺寸缩放影响)。
  2. 直接在主figure添加连线:通过fig.add_artist()把连线添加到主figure层级,这样就能跨两个独立的subfigure显示。

注意事项

  • 建议开启constrained_layout=True(或提前用tight_layout()固定布局),避免布局变动导致坐标转换失效。
  • 如果需要绘制带箭头的连线,可以把Line2D换成FancyArrowPatch,同样基于主figure的归一化坐标创建即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:30:17