分散更新动画

问题描述:

我想用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 =(方位角,高程,颜色))' –

我认为你不需要动画。您需要一个简单的无限循环(例如,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()'的解决方案。请看看新的代码。 –