2015-07-22 60 views
4

我需要繪製很多行,並且我想在計算它們時顯示它們。代碼看起來像這樣:動態重疊顯示

x = arange(100000) 
for y in range(100000): 
    ax.plot(x*y) 
    draw() 

現在,正如你可以想象的,這個速度非常快。我想我可以做的是繪圖,將繪圖保存到緩衝區,清除繪圖,放下緩衝區作爲背景,然後繪製下一行。這樣,我不會得到如此多的Line2D對象。有沒有人有任何想法?

回答

4

看來你需要matplotlib.animation功能。 animation examples

編輯:添加了我自己的版本更簡單的示例代碼。

import random 
from matplotlib import pyplot as plt 
from matplotlib import animation 

def data_generator(t): 
    if t<100: 
     return random.sample(range(100), 20) 

def init(): 
    return plt.plot() 

def animate(i): 
    data = data_generator(i) 
    return plt.plot(data, c='k') 

fig = plt.figure() 
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=1000, interval=1000, blit=True) 
plt.show() 

EDIT2:多行實時更新的版本。

import random 
from matplotlib import pyplot as plt 
from matplotlib import animation 

def data_generator_1(t): 
    if t<100: 
     x1.append(t) 
     y1.append(random.randint(1, 100)) 

def data_generator_2(t): 
    if t<100: 
     x2.append(t) 
     y2.append(random.randint(1, 100)) 

def init(): 
    global x1 
    global y1 
    x1 = [] 
    y1 = [] 

    global x2 
    global y2 
    x2 = [] 
    y2 = [] 

    l1, l2 = plt.plot(x1, y1, x2, y2) 
    return l1, l2 

def animate(i): 
    data_generator_1(i) 
    data_generator_2(i) 
    l1, l2 = plt.plot(x1, y1, x2, y2) 
    plt.setp(l1, ls='--', c='k') 
    plt.setp(l2, c='gray') 
    return l1, l2 

fig = plt.figure() 
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=1000, interval=1000, blit=True) 
plt.show() 

enter image description here

我敢肯定,有策劃這種動畫沒有全局變量的方法很多。這只是快速試用,向你展示你想要什麼的可能性。

我不知道你的第一個評論認爲ipython/vanilla腳本問題。所有示例都在普通編輯器(而不是ipython)上編碼。也許有matplotlib版本的差異。

+0

有什麼奇怪的是,這個運行完全按照我希望它在IPython的筆記本,而不是從命令行的腳本文件運行。不幸的是,我需要後者。 – BossColo

+0

我還從數據生成器接收需要繪製的兩個數據產品。我大概可以自己弄清楚,但如果您有任何見解,我將不勝感激! – BossColo

+0

對我的第一條評論的澄清:第一條線繪製在圖上,但後面的每個繪圖都會在下一個繪圖之前清除。 – BossColo

0

或者,如果您使用的是筆記本的IPython,您可以使用IPython的顯示功能:

from IPython import display 
import matplotlib.pyplot as plt 
import numpy as np 
%matplotlib 

x = np.arange(100) 

for y in np.arange(100): 
    fig, ax = plt.subplots(1,1, figsize=(6,6)) 
    ax.plot(x * y) 
    ax.set_ylim(0, 10000) # to keep the axes always the same 
    display.clear_output(wait=True) 
    display.display(fig) 
    plt.close() 

如果你想在任何時候說,10日線在同一時間畫了一個,你可以這樣做:

x = np.arange(100) 
fig, ax = plt.subplots(1,1, figsize=(6,6)) 
for y in np.arange(100):   
    ax.plot(x*y) 
    ax.set_ylim(0,10000) 
    display.clear_output(wait=True) 
    display.display(fig) 
    if y > 10:   # from the 10th iteration, 
     ax.lines.pop(0) # remove the first line, then the 2nd, etc.. 
         # but it will always be in position `0` 
plt.close() 

HTH