Matplotlib动画散点图python。逐渐改变点的颜色

时间:2017-02-28 07:59:11

标签: python-2.7 animation matplotlib

我是matplotlib动画的新手,我正试图为散点图设置动画,其中向右移动的点将逐渐变为红色,而向左移动的点将逐渐变为蓝色。代码不能完美地工作,因为它不会逐渐改变点的颜色。当我暂停动画并使其最大化时,突然出现颜色的逐渐变化,当我播放它时,它又是一样的。 Here是动画链接。最终的图像应该是这样的: Final static image after animation 但是动画并没有像你在视频中看到的那样显示颜色的逐渐变化。

以下是代码,我非常感谢您的帮助。感谢

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()

1 个答案:

答案 0 :(得分:0)

您遇到的问题是每次迭代都会重绘散点图,将颜色重新归一化为c的最小值和最大值。所以即使在开始时,也会有一个点与色彩图中的最小和最大颜色相对应。

解决方案是使用从一开始就绝对的颜色标准化。最简单的方法是使用vminvmax关键字参数。

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

(这意味着c=-1.5的值是colormap中的最低颜色,c=2对应最高颜色。)

现在找到合适的值可能有点困难,因为值在无限循环中不断变化,因此您需要根据用例自行找出适当的值。