如何动画散点图 [英] How to animate a scatter plot

查看:29
本文介绍了如何动画散点图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to do an animation of a scatter plot where colors and size of the points changes at different stage of the animation. For data I have two numpy ndarray with an x value and y value:

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

现在我想绘制一个散点图

Now I want to plot a scatter plot of the type

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

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

and create an animation over the index i. How do I do this?

推荐答案

假设你有一个散点图,scat = ax.scatter(...),那么你可以

Suppose you have a scatter plot, scat = ax.scatter(...), then you can

  • 改变位置

      scat.set_offsets(array)

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

where array is a N x 2 shaped array of x and y coordinates.

  • 改变尺寸

      scat.set_sizes(array)

其中 array 是以点为单位的一维数组.

where array is a 1D array of sizes in points.

  • 改变颜色

      scat.set_array(array)

其中 array 是将被颜色映射的值的一维数组.

where array is a 1D array of values which will be colormapped.

这是一个使用动画模块的简单示例.
它比实际需要的稍微复杂一些,但这应该为您提供一个框架来做更有趣的事情.

Here's a quick example using the animation module.
It's slightly more complex than it has to be, but this should give you a framework to do fancier things.

(代码于 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 后端,则需要将 FuncAnimation 中的 blit=True 更改为 blit=False代码> 初始化如下.OSX 后端不完全支持块传输.性能会受到影响,但该示例应该可以在禁用 blitting 的 OSX 上正确运行.

If you're on OSX and using the OSX backend, you'll need to change blit=True to blit=False in the FuncAnimation initialization below. The OSX backend doesn't fully support blitting. The performance will suffer, but the example should run correctly on OSX with blitting disabled.

对于一个简单的例子,它只是更新颜色,看看以下内容:

For a simpler example, which just updates the colors, have a look at the following:

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=range(numframes),
                                  fargs=(color_data, scat))
    plt.show()

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

main()

这篇关于如何动画散点图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