Python-如何为散点图制作动画?

发布于 2021-02-02 23:14:10

我正在尝试制作散点图的动画,其中点的颜色和大小在动画的不同阶段会发生变化。对于数据,我有两个带有x值和y值的numpy ndarray:

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

现在我想绘制一个散点图

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

并在索引上创建动画i。我该怎么做呢?

关注者
0
被浏览
96
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    假设有一个散点图scat = ax.scatter(…),则可以

    改变立场

    scat.set_offsets(array)
    

    其中array是N x 2x和y坐标的形状数组。

    改变大小

    scat.set_sizes(array)
    

    其中array是以点为单位的一维尺寸数组。

    改变颜色

    scat.set_array(array)
    

    其中array是一维值数组,将对其进行颜色映射。

    这是一个使用animation模块的简单示例。
    它比必须的要复杂一些,但是这应该为您提供一个做奇特的事情的框架。

    (代码编辑于2019年4月以与当前版本兼容。有关旧代码,请参阅修订历史记录)

    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).T
        self.scat = self.ax.scatter(x, y, c=c, s=s, vmin=0, vmax=1,
                                    cmap="jet", edgecolor="k")
        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."""
        xy = (np.random.random((self.numpoints, 2))-0.5)*10
        s, c = np.random.random((self.numpoints, 2)).T
        while True:
            xy += 0.03 * (np.random.random((self.numpoints, 2)) - 0.5)
            s += 0.05 * (np.random.random(self.numpoints) - 0.5)
            c += 0.02 * (np.random.random(self.numpoints) - 0.5)
            yield np.c_[xy[:,0], xy[:,1], s, c]
    
    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.set_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,
    

    if name == ‘main’:
    a = AnimatedScatter()
    plt.show()
    在此处输入图片说明

    如果使用OSX并使用OSX后端,则需要在下面的初始化中将更改blit=True为。OSX后端不完全支持blitting。性能会受到影响,但是示例应在禁用blitting的情况下在OSX上正确运行。blit=FalseFuncAnimation

    对于一个仅更新颜色的简单示例,请看以下内容:

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看