如何为散点图制作动画? [英] How to animate a scatter plot?
问题描述
我正在尝试制作散点图的动画,其中点的颜色和大小在动画的不同阶段会发生变化.对于数据,我有两个带有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
是x和y坐标的N x 2
形状数组.
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.性能会受到影响,但示例应在禁用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=xrange(numframes),
fargs=(color_data, scat))
plt.show()
def update_plot(i, data, scat):
scat.set_array(data[i])
return scat,
main()
这篇关于如何为散点图制作动画?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!