
在 Plotly 的 make_subplots 中,可通过 matches 参数精准控制哪些子图共享 X 轴——无需全局启用 shared_xaxes,即可让前两行数据图同步缩放与范围,同时保持第三行图像子图完全独立。
在 plotly 的 `make_subplots` 中,可通过 `matches` 参数精准控制哪些子图共享 x 轴——无需全局启用 `shared_xaxes`,即可让前两行数据图同步缩放与范围,同时保持第三行图像子图完全独立。
当使用 make_subplots(rows=3, cols=1) 构建包含数据曲线与图像的混合布局时,常需前两行(如折线图、双 Y 轴图)共用同一 X 轴逻辑(例如时间/索引对齐),而最后一行图像子图(type="image")应保持独立坐标系统(因其 X/Y 通常代表像素位置,不参与数值联动)。此时,禁用全局 shared_xaxes=True 是关键——否则图像子图的 X 轴也会被强制绑定,导致缩放异常或布局错乱。
正确做法是:显式指定轴匹配关系。Plotly 中 matches='x' 表示“与第一行的 x 轴(即 xaxis)同步”,而 matches='x2' 表示“与第二行的 x 轴(即 xaxis2)同步”。由于 make_subplots 默认为每行创建独立 X 轴(xaxis, xaxis2, xaxis3),我们只需让第二行 X 轴匹配第一行即可:
fig = make_subplots(
rows=3, cols=1,
vertical_spacing=0.05,
specs=[
[{"secondary_y": False}], # row 1: 普通数据图
[{"secondary_y": True}], # row 2: 双Y轴数据图
[{"secondary_y": False, "type": "image"}] # row 3: 图像,不参与共享
],
subplot_titles=(plot_title_1stsubplot, plot_title_2ndsubplot),
row_heights=[0.7, 0.15, 0.15],
shared_xaxes=False # ⚠️ 必须设为 False,避免第三行被意外绑定
)
# ✅ 关键步骤:仅让第2行X轴匹配第1行(xaxis)
fig.update_xaxes(row=2, matches='x')
# 可选:统一设置X轴可见性与标题(增强一致性)
fig.update_xaxes(showticklabels=True, title_text="Time (s)", row=1)
fig.update_xaxes(showticklabels=True, title_text="", row=2) # 第二行隐藏标签,避免重复注意事项:
- matches 必须在 fig.update_xaxes() 中按 row= 显式调用,不能通过 specs 或初始化参数设置;
- 若后续添加第4行数据图并希望也共享该X轴,只需追加 fig.update_xaxes(row=4, matches='x');
- 图像子图(type="image")的 xaxis3 和 yaxis3 会自动忽略 matches 设置,但为保险起见,仍建议保持 shared_xaxes=False;
- 若需同步 Y 轴(如双数据图共用同一 Y 刻度),同理使用 fig.update_yaxes(row=N, matches='y')。
通过这种细粒度控制,你既能享受共享轴带来的交互一致性(如联动缩放、平移),又能严格隔离图像子图的坐标语义,实现专业级多模态可视化布局。

















