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

Matplotlib中如何实现两个Figure联动缩放?双屏时序图协调咨询

当然可以搞定!Matplotlib有现成的办法让多个Figure之间的交互同步,刚好适配你这种每个图都是3个堆叠时序子图的需求——对了,你代码里写的fig,(ax0,ax1) = plt.subplots(3,1,sharex=True)应该是笔误吧?3行子图的话应该对应3个轴变量,比如(ax0, ax1, ax2),我后面的例子会按这个来写哈。

下面给你两种最实用的实现方案:

方法1:自定义事件回调(灵活可控)

这种方法通过绑定Matplotlib的xlim_changed事件,手动同步所有子图的x轴范围,好处是你可以完全自定义同步逻辑(比如只同步特定轴、或者同步y轴等等)。

示例代码

import matplotlib.pyplot as plt
import numpy as np

# 生成测试用的时序数据
t = np.linspace(0, 10, 100)
data1 = np.sin(t)
data2 = np.cos(t)
data3 = np.sin(t) + np.cos(t)

# 创建第一个Figure和3个堆叠子图(内部共享x轴)
fig1, (ax1_0, ax1_1, ax1_2) = plt.subplots(3, 1, sharex=True, figsize=(8, 6))
ax1_0.plot(t, data1)
ax1_1.plot(t, data2)
ax1_2.plot(t, data3)
fig1.suptitle("Figure 1: 堆叠时序图")

# 创建第二个Figure和3个堆叠子图(内部共享x轴)
fig2, (ax2_0, ax2_1, ax2_2) = plt.subplots(3, 1, sharex=True, figsize=(8, 6))
ax2_0.plot(t, data1 * 2)
ax2_1.plot(t, data2 * 2)
ax2_2.plot(t, data3 * 2)
fig2.suptitle("Figure 2: 堆叠时序图(缩放版)")

# 定义同步函数:当任意轴的x范围变化时,同步所有轴的x范围
def sync_x_axes(event):
    # 获取触发事件的轴的当前x范围
    current_xlim = event.axes.get_xlim()
    # 同步第一个Figure的所有子图x轴
    for ax in [ax1_0, ax1_1, ax1_2]:
        ax.set_xlim(current_xlim, auto=False)
    # 同步第二个Figure的所有子图x轴
    for ax in [ax2_0, ax2_1, ax2_2]:
        ax.set_xlim(current_xlim, auto=False)
    # 刷新两个图的显示
    fig1.canvas.draw()
    fig2.canvas.draw()

# 给所有子图绑定x轴范围变化的事件
for ax in [ax1_0, ax1_1, ax1_2, ax2_0, ax2_1, ax2_2]:
    ax.callbacks.connect('xlim_changed', sync_x_axes)

plt.show()

效果说明

不管你缩放、平移哪个Figure里的任意子图,两个Figure的所有子图都会自动同步x轴的显示范围,完美实现交互协调。

方法2:利用Matplotlib内置的共享轴机制(简洁高效)

Matplotlib的共享轴系统支持跨Figure共享,只需要把所有需要同步的轴加入同一个共享组即可,代码更简洁,不需要手动写事件逻辑。

示例代码

import matplotlib.pyplot as plt
import numpy as np

# 生成测试数据
t = np.linspace(0, 10, 100)
data1 = np.sin(t)
data2 = np.cos(t)
data3 = np.sin(t) + np.cos(t)

# 创建第一个Figure的堆叠子图(内部共享x轴)
fig1, (ax1_0, ax1_1, ax1_2) = plt.subplots(3, 1, sharex=True, figsize=(8, 6))
ax1_0.plot(t, data1)
ax1_1.plot(t, data2)
ax1_2.plot(t, data3)
fig1.suptitle("Figure 1")

# 创建第二个Figure的堆叠子图(先不内部共享,后面统一加入共享组)
fig2, (ax2_0, ax2_1, ax2_2) = plt.subplots(3, 1, figsize=(8, 6))
ax2_0.plot(t, data1 * 2)
ax2_1.plot(t, data2 * 2)
ax2_2.plot(t, data3 * 2)
fig2.suptitle("Figure 2")

# 获取第一个轴的x轴共享组,把所有其他轴加入这个组
shared_x_group = ax1_0.get_shared_x_axes()
for ax in [ax1_1, ax1_2, ax2_0, ax2_1, ax2_2]:
    shared_x_group.join(ax1_0, ax)

plt.show()

效果说明

这种方法和第一种效果完全一样,但代码更短,利用Matplotlib原生的共享机制自动处理同步,适合不需要自定义逻辑的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:47:53