2017-02-28 331 views
1

我是matplotlib動畫的新手,我正在試圖爲散點圖創建動畫,點向右移動時會逐漸變紅,而向左移動的點會逐漸變爲藍色。代碼不能完美工作,因爲它不會逐漸改變點的顏色。當我暫停動畫並使其最大化時,顏色的逐漸變化突然出現,當我播放它時,它也是一樣的。 Here是動畫鏈接。最終的圖像應該是這樣的: Final static image after animation 但是,動畫並未顯示顏色逐漸變化,因爲您可以在視頻中看到。Matplotlib動畫散點圖python。逐漸改變點的顏色

這是代碼,我非常感謝你的幫助。由於

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對應於最高。)

現在它可能有點難以找到適當的值,作爲值在一個無限循環中不斷變化,所以你需要根據用例自己找出合適的值。