Python 在使用sahex属性对另一个matplotlib轴进行缩放时,是否更新多个matplotlib轴?

Python 在使用sahex属性对另一个matplotlib轴进行缩放时,是否更新多个matplotlib轴?,python,events,matplotlib,updates,Python,Events,Matplotlib,Updates,我想画四条曲线,左边两条时间曲线,右边两条基于时间曲线的FFT。 例如: import matplotlib.pyplot as plt import numpy as np from scipy import signal Fs=1024 t=np.arange(0,10,1/Fs) F=np.arange(0,10,1/Fs) x = np.sin(2 * 3.1416 * F *t ) plt.figure() ax1 = plt.subplot(221) plt.plot(t,x)

我想画四条曲线,左边两条时间曲线,右边两条基于时间曲线的FFT。 例如:

import matplotlib.pyplot as plt
import numpy as np
from scipy import signal


Fs=1024
t=np.arange(0,10,1/Fs)
F=np.arange(0,10,1/Fs)
x = np.sin(2 * 3.1416 * F *t )

plt.figure()
ax1 = plt.subplot(221)
plt.plot(t,x)
ax2 = plt.subplot(222)
f, Pxx_den = signal.periodogram(x, Fs)
line1, = plt.plot(f[:np.where(f>50)[0][0]],Pxx_den[:np.where(f>50)[0][0]] )

ax3 = plt.subplot(223, sharex=ax1)
plt.plot(t,x)
ax4 = plt.subplot(224)
f, Pxx_den = signal.periodogram(x, Fs)
line1, = plt.plot(f[:np.where(f>50)[0][0]],Pxx_den[:np.where(f>50)[0][0]] )


def on_xlims_change1(axes):
    lim = axes.get_xlim()
    f, Pxx_den = signal.periodogram(x[np.bitwise_and(t >lim[0] , t <lim[1])], Fs)
    ax2.clear()
    ax2.plot(f[:np.where(f>50)[0][0]],Pxx_den[:np.where(f>50)[0][0]] )

def on_xlims_change2(axes):
    lim = axes.get_xlim()
    f, Pxx_den = signal.periodogram(x[np.bitwise_and(t >lim[0] , t <lim[1])], Fs)
    ax4.clear()
    ax4.plot(f[:np.where(f>50)[0][0]],Pxx_den[:np.where(f>50)[0][0]] )

ax1.callbacks.connect('xlim_changed', on_xlims_change1)
ax3.callbacks.connect('xlim_changed', on_xlims_change2)


