【Matplotlib】matplotlib.animation.FuncAnimation绘制动态图、交互式绘图汇总(附官方文档)

本文详细介绍了如何使用matplotlib创建各种动态图形和动画,包括sin函数曲线的动态绘制、点在曲线上的运动、单摆模拟以及滚动的球等实例。通过FuncAnimation函数,结合scipy的odeint函数解决微分方程问题,展示了动态条形图和折线图的生成。此外,还探讨了交互式绘图和混淆矩阵可视化的应用。

零、文中用到的相关知识:


  • 函数FuncAnimation
函数FuncAnimation(fig,func,frames,init_func,interval,blit)是绘制动图的主要函数,其参数如下:
    a.fig 绘制动图的画布名称`
    b.func自定义动画函数,即下边程序定义的函数update
    c.frames动画长度,一次循环包含的帧数,在函数运行时,其值会传递给函数update(n)的形参“n”
    d.init_func自定义开始帧,即传入刚定义的函数init,初始化函数
    e.interval更新频率,以ms计
    f.blit选择更新所有点,还是仅更新产生变化的点。应选择True,但mac用户请选择False,否则无法显
  • plt画布调整函数
# 调整画布里图像的位置
plt.subplots_adjust(top=0.88,
				bottom=0.11,
				left=0.11,
				right=0.9,
				hspace=0.2,
				wspace=0.2)
# 使图像在画布上尽可能大,贴着画布边缘
plt.tight_layout()
# 设置画布尺寸
plt.figure(figsize=(11, 5.6))

说在前面,本文介绍了matplotlib两种绘图方式
- plot.pause
- animation

一、以sin举例,motplotlib绘制动图

1、绘制sin函数

# # 在绘制动画前,我们需将其sin函数的背景绘制出来。

x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
# tight_layout 调整子图之间及其周围的填充。
fig = plt.figure(tight_layout=True)
plt.plot(x, y)
plt.grid(ls="--")
plt.savefig("sin_test1.png")
plt.show()

在这里插入图片描述


2、动态画出sin函数曲线

# 动态画出sin函数曲线
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# 生成子图,相当于fig = plt.figure(),ax = fig.add_subplot(),其中ax的函数参数表示把当前画布进行分割,
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], 'r-', animated=False)


def init():
    ax.set_xlim(0, 2 * np.pi)
    ax.set_ylim(-1, 1)
    # 返回曲线
    return ln,


def update(frame):
    # 将每次传过来的n追加到xdata中
    xdata.append(frame)
    ydata.append(np.sin(frame))
    # 重新设置曲线的值
    ln.set_data(xdata, ydata)
    return ln,

'''
函数FuncAnimation(fig,func,frames,init_func,interval,blit)是绘制动图的主要函数,其参数如下:
    a.fig 绘制动图的画布名称
    b.func自定义动画函数,即下边程序定义的函数update
    c.frames动画长度,一次循环包含的帧数,在函数运行时,其值会传递给函数update(n)的形参“n”
    d.init_func自定义开始帧,即传入刚定义的函数init,初始化函数
    e.interval更新频率,以ms计
    f.blit选择更新所有点,还是仅更新产生变化的点。应选择True,但mac用户请选择False,否则无法显
'''
ani = FuncAnimation(fig=fig, func=update, frames=np.linspace(0, 2 * np.pi, 128),
                    init_func=init, blit=True)

plt.show()

ani.save('sin_test1.gif', writer='imagemagick', fps=100)

在这里插入图片描述

3、点在曲线上运动

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation


# 首先定义了一个update_points函数,用于更新绘制的图中的数据点。此函数的输入参数num代表当前动画的第几帧,
# 函数的返回,即为我们需要更新的对象,需要特别注意的是:reuturn point_ani,这个逗号一定加上,否则动画不能
# 正常显示。当然这里面操作的点对象point_ani我们一般会提前声明得到:point_ani, = plt.plot(x[0], y[0], "ro")。
# 接下来就是将此函数传入我们的FuncAnimation函数中,函数的参数说明可以参见官网,这里简要说明用到的几个参数。
# 第1个参数fig:即为我们的绘图对象.
# 第2个参数update_points:更新动画的函数.
# 第3个参数np.arrange(0, 100):动画帧数,这需要是一个可迭代的对象。
# interval参数:动画的时间间隔。
# blit参数:是否开启某种动画的渲染。

def update_points(num):
    '''
    更新数据点
    '''
    point_ani.set_data(x[num], y[num])
    return point_ani,


x = np.linspace
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值