Python 在使用sahex属性对另一个matplotlib轴进行缩放时,是否更新多个matplotlib轴?
我想画四条曲线,左边两条时间曲线,右边两条基于时间曲线的FFT。 例如: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)
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轴发生了变化?如果没有,我将使用此解决方案。谢谢。我添加了另一个解决方案。看看这是否是你想要的。很好。非常感谢。