我正在尝试制作散点图的动画,其中点的颜色和大小在动画的不同阶段会发生变化。对于数据,我有两个带有x值和y值的numpy ndarray:
data.shape = (ntime, npoint) x.shape = (npoint) y.shape = (npoint)
现在我想绘制一个散点图
pylab.scatter(x,y,c=data[i,:])
并在索引上创建动画i。我该怎么做呢?
i
假设有一个散点图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()