Matplotlib绘图基础之动画绘制详解
作者:databook
matplotlib
的动画一直是一个强大但使用频率不高的功能,究其原因,一方面展示动画需要一定的媒介,没有图形和文字展示方便;二来大家更关心的是分析结果的最终图表,图表的动态展示则没有那么重要。
不过,随着短视频的兴起,在短视频平台上展示动画变得非常容易,所以,我们发现有越来越多的数据分析动画(比如各种横向条形图的排名等等)出现在了短视频平台上。
通过动画来展示数据和模型的变化过程,可使数据的可视化更加生动形象,随着各种平台的兴起,matplotlib
的动画功能也因此有了更多的用武之地。
1. 动画示例
介绍matplotlib
的动画功能之前,先看用matplotlib
制作的两个简单的的动画示例。
1.1. 单个动画
首先是单个动画,绘制一个正弦曲线。
import numpy as np import matplotlib import matplotlib.pyplot as plt import matplotlib.animation as animation x = np.linspace(-8, 8, 100) y = np.sin(x) fig, ax = plt.subplots() (g,) = ax.plot(x, y) def update(frame): y = np.sin(x[:frame]) g.set_data(x[:frame], y) animation.FuncAnimation(fig, update, interval=50, frames=len(x))
1.2. 组合动画
除了单个动画之外,组合动画也简单,下面的示例中,先绘制一个正弦曲线,然后一个点沿着曲线运动,随着这个点,绘制正弦曲线的切线。
x = np.linspace(-8, 8, 100) f = lambda x: np.sin(x / 2) fig, ax = plt.subplots() fig.set_size_inches(8, 4) ax.plot(x, f(x), 'lightblue') (point,) = ax.plot(x[0], f(x[0]), "r", alpha=0.4, marker="o") (line,) = ax.plot([0], [0], "g", linewidth=3) #绘制切线 def tangent_line(x0, y0): h = 1e-4 num_min = f(x0 - h) num_max = f(x0 + h) k = (num_max - num_min) / (2 * h) xs = np.linspace(x0 - 0.5, x0 + 0.5, 100) ys = y0 + k * (xs - x0) return xs, ys #移动切点 def move_point(frame): point.set_data([x[frame]], [f(x[frame])]) xs, ys = tangent_line(x[frame], f(x[frame])) line.set_data(xs, ys) animation.FuncAnimation(fig, move_point, interval=50, frames=len(x))
2. 动画函数
matplotlib
的动画函数主要有两种,它们的动画原理差别很大,了解它们之间的区别,才能根据自己的场景选择合适的动画函数。
2.1. FuncAnimation
上一节的示例中使用的就是FuncAnimation
,它的动画原理是通过回调函数,不断重绘图形,已达到动画的效果。
主要的参数有:
- 画布:比如上面第一个示例中的
fig
- 回调函数:比如上面第一个示例中的
update
- 调用回调函数的间隔:比如上面第一个示例中的
interval=50
,单位是毫秒 - 调用回调函数的次数:比如上面第一个示例中的
frames=len(x)
简单来说,也就是FuncAnimation
函数每隔interval
毫秒,调用一次update
,一共调用frames
次。
2.2. ArtistAnimation
ArtistAnimation
函数的原理则是先准备好每一帧的数据,然后绘制按照一定的时间间隔,绘制每一帧数据对应的图像。
比如上面的示例一样的正弦曲线,用ArtistAnimation
函数绘制的话:
points = np.linspace(-8, 8, 100) fig, ax = plt.subplots() frames = [] for i in range(50): x = points[:i] y = np.sin(x) g = ax.plot(x, y) frames.append(g) animation.ArtistAnimation(fig, frames, interval=50)
ArtistAnimation
的主要参数:
- 画布:比如上面示例中的
fig
- 每一帧的数据:比如上面示例中的
frames
- 每一帧的间隔:比如上面示例中的
interval=50
,单位是毫秒
ArtistAnimation
没有回调函数,只要准备好每一帧的数据,它会按照时间间隔绘制每一帧的数据。
3. 动画导出
最后,是动画的导出,常用的两种格式是MP4
和GIF
。
如果安装了 ffmpeg
,那么导出这两种格式就很简单了。
3.1. 导出mp4
#前面部分省略。。。 anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x)) anim.save("./output.mp4", writer='ffmpeg')
导出的文件名后缀 mp4
,则可以导出视频。
这里的writer
参数用ffmpeg
。
3.2. 导出GIF
同样,导出gif
也一样,文件名的后缀 gif
即可。
#前面部分省略。。。 anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x)) anim.save("./output.gif", writer='ffmpeg')
当然,也可以不用ffmpeg
,比如,如果安装了imagemagick
,这里的writer
也可以用imagemagick
。
#前面部分省略。。。 anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x)) anim.save("./output.gif", writer='imagemagick')
以上就是Matplotlib绘图基础之动画绘制详解的详细内容,更多关于Matplotlib动画的资料请关注脚本之家其它相关文章!