用python做GIF动画,让你的图表动起来!(以正态分布为例)

大家都知道,从展示效果来说:

视频>图>文字

如果想要在工作汇报时,把你的数据秀的飞起,那你可以试试用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πσ2 1e2σ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)

  1. https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.animation.FuncAnimation.html ↩︎

  2. https://matplotlib.org/3.3.0/gallery/animation/simple_anim.html#sphx-glr-gallery-animation-simple-anim-py ↩︎

你可能感兴趣的:(机器学习中的数学知识,python编程笔记,模型评估&可视化,python,数据分析,数据可视化,可视化,概率论)