Python:matplotlib - 循环、清除和显示同一图形上的不同图形

4 人关注

我想用一个循环看看一个图在不同的数值下是如何变化的。我想在同一幅图上看到它。但我不希望在图中保留以前的图。在MATLAB中,这可以通过创建一个图并在同一图上绘制来实现。循环结束后关闭它。

Like,

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()最终显示它们。但我想刷新该图。

1 个评论
python
matlab
matplotlib
plot
johananj
johananj
发布于 2017-07-18
2 个回答
ImportanceOfBeingErnest
ImportanceOfBeingErnest
发布于 2017-07-18
已采纳
0 人赞同

在matplotlib中,基本上有两种不同的方式来创建动画

interactive mode

使用 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()

FuncAnimation

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()