plt.show()
导入matplotlib.pyplot作为plt
将numpy作为np导入
从scipy输入信号
Fs=1024
t=np.arange(0,10,1/Fs)
F=np.arange(0,10,1/Fs)
x=np.sin(2*3.1416*F*t)
plt.图()
ax1=plt.子批次(221)
plt.绘图(t,x)
ax2=plt.子批次(222)
f、 Pxx_den=信号周期图(x,Fs)
第1行,=plt.绘图(f[:np.其中(f>50)[0][0]],Pxx_den[:np.其中(f>50)[0][0]])
ax3=plt.子批(223,sharex=ax1)
plt.绘图(t,x)
ax4=plt.子批次(224)
f、 Pxx_den=信号周期图(x,Fs)
第1行,=plt.绘图(f[:np.其中(f>50)[0][0]],Pxx_den[:np.其中(f>50)[0][0]])
更改1(轴)上的def:
lim=axes.get_xlim()
f、 Pxx_den=信号周期图(x[np.按位_和(t>lim[0],t50)[0][0]),Pxx_den[:np.其中(f>50)[0][0])
更改2(轴)上的def:
lim=axes.get_xlim()
f、 Pxx_den=信号周期图(x[np.按位_和(t>lim[0],t50)[0][0]),Pxx_den[:np.其中(f>50)[0][0])
ax1.callbacks.connect('xlims\u changed',on\u xlims\u change1)
ax3.callbacks.connect('xlims\u changed',on\u xlims\u change2)
plt.show()
我所寻求的是一种在修改
ax1
ax3
x轴时更新
ax2
ax4
的方法。每次修改
ax1
ax3
x轴时,我只想在显示的曲线范围内计算FFT。
所以我几乎完成了这部分。但是,因为
ax1
ax3
共享x轴。我原以为两个FFT图应该更新,但他们没有

因此,当我放大一个时间轴时,只有直接到右侧的FFT被更新,而不是全部更新。
我不知道哪里缺少了什么?

回调只针对外部限制实际发生变化的轴触发。您可以只使用一个函数同时更新两个绘图

def onlimschange(ax):
    on_xlims_change1(ax)
    on_xlims_change2(ax)

def on_xlims_change1(axes):
    lim = axes.get_xlim()
    f, Pxx_den = signal.periodogram(x[np.bitwise_and(t >lim[0] , t <lim[1])], Fs)
    ax2.clear()
    ax2.plot(f[:np.where(f>50)[0][0]],Pxx_den[:np.where(f>50)[0][0]] )

def on_xlims_change2(axes):
    lim = axes.get_xlim()
    f, Pxx_den = signal.periodogram(x[np.bitwise_and(t >lim[0] , t <lim[1])], Fs)
    ax4.clear()
    ax4.plot(f[:np.where(f>50)[0][0]],Pxx_den[:np.where(f>50)[0][0]] )

ax1.callbacks.connect('xlim_changed', onlimschange)
ax3.callbacks.connect('xlim_changed', onlimschange)

回调仅针对外部限制实际更改的轴触发。您可以只使用一个函数同时更新两个绘图

def onlimschange(ax):
    on_xlims_change1(ax)
    on_xlims_change2(ax)

def on_xlims_change1(axes):
    lim = axes.get_xlim()
    f, Pxx_den = signal.periodogram(x[np.bitwise_and(t >lim[0] , t <lim[1])], Fs)
    ax2.clear()
    ax2.plot(f[:np.where(f>50)[0][0]],Pxx_den[:np.where(f>50)[0][0]] )

def on_xlims_change2(axes):
    lim = axes.get_xlim()
    f, Pxx_den = signal.periodogram(x[np.bitwise_and(t >lim[0] , t <lim[1])], Fs)
    ax4.clear()
    ax4.plot(f[:np.where(f>50)[0][0]],Pxx_den[:np.where(f>50)[0][0]] )

ax1.callbacks.connect('xlim_changed', onlimschange)
ax3.callbacks.connect('xlim_changed', onlimschange)

我编辑了这篇文章,因为它不同于重复的文章。我想你的意思是,这篇文章不同于链接的重复文章,因为你现在编辑了它,而不是反过来编辑了它。;-)在这种情况下,最好通知关闭问题的人(使用@符号),否则它将不会重新打开。我编辑了该帖子,因为它不同于重复的帖子。我想你的意思是,该帖子现在不同于链接的重复帖子,因为你编辑了它,而不是相反的方式。;-)在这种情况下,最好通知关闭问题的人(使用@符号),否则问题将不会被重新打开。是的,这将起作用。但在我的完整代码中,sharedx是由用户完成的,然后可能会随着时间的推移而改变。在您提出的解决方案中,即使没有必要,也会再次执行每个FFT。我想知道是否可以在
onlimschange
功能中进行测试,以了解哪些轴的X轴发生了变化?如果没有,我将使用此解决方案。谢谢。我添加了另一个解决方案。看看这是否是你想要的。很好。谢谢。是的,那会有用的。但在我的完整代码中,sharedx是由用户完成的,然后可能会随着时间的推移而改变。在您提出的解决方案中,即使没有必要,也会再次执行每个FFT。我想知道是否可以在
onlimschange
功能中进行测试,以了解哪些轴的X轴发生了变化?如果没有,我将使用此解决方案。谢谢。我添加了另一个解决方案。看看这是否是你想要的。很好。非常感谢。