2016-09-23 72 views
0

我想用matplotlib的動畫模塊做一個實時分散樣的情節,但我是一個相當新手。我的目標是每當我收到我想要繪製的數據時更新繪圖,以便在接收到任何時間數據時,先前的點消失,並繪製新的繪圖。分散更新動畫

我的程序可以這樣寫,如果我取代數據用無限循環和隨機生成的數據接收:

fig = plt.figure() 
skyplot = fig.add_subplot(111, projection='polar') 
skyplot.set_ylim(90) # sets radius of the circle to maximum elevation 
skyplot.set_theta_zero_location("N") # sets 0(deg) to North 
skyplot.set_theta_direction(-1) # sets plot clockwise 
skyplot.set_yticks(range(0, 90, 30)) # sets 3 concentric circles 
skyplot.set_yticklabels(map(str, range(90, 0, -30))) # reverse labels 
plt.ion() 

while(1): 

    azimuths = random.sample(range(360), 8) 
    elevations = random.sample(range(90), 8) 
    colors = numpy.random.rand(3,1) 

    sat_plot = satellite() 
    ani= animation.FuncAnimation(fig, sat_plot.update, azimuths, elevations, colors) 

class satellite: 

    def __init__(self): 
     self.azimuths = [] 
     self.elevations = [] 
     self.colors = [] 
     self.scatter = plt.scatter(self.azimuths, self.elevations, self.colors) 

    def update(self, azimuth, elevation, colors): 
     self.azimuths = azimuth 
     self.elevations = elevation 
     return self.scatter 

現在,我得到了以下錯誤:

> Traceback (most recent call last): 
    File "./skyplot.py", line 138, in <module> 
    ani= animation.FuncAnimation(fig, sat_plot.update, azimuths, elevations, colors) 
    File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 442, in __init__ 
    TimedAnimation.__init__(self, fig, **kwargs) 
    File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 304, in __init__ 
    Animation.__init__(self, fig, event_source=event_source, *args, **kwargs) 
    File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 53, in __init__ 
    self._init_draw() 
    File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 469, in _init_draw 
    self._drawn_artists = self._init_func() 
TypeError: 'list' object is not callable 

誰能告訴我我做錯了什麼,我該怎麼做?

在此先感謝

+0

我不確定你是否正確使用'FuncAnimation'?它不應該被稱爲像'FuncAnimation(fig,sat_plot.update,fargs =(方位角,高程,顏色))' –

回答

0

我認爲你不需要動畫。您需要一個簡單的無限循環(例如,while),並在線程中繪圖更新。我可以這樣建議:​​

import threading,time 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
data = np.random.uniform(0, 1, (5, 3)) 
plt.scatter(data[:, 0], data[:,1],data[:, 2]*50) 

def getDataAndUpdate(): 
    while True: 
     """update data and redraw function""" 
     new_data = np.random.uniform(0, 1, (5, 3)) 
     time.sleep(1) 
     plt.clf() 
     plt.scatter(new_data[:, 0], new_data[:, 1], new_data[:, 2] * 50) 
     plt.draw() 

t = threading.Thread(target=getDataAndUpdate) 
t.start() 
plt.show() 

結果是一個帶有散點圖的動畫式圖。

+0

感謝您的答案,但我想避免使用畫布。你知道我該怎麼做? – paulzaba

+0

雖然我不明白你爲什麼不想使用畫布,但有一個'plt.clf()'和'plt.draw()'的解決方案。請看看新的代碼。 –