2012-02-22 13 views
34

私は、アニメーションの異なる段階でポイントの色とサイズが変化する散布図のアニメーションを作成しようとしています。散布図をアニメーション化する方法は?

data.shape = (ntime, npoint) 
x.shape = (npoint) 
y.shape = (npoint) 

は、今私はタイプ

pylab.scatter(x,y,c=data[i,:]) 

の散布図をプロットし、インデックスi上でアニメーションを作成したい:データのために私はx値とy値を持つ2つのnumpyのndarrayを持っています。これはどうすればいいですか?

答えて

64

新しいアニメーションモジュールを使った簡単な例です。

これは少し複雑ですが、これはあなたにファンシーなことをするためのフレームワークを与えるはずです。

OSXでOSXバックエンドを使用している場合は、下記のFuncAnimation初期化でblit=Trueからblit=Falseに変更する必要があります。 OSXバックエンドは、blittingを完全にサポートしていません。パフォーマンスは低下しますが、blittingを無効にしてOSX上で正しく動作させる必要があります。単純例えば

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

class AnimatedScatter(object): 
    """An animated scatter plot using matplotlib.animations.FuncAnimation.""" 
    def __init__(self, numpoints=50): 
     self.numpoints = numpoints 
     self.stream = self.data_stream() 

     # Setup the figure and axes... 
     self.fig, self.ax = plt.subplots() 
     # Then setup FuncAnimation. 
     self.ani = animation.FuncAnimation(self.fig, self.update, interval=5, 
              init_func=self.setup_plot, blit=True) 

    def setup_plot(self): 
     """Initial drawing of the scatter plot.""" 
     x, y, s, c = next(self.stream) 
     self.scat = self.ax.scatter(x, y, c=c, s=s, animated=True) 
     self.ax.axis([-10, 10, -10, 10]) 

     # For FuncAnimation's sake, we need to return the artist we'll be using 
     # Note that it expects a sequence of artists, thus the trailing comma. 
     return self.scat, 

    def data_stream(self): 
     """Generate a random walk (brownian motion). Data is scaled to produce 
     a soft "flickering" effect.""" 
     data = np.random.random((4, self.numpoints)) 
     xy = data[:2, :] 
     s, c = data[2:, :] 
     xy -= 0.5 
     xy *= 10 
     while True: 
      xy += 0.03 * (np.random.random((2, self.numpoints)) - 0.5) 
      s += 0.05 * (np.random.random(self.numpoints) - 0.5) 
      c += 0.02 * (np.random.random(self.numpoints) - 0.5) 
      yield data 

    def update(self, i): 
     """Update the scatter plot.""" 
     data = next(self.stream) 

     # Set x and y data... 
     self.scat.set_offsets(data[:2, :]) 
     # Set sizes... 
     self.scat._sizes = 300 * abs(data[2])**1.5 + 100 
     # Set colors.. 
     self.scat.set_array(data[3]) 

     # We need to return the updated artist for FuncAnimation to draw.. 
     # Note that it expects a sequence of artists, thus the trailing comma. 
     return self.scat, 

    def show(self): 
     plt.show() 

if __name__ == '__main__': 
    a = AnimatedScatter() 
    a.show() 

enter image description here

、以下を見てください:ここでは

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

def main(): 
    numframes = 100 
    numpoints = 10 
    color_data = np.random.random((numframes, numpoints)) 
    x, y, c = np.random.random((3, numpoints)) 

    fig = plt.figure() 
    scat = plt.scatter(x, y, c=c, s=100) 

    ani = animation.FuncAnimation(fig, update_plot, frames=xrange(numframes), 
            fargs=(color_data, scat)) 
    plt.show() 

def update_plot(i, data, scat): 
    scat.set_array(data[i]) 
    return scat, 

main() 
+0

こんにちはジョー私はあなたの最初の例を試してみたが、それは二番目のイエスのに対し、動作しません。多分私は最初のオプションをデバッグしようとします、これは私のpythonの知識を向上させるのに役立ちます。ありがとう –

+0

最初の例はEnthoughtディストリビューション(Win7、matplotlib 1.2.0、numpy 1.4)の下で完全に(resizeの処理を除いて)動作します。素晴らしいコード、ジョー!私は数時間それを見ることができます:-)。 – Dave

+1

残念ながら、最初の例は、OS Xのmatplotlib 1.3.1を使って私のために表示されません。フレームを置くと、ポイントは表示されません。 2番目の例は動作します。 – JoshAdel

3

事です。私はQtとMatlabのユーザーに慣れていましたが、私はmatplotlib上のアニメーションシステムに精通していません。

しかし、私はあなたがmatlabにあるように、どんな種類のアニメーションも作成できる方法を見つけました。それは本当に強力です。モジュール参照をチェックする必要はなく、必要なものをプロットするのは良いことです。だから私はそれが助けることを願っています

基本的な考え方は、PyQt内でタイムイベントを使用することです(私はwxPythonのようなPython上の他のGuiシステムとTraitUiが同じ応答メカニズムを持っていると確信しています。 PyQtのTimerイベントが呼び出されるたびに、キャンバス全体をリフレッシュしてピクチャ全体を再描画するので、速度とパフォーマンスにはゆっくりと影響が出るかもしれませんが、あまりそうはありません。ここで

はそれの少しの例である:

import sys 
from PyQt4 import QtGui 

from matplotlib.figure import Figure 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 

import numpy as np 


class Monitor(FigureCanvas): 
    def __init__(self): 
     self.fig = Figure() 
     self.ax = self.fig.add_subplot(111) 

     FigureCanvas.__init__(self, self.fig) 
     self.x = np.linspace(0,5*np.pi,400) 
     self.p = 0.0 
     self.y = np.sin(self.x+self.p) 


     self.line = self.ax.scatter(self.x,self.y) 

     self.fig.canvas.draw() 

     self.timer = self.startTimer(100) 


    def timerEvent(self, evt): 
     # update the height of the bars, one liner is easier 
     self.p += 0.1 
     self.y = np.sin(self.x+self.p) 
     self.ax.cla() 
     self.line = self.ax.scatter(self.x,self.y) 

     self.fig.canvas.draw() 



if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    w = Monitor() 
    w.setWindowTitle("Convergence") 
    w.show() 
    sys.exit(app.exec_()) 

あなたはアニメーションの散乱を使用したい私はちょうどあなたのようです

 self.timer = self.startTimer(100) 

でリフレッシュ速度を調整することができますソートアニメーションを作るためのプロット。しかし、私はちょうどいわゆる "セット"機能を見つけることができません。だから私はカンバ全体をリフレッシュした。

はそれがお役に立てば幸いです。..

+0

本当にいいです!しかし、私は 'self.startTimer'の値を調整することでリフレッシュレートを変更しませんでした...それについてのヒント? (ええ、私はそれがしばらくしていることを知っている...) –