大家都知道,从展示效果来说:
视频>图>文字。
如果想要在工作汇报时,把你的数据秀的飞起,那你可以试试用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]
主要参数:
以最常用的正态分布为例,下面我们绘制一个正态分布曲线,并模拟正态分布随参数μ和σ变化的动画。
正态分布的概率密度函数如下:
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
参数μ是随机变量的数学期望,决定了正态分布的位置。我们可以绘制正态分布随μ变化动画:
上图的绘制代码:
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)
https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.animation.FuncAnimation.html ↩︎
https://matplotlib.org/3.3.0/gallery/animation/simple_anim.html#sphx-glr-gallery-animation-simple-anim-py ↩︎