ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【matplotlib基础】--动画 [打印本页]

作者: 羊蹓狼    时间: 2023-9-27 18:46
标题: 【matplotlib基础】--动画
matplotlib的动画一直是一个强大但使用频率不高的功能,究其原因,
一方面展示动画需要一定的媒介,没有图形和文字展示方便;
二来大家更关心的是分析结果的最终图表,图表的动态展示则没有那么重要。
不过,随着短视频的兴起,在短视频平台上展示动画变得非常容易,
所以,我们发现有越来越多的数据分析动画(比如各种横向条形图的排名等等)出现在了短视频平台上。
通过动画来展示数据和模型的变化过程,可使数据的可视化更加生动形象,
随着各种平台的兴起,matplotlib的动画功能也因此有了更多的用武之地。
1. 动画示例

介绍matplotlib的动画功能之前,先看用matplotlib制作的两个简单的的动画示例。
1.1. 单个动画

首先是单个动画,绘制一个正弦曲线。
  1. import numpy as np
  2. import matplotlib
  3. import matplotlib.pyplot as plt
  4. import matplotlib.animation as animation
  5. x = np.linspace(-8, 8, 100)
  6. y = np.sin(x)
  7. fig, ax = plt.subplots()
  8. (g,) = ax.plot(x, y)
  9. def update(frame):
  10.     y = np.sin(x[:frame])
  11.     g.set_data(x[:frame], y)
  12. animation.FuncAnimation(fig, update, interval=50, frames=len(x))
复制代码

1.2. 组合动画

除了单个动画之外,组合动画也简单,下面的示例中,
先绘制一个正弦曲线,然后一个点沿着曲线运动,随着这个点,绘制正弦曲线的切线。
  1. x = np.linspace(-8, 8, 100)
  2. f = lambda x: np.sin(x / 2)
  3. fig, ax = plt.subplots()
  4. fig.set_size_inches(8, 4)
  5. ax.plot(x, f(x), 'lightblue')
  6. (point,) = ax.plot(x[0], f(x[0]), "r", alpha=0.4, marker="o")
  7. (line,) = ax.plot([0], [0], "g", linewidth=3)
  8. #绘制切线
  9. def tangent_line(x0, y0):
  10.     h = 1e-4
  11.     num_min = f(x0 - h)
  12.     num_max = f(x0 + h)
  13.     k = (num_max - num_min) / (2 * h)
  14.     xs = np.linspace(x0 - 0.5, x0 + 0.5, 100)
  15.     ys = y0 + k * (xs - x0)
  16.     return xs, ys
  17. #移动切点
  18. def move_point(frame):
  19.     point.set_data([x[frame]], [f(x[frame])])
  20.     xs, ys = tangent_line(x[frame], f(x[frame]))
  21.     line.set_data(xs, ys)
  22. animation.FuncAnimation(fig, move_point, interval=50, frames=len(x))
复制代码

2. 动画函数

matplotlib的动画函数主要有两种,它们的动画原理差别很大,
了解它们之间的区别,才能根据自己的场景选择合适的动画函数。
2.1. FuncAnimation

上一节的示例中使用的就是FuncAnimation,它的动画原理是通过回调函数,不断重绘图形,已达到动画的效果。
主要的参数有:
简单来说,也就是FuncAnimation函数每隔interval毫秒,调用一次update,一共调用frames次。``
2.2. ArtistAnimation

ArtistAnimation函数的原理则是先准备好每一帧的数据,然后绘制按照一定的时间间隔,
绘制每一帧数据对应的图像。
比如上面的示例一样的正弦曲线,用ArtistAnimation函数绘制的话:
  1. points = np.linspace(-8, 8, 100)
  2. fig, ax = plt.subplots()
  3. frames = []
  4. for i in range(50):
  5.     x = points[:i]
  6.     y = np.sin(x)
  7.     g = ax.plot(x, y)
  8.     frames.append(g)
  9. animation.ArtistAnimation(fig, frames, interval=50)
复制代码

ArtistAnimation的主要参数:
ArtistAnimation没有回调函数,只要准备好每一帧的数据,它会按照时间间隔绘制每一帧的数据。
3. 动画导出

最后,是动画的导出,常用的两种格式是MP4和GIF。
如果安装了 ffmpeg,那么导出这两种格式就很简单了。
3.1. 导出mp4
  1. #前面部分省略。。。
  2. anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x))
  3. anim.save("./output.mp4", writer='ffmpeg')
复制代码
导出的文件名后缀 mp4,则可以导出视频。
这里的writer参数用ffmpeg。
3.2. 导出GIF

同样,导出gif也一样,文件名的后缀 gif即可。
  1. #前面部分省略。。。
  2. anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x))
  3. anim.save("./output.gif", writer='ffmpeg')
复制代码
当然,也可以不用ffmpeg,比如,如果安装了imagemagick,这里的writer也可以用imagemagick。
  1. #前面部分省略。。。
  2. anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x))
  3. anim.save("./output.gif", writer='imagemagick')
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4