我想使用循环查看绘图如何随着不同的值而变化。我想在同一个情节上看到它。但我不想保留图中先前的情节。在 MATLAB 中,这可以通过创建图形并在同一图形上绘图来实现。循环结束时关闭它。
喜欢,
fh = figure();
%for loop here
%do something with x and y
subplot(211), plot(x);
subplot(212), plot(y);
pause(1)
%loop done
close(fh);
我无法在 matplotlib 中找到与此等效的内容。通常所有的问题都与在同一个图上绘制不同的系列有关,这在 matplotlib 上似乎很自然,通过使用
plt.plot()
绘制几个系列,然后最终使用 plt.show()
显示它们。但是我想刷新剧情。
在 matplotlib 中创建动画基本上有两种不同的方法
使用
plt.ion()
打开更多交互。这将创建一个情节,即使 show
尚未被调用。可以通过调用plt.draw()
或动画plt.pause()
来更新情节。
import matplotlib.pyplot as plt
x = [1,1]
y = [1,2]
fig, (ax1,ax2) = plt.subplots(nrows=2, sharex=True, sharey=True)
line1, = ax1.plot(x)
line2, = ax2.plot(y)
ax1.set_xlim(-1,17)
ax1.set_ylim(-400,3000)
plt.ion()
for i in range(15):
x.append(x[-1]+x[-2])
line1.set_data(range(len(x)), x)
y.append(y[-1]+y[-2])
line2.set_data(range(len(y)), y)
plt.pause(0.1)
plt.ioff()
plt.show()
Matplotlib 提供了一个动画子模块,它简化了动画的创建并允许轻松保存它们。与上面相同,使用
FuncAnimation
看起来像:
import matplotlib.pyplot as plt
import matplotlib.animation
x = [1,1]
y = [1,2]
fig, (ax1,ax2) = plt.subplots(nrows=2, sharex=True, sharey=True)
line1, = ax1.plot(x)
line2, = ax2.plot(y)
ax1.set_xlim(-1,18)
ax1.set_ylim(-400,3000)
def update(i):
x.append(x[-1]+x[-2])
line1.set_data(range(len(x)), x)
y.append(y[-1]+y[-2])
line2.set_data(range(len(y)), y)
ani = matplotlib.animation.FuncAnimation(fig, update, frames=14, repeat=False)
plt.show()
使用变化的频率及其功率谱制作正弦波动画的示例如下:
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np
x = np.linspace(0,24*np.pi,512)
y = np.sin(x)
def fft(x):
fft = np.abs(np.fft.rfft(x))
return fft**2/(fft**2).max()
fig, (ax1,ax2) = plt.subplots(nrows=2)
line1, = ax1.plot(x,y)
line2, = ax2.plot(fft(y))
ax2.set_xlim(0,50)
ax2.set_ylim(0,1)
def update(i):
y = np.sin((i+1)/30.*x)
line1.set_data(x,y)
y2 = fft(y)
line2.set_data(range(len(y2)), y2)
ani = matplotlib.animation.FuncAnimation(fig, update, frames=60, repeat=True)
plt.show()
如果您在循环内调用
plt.show()
,只要关闭包含图形的窗口,您就会看到循环中每个元素的绘图。该过程将为第一个元素绘制,然后如果您关闭窗口,您将看到循环中第二个元素的绘制,等等