2013-05-28 58 views
3

我有一個關於從matplotlib動態更新散點圖的問題。 我有以下的類在Python實時動態繪圖

''' PolygonHandler.py - Python source for polygon handling ''' 
import numpy as np 
import matplotlib.pyplot as plt 


class PolygonHandler: 
    # Constructor 
    def __init__(self): 
     self.X = [] 
     self.Y = [] 
     self.numberPoints = 0 

    # Print the polygon 
    def draw(self): 
     plt.scatter(self.X,self.Y) 
     plt.draw() 

    def update(self): 
     for i in range(1,self.numberPoints): 
      self.X[i] += np.random.normal()*0.01 
      self.Y[i] += np.random.normal()*0.01 


    # append a point 
    def add(self,x,y): 
     self.numberPoints += 1 
     self.X.append(x) 
     self.Y.append(y) 

這個類是在接收信息,並添加指向PolygonHandler類實時循環使用。現在一個例子的目的,我想設計下面的循環

P = PolygonHandler() 
P.add(1,1) 
P.add(2,2) 
P.add(1,2) 
plt.ion() 
plt.show() 
while (True): 
    P.draw() 
    P.update() 

我怎麼能告訴解釋畫出散點圖,一旦更新完成後,除去前點?現在,我的情節繪製點和他們以前的位置。

文森特

非常感謝您的幫助

PS:一個其他的問題我已經是由matplotlib凍結打開,當我點擊它便會立即停止接聽(例如到窗口移動到我屏幕上的另一個地方),有沒有辦法來防止這種情況?

+0

爲什麼需要*更新*你的情節,當你不想老點?難道你不能只關閉舊的情節,只是繪製新的數據? – Schorsch

+1

Thx爲您的答案!實際上,我正在將這段代碼用於實時運行的C++應用程序中:不幸的是,關閉和重新打開太慢 – Vincent

回答

1

在這裏,您有一條路,使用matplotlib動畫。

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

class PolygonHandler: 
    # Constructor 
    def __init__(self): 
     self.X = [] 
     self.Y = [] 
     self.numberPoints = 0 
     self.fig , ax = plt.subplots() 
     self.sc = ax.scatter(self.X,self.Y) 
     ax.set_xlim(0,3) 
     ax.set_ylim(0,3) 

    # Print the polygon 
    def update(self,_): 
     for i in range(self.numberPoints): 
      self.X[i] += np.random.normal()*0.01 
      self.Y[i] += np.random.normal()*0.01 
     self.sc.set_offsets(np.column_stack((self.X,self.Y))) 
     return self.sc, 

    # append a point 
    def add(self,x,y): 
     self.numberPoints += 1 
     self.X.append(x) 
     self.Y.append(y) 

而且這樣你繪製你的3個隨機漫步:

P = PolygonHandler() 
P.add(1,1) 
P.add(2,2) 
P.add(1,2) 
ani = animation.FuncAnimation(P.fig, P.update, interval=10,blit=False) 

的關鍵因素是方法set_offsets(),是替代散點圖的數據。然後這樣的分散對象由update()返回,以便matplotlib知道它必須被更新。對於由類處理matplotlib動畫的另一個源,請參見this matplotlib示例。

在最後一行blit = True時,動畫速度更快,但取決於您的操作系統,它可能無法正常工作。