Python:matplotlib - 循环,清除并在同一图上显示不同的图

时间:2017-07-18 04:31:25

标签: python matlab matplotlib plot

我想看一个情节如何使用循环来改变不同的值。我希望在同一个情节中看到它。但我不想遗留下图中的前一个情节。在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()显示它们。但我想刷新情节。

2 个答案:

答案 0 :(得分:2)

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

FuncAnimation

Matplotlib提供了animation submodule,简化了动画制作过程,并且可以轻松保存动画。与上面相同,使用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()

enter image description here

答案 1 :(得分:0)

如果在循环内调用plt.show(),只要关闭包含该图的窗口,就会看到循环中每个元素的图。该过程将绘制第一个元素,然后如果关闭窗口,您将看到循环中第二个元素的图,等等