大家都知道,从展示效果来说:
视频>图>文字。
如果想要在工作汇报时,把你的数据秀的飞起,那你可以试试用python做动画。
核心函数
用python绘制动画会用到matplotlib库的这个函数1:
matplotlib.animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)[source]
主要参数:
- fig: 用于获取绘制、调整大小以及任何其他所需事件的图形对象。
- func: 每帧调用的函数,第一个参数将是frames 中的下一个值。
- frames: 传递func和动画每一帧的数据源,可以是迭代器,整数,生成器函数,或无。
- fargs: 传递给func(frame, *fargs)的附加参数
- interval: 帧之间的延迟(以毫秒为单位)。默认为 200。
- repeat: 可选,控制当帧序列完成时动画是否应该重复。
- blit: 可选,控制是否使用 blitting 来优化绘图。
示例
以最常用的正态分布为例,下面我们绘制一个正态分布曲线,并模拟正态分布随参数μ和σ变化的动画。
正态分布的概率密度函数如下:
f
(
x
∣
μ
,
σ
)
=
1
2
π
σ
2
e
−
(
x
−
μ
)
2
2
σ
2
f(x|\mu,\sigma)=\frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}
f(x∣μ,σ)=2πσ21e−2σ2(x−μ)2
参数μ是随机变量的数学期望,决定了正态分布的位置。我们可以绘制正态分布随μ变化动画:
- 从动图中也可以看出来,随着μ的增长,正态分布在x轴上向右平移。
上图的绘制代码:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import math
%matplotlib qt5 # 在jupyter notebook中显示用
# 均值
mu = 0
# 标准差
sigma = 1
# x的值域范围
x = np.linspace(mu - 4*sigma, mu + 12*sigma, 100)
# 正态分布的概率密度函数
y = np.exp(-(x - mu) ** 2 / (2 * sigma ** 2)) / (math.sqrt(2*math.pi)*sigma)
fig, ax = plt.subplots()
line, = ax.plot(x, y)
def animate_mu(i):
mu = i%10
# 更新数据
line.set_ydata(np.exp(-(x-mu) ** 2 / (2 * sigma ** 2)) / (math.sqrt(2*math.pi)*sigma))
# 更新标题
ax.set_title(f"mu={mu}")
return line,
ani = animation.FuncAnimation(
fig, animate_mu, interval=500, repeat=True, blit=True)
# 保存动图
ani.save("demo_mu.gif")
我们还可以模拟正态分布随着参数σ变化。参数σ是随机变量的标准差,决定了正态分布的幅度:
-
从动图可以看出,随着标准差σ的减小,曲线会变得更陡峭,代表随机事件分布越集中。
-
随着标准差σ的增大,则曲线变得更加平缓,代表随机事件分布越分散。
上图的绘制代码:
# 均值
mu = 0
# 标准差
sigma = 1
# x的值域范围
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
# 正态分布的概率密度函数
y = np.exp(-(x - mu) ** 2 / (2 * sigma ** 2)) / (math.sqrt(2*math.pi)*sigma)
fig, ax = plt.subplots()
line, = ax.plot(x, y)
def animate_sigma(i):
sigma = i%10/10
line.set_ydata(np.exp(-(x-mu) ** 2 / (2 * sigma ** 2)) / (math.sqrt(2*math.pi)*sigma)) # update the data.
ax.set_title(f"sigma={sigma}")
return line,
ani = animation.FuncAnimation(
fig, animate_sigma, interval=500, repeat=True, blit=True)
# 保存动图
ani.save("demo_sigma.gif")
# 显示动图
plt.show()
注意:如果你是在jupyter notebook中绘制,需要加上这句%matplotlib qt5才能显示动画效果。
动画的保存方式2:
# 保存动图:
ani.save("demo.gif")
# 保存视频方式一:
ani.save("movie.mp4")
# 保存视频方式二:
writer = animation.FFMpegWriter(
fps=15, metadata=dict(artist='Me'), bitrate=1800)
ani.save("movie.mp4", writer=writer)