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

