2017-02-28 21 views
1

私はmatplotlibアニメーションが初めてで、右に移動する点が徐々に赤に変わり、左に移動する点は徐々に青に変わる散布図をアニメーション化しようとしています。点の色を徐々に変えないので、コードは完全には機能しません。アニメーションを一時停止して最大化すると、徐々に色が変化していきます。再生すると同じ色になります。 Hereはアニメーションリンクです。最終的な画像は次のようなものになるはずです: Final static image after animation しかし、ビデオで見られるように、アニメーションは色が徐々に変化するわけではありません。Matplotlibアニメーション散布図。徐々に点の色を変更

ここにコードがありますが、本当にありがとうございます。おかげ

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
import numpy as np 
import pandas as pd 
class AnimatedScatter(object): 
    """An animated scatter plot using matplotlib.animations.FuncAnimation.""" 
    def __init__(self, numpoints=5): 
     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=500, 
              init_func=self.setup_plot, blit=True,repeat=False) 

     self.fig.canvas.mpl_connect('button_press_event',self.onClick) 
     #self.ani.save("animation.mp4") 
    def setup_plot(self): 
     """Initial drawing of the scatter plot.""" 
     t=next(self.stream) 
     x, y, c = t[:,0],t[:,1],t[:,2] 
     self.scat = self.ax.scatter(x, y, c=c, s=50, animated=True) 
     self.ax.axis([-15, 15, -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): 
     #f=pd.read_csv("crc_viz.csv") 
     columns = ['TbyN','CbyS'] 
     #f=f[['TbyN','CbyS']] 
     index=range(1,self.numpoints+1) 
     x=10*(np.ones((self.numpoints,1))-2*np.random.random((self.numpoints,1))) 
     y = 5*(np.ones((self.numpoints,1))-2*np.random.random((self.numpoints,1))) 
     f=np.column_stack((x,y)) 
     f=pd.DataFrame(f,columns=columns) 
     print f 
     f['new_cbys'] = f['CbyS'] 
     f['new_cbys'][f['new_cbys']<0] = -1 
     f['new_cbys'][f['new_cbys']>0] = 1 
     f=f[:self.numpoints] 
     cbys=np.array(list(f['CbyS'])) 
     sign = np.array(list(f['new_cbys'])) 
     x = np.array([0]*self.numpoints) 
     y = np.array(f['TbyN']) 
     c = np.array([0.5]*self.numpoints) 
     t = [(255,0,0) for i in range(self.numpoints)] 
     data=np.column_stack((x,y,c)) 

     x = data[:, 0] 
     c = data[:,2] 
     while True: 
      #print xy 
      #print cbys 
      if not pause: 

       for i in range(len(x)): 
        if sign[i]==1: 
         if x[i]<cbys[i]-0.1: 
          x[i]+=0.1 

          c[i]+=0.05 
         else: 
          x[i]=cbys[i] 
        elif sign[i]==-1: 
         if x[i]>cbys[i]+0.1: 
          x[i]-=0.1 
          c[i]-=0.05 
         else: 
          x[i]=cbys[i] 
       print c 

       #print data 
       #print c 
      yield data 
    def onClick(self,event): 
     global pause 
     pause ^=True 
    def update(self, i): 
     """Update the scatter plot.""" 
     data = next(self.stream) 
     print data[:,2] 
     # Set x and y data... 
     self.scat.set_offsets(data[:, :2]) 
     # Set colors.. 
     self.scat.set_array(data[:,2]) 


     return self.scat, 
    def save(self): 
     plt.rcParams['animation.ffmpeg_path'] = 'C:\\ffmpeg\\bin\\ffmpeg.exe' 
     self.mywriter = animation.FFMpegWriter() 
     self.ani.save("myMovie.mp4",writer=self.mywriter) 
     self.show() 
    def show(self): 
     #mng = plt.get_current_fig_manager() 
     #mng.window.state('zoomed') 
     plt.show() 


pause = False 
if __name__ == '__main__': 
    a = AnimatedScatter(10) 
    a.show() 
    #a.save() 

答えて

0

は、あなたが持っている問題は、散布図がcの最小と最大値に色を再正規化、反復ごとに再描画されていることです。だから開始時でさえすでにカラーマップの極小色に対応する点があります。

解決策は、最初から絶対的な色の正規化を使用することです。これを行う最も簡単な方法は、vminvmaxのキーワード引数を使用することです。

ax.scatter(x, y, c=c, vmin=-1.5, vmax=2) 

(これはc=-1.5の値がカラーマップの最も低い色であり、c=2が最高に対応することを意味する。)

今では値として、適切な値を見つけるために、少し難しいかもしれ無限ループで絶えず変化しているので、ユースケースに応じて適切な値を見つけ出す必要があります。