Matplotlib绘制动图

article/2025/8/29 3:27:39

简介

Matplotlib是非常著名的Python绘图库,支持非常复杂的底层定制化操作。本文通过Matplotlib中的动画绘制工具来讲解如何绘制动态图,首先讲解通过交互模式如何显示动态图,继而讲解通过两个动画类来实现动图地保存(GIF格式)。

显示动态图

首先,需要明确,Matplotlib绘图有两种显示模式,分别为阻塞模式交互模式,他们具体的说明如下。

  1. 阻塞模式,该模式下绘制地图地显示必须使用plt.show()进行展示(默认会弹出一个窗口),代码会运行到该行阻塞不继续执行,直到关闭这个展示(默认是关闭弹出的显示窗口,Pycharm等集成开发环境会自动捕获图片然后跳过阻塞)。
  2. 交互模式,该模式下任何绘图相关的操作如plt.plot()会立即显示绘制的图形然后迅速关闭,继续代码的运行,不发生阻塞。

默认情况下,Matplotlib使用阻塞模式,要想打开交互模式需要通过下面的几个函数来做操作,下面直接列出要用的核心函数。

plt.ion()  # 打开交互模式
plt.ioff()  # 关闭交互模式
plt.clf()  # 清除当前的Figure对象
plt.pause()  # 暂停GUI功能多少秒

然后就是要清楚,所谓的动图或者视频是怎么做到的,其实它们本质上就是很多静态图以较快的速度连续播放从而给人一种动感,利用Matplotlib绘制动图的原理也是一样的,遵循画布绘图->清理画布->画布绘图的循环就行了,不过这里注意,由于交互模式下绘图都是一闪而过,因此通过plt.pause(n)暂停GUI显示n秒才能得到连续有显示的图像

import matplotlib.pyplot as plt
import numpy as npdef io_test():fig = plt.figure()  # 生成画布plt.ion()  # 打开交互模式for index in range(50):fig.clf()  # 清空当前Figure对象fig.suptitle("3d io pic")# 生成数据point_count = 100  # 随机生成100个点x = np.random.random(point_count)y = np.random.random(point_count)z = np.random.random(point_count)color = np.random.random(point_count)scale = np.random.random(point_count) * 100ax = fig.add_subplot(111, projection="3d")# 绘图ax.scatter3D(x, y, z, s=scale, c=color, marker="o")ax.set_xlabel("X")ax.set_ylabel("Y")ax.set_zlabel("Z")# 暂停plt.pause(0.2)# 关闭交互模式plt.ioff()plt.show()if __name__ == '__main__':io_test()

上述代码演示了三维空间如何动态显示100个随机点的变化,使用录制软件得到的动图如下,其本质就是不停显示不同的图像而已。

在这里插入图片描述

动图保存

很多时候我们的需求并不是在窗口中动态显示图像,还需要保存到本地GIF图像,显然使用录制工具是一个比较低效的用法,Matplotlib的animation模块提供了两个动画绘制接口,分别是FuncAnimationArtistAnimation,它们都是继承自TimedAnimation的类,因而也具有Animation对象的通用方法,如Animation.save()Animation.to_html5_video()两个方法实例化一个Animation对象后均可调用,前者表示将动画保存为一个图像,后者表示将动画表示为一个HTML视频。

  • FuncAnimation: 通过反复调用同一更新函数来制作动画。
  • ArtistAnimation: 通过调用一个固定的Artist对象来制作动画,例如给定的图片序列或者Matplotlib的绘图对象。

下面给出上述两个类的构造函数所需参数,它们的主要参数也是类似的,都是一个Figure对象作为画布,然后一个对象作为更新的实现方式(前者需要一个反复绘图的更新函数,后者则为一个图像列表或者绘图对象列表)。

ani = animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)
ani = animation.ArtistAnimation(fig, artists, *args, **kwargs)

相比较而言,我更喜欢使用FuncAnimation,它的使用要求简洁且定制化程度较高。但是如果想将很多图片合并为一个动图,那么ArtistAnimation是最合适的选择。

下面的代码演示了如何保存一个动态变化渲染的柱状图,ArtistAnimation传入了一个图像序列,序列中每个元素为绘制的柱状图。然后通过使用Animationsave方法保存了动态图,**需要注意的是,这里有个动画写入器(writer)可以选择,默认不是pillow,我个人觉得pillow安装简单一些。

import matplotlib.pyplot as plt
import matplotlib.animation as animationfig, ax = plt.subplots()
x, y, tmp = [], [], []for i in range(10):x.append(i)y.append(i+1)temp = ax.bar(x, height=y, width=0.3)tmp.append(temp)ani = animation.ArtistAnimation(fig, tmp, interval=200, repeat_delay=1000)
ani.save("bar.gif", writer='pillow')

上面代码的执行结果如下图。

在这里插入图片描述

接着,演示使用范围更广的FuncAnimation如何使用。下面的代码中,动态展示了梯度下降在三维图上的优化过程,其中最为核心的代码如下。用于构造Animation对象的除了画布就是一个更新函数,在这个更新函数内部多次绘制散点图从而形成动态效果, frames是帧数,如果设置了这个帧数,那么update函数第一个参数必须有一个num占位,这个numAnimation对象维护,每次内部执行update会自动递增,后面的参数列表fargs只需要传入除了num后面的参数即可。

def update(num, x, y, z, ax):x, y, z = x[:num], y[:num], z[:num]ax.scatter3D(x, y, z, color='black', s=100)return axani = animation.FuncAnimation(fig, update, frames=25, fargs=(x_list, y_list, z_list, ax3d), interval=50, blit=False)

上面的代码演示效果如下图,完整的代码附在文末补充说明中。

在这里插入图片描述

补充说明

本文介绍了如何使用Matplotlib绘制动态图,主要通过交互模式和animation模块进行,如果觉得有所帮助,欢迎点赞。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animationdef GD(x0, y0, lr, epoch):f = lambda x, y: x ** 2 - y ** 2g_x = lambda x: 2 * xx, y = x0, y0x_list, y_list, z_list = [], [], []for i in range(epoch):x_list.append(x)y_list.append(y)z_list.append(f(x, y) * 1.01)grad_x, grad_y = g_x(x), g_x(y)x -= lr * grad_xy -= lr * grad_yprint("Epoch{}: grad={} {}, x={}".format(i, grad_x, grad_y, x))if abs(grad_x) < 1e-6 and abs(grad_y) < 1e-6:breakreturn x_list, y_list, z_listdef update(num, x, y, z, ax):x, y, z = x[:num], y[:num], z[:num]ax.scatter3D(x, y, z, color='black', s=100)return axdef draw_gd():fig = plt.figure()x, y = np.meshgrid(np.linspace(-3, 3, 1000), np.linspace(-3, 3, 1000))z = x ** 2 - y ** 2ax3d = plt.gca(projection='3d')ax3d.set_xlabel("X")ax3d.set_ylabel("Y")ax3d.set_zlabel("Z")plt.tick_params(labelsize=10)ax3d.plot_surface(x, y, z, cstride=20, rstride=20, cmap="jet")x_list, y_list, z_list = GD(-3, 0, 0.01, 100)x_list, y_list, z_list = np.array(x_list), np.array(y_list), np.array(z_list)ani = animation.FuncAnimation(fig, update, frames=25, fargs=(x_list, y_list, z_list, ax3d), interval=50, blit=False)ani.save('test.gif')if __name__ == '__main__':draw_gd()

http://chatgpt.dhexx.cn/article/bCu9bsjo.shtml

相关文章

python使用matplotlib绘图

文章目录 一、模块介绍二、模块安装三、主要API介绍设置绘图风格plt.style.use()新建画布plt.figure()绘制折线图plt.plot()绘制垂直柱状图plt.bar()绘制水平柱状图plt.barh()绘制饼状图plt.pie()绘制散点图plt.scatter()设置横纵坐标的标签plt.xlabel(), plt.ylabel()添加文字…

零基础学Python:Matplotlib用法

本文目录&#xff1a; 一、初识matplotlib二、线形图plot&#xff08;&#xff09;函数用法 三、散点图scatter()函数用法 四、饼状图pie&#xff08;&#xff09;函数用法 五、直方图hist()函数用法 前言&#xff1a; &#x1f4e2;&#x1f4e2;&#x1f4e2; &#x1f3c5;&…

Matplotlib库的介绍及使用

Matplotlib库的介绍及使用 1. pyplot子库的基本使用1.1 Matplotlib库的介绍1.2 plot函数1.3 pyplot的中文显示1.4 pyplot的文本显示 2. pyplot基础图表函数2.1 pyplot饼图的绘制2.2 pyplot直方图的绘制2.3 pyplot极坐标图的绘制2.4 pyplot散点图的绘制 1. pyplot子库的基本使用…

【Python数据分析】Matplotlib的初步认识

文章目录 1.什么是Matplotlib2.常见图形种类及意义1.折线图2.散点图3.柱状图4.直方图5.饼图 3.认识Matplotlib图像结构1.第一层2.第二层3.第三层 4.折线图初体验1.设置标题2.中文显示3.自定义X轴刻度4.一图多线5.一图多个坐标系子图 1.什么是Matplotlib Matplotlib是一个Pytho…

使用Matplotlib绘图

&#x1f935; Author &#xff1a;Horizon Max ✨ 编程技巧篇&#xff1a;各种操作小结 &#x1f387; 机器视觉篇&#xff1a;会变魔术 OpenCV &#x1f4a5; 深度学习篇&#xff1a;简单入门 PyTorch &#x1f3c6; 神经网络篇&#xff1a;经典网络模型 &#x1f4bb; …

Python -- Matplotlib库的使用

Matplotlib库的使用 要点&#xff1a;matplotlib是提供数据绘图功能的第三方库&#xff0c;其pyplot子库主要用于实现各种数据展示图形的绘制。 1. matplotlib.pyplot库概述 matplotlib.pyplot是matplotlib的子库&#xff0c;引用方式如下&#xff1a; >>>import ma…

Matplotlib库介绍

目录 一、Matplotlib库介绍 二、基本绘图流程 三、pyplot基础语法 1.创建画布与创建子图 2.添加画布内容 3.保存与展示图形 4.不同图表绘制函数 四、其它相关内容 1.线条颜色(color)的设置 2.线条标记(marker)的设置 3.线条类型(line)的设置 一、Matplotlib库介绍 …

Python Matplotlib库用法笔记

Python Matplotlib库用法笔记 一、了解Matplotlib库1 Matplotlib是什么2 Matplotlib的作用3利用Matplotlib做一个简单的画图3.1matplotlib.pyplot模块3.2画图 4 Matplotlib的三层结构4.1容器层4.2 辅助显示层4.3图像层 二、折线图1 折线图的绘制与显示1.1设置图形的风格 2 设置…

Python之数据可视化——matplotlib系统介绍(一)

matplotlib基础系统介绍 目录 1. Matplotlib概述 2. 讲解Matplotlib核心原理 3. Matplotlib相关基础操作介绍 3.1 创建figure(画布)的方式及完整绘图步骤3.2 线型设置3.3 中文与特殊符号(负号)相关支持设置3.4 图例和网络的设置3.5 坐标轴的设置和相关操作3.6 figure的区域…

Matplotlib下载、安装、简单使用

Matplotlib Matplotlib是一个Python 2D绘图库&#xff0c;它以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形。它可与 NumPy 一起使用&#xff0c;提供了一种有效的 MatLab 开源替代方案&#xff0c;也可用于Python脚本&#xff0c;Python和IPython (opens new win…

Python--Matplotlib(基本用法)

Matplotlib Matplotlib 是Python中类似 MATLAB 的绘图工具&#xff0c;熟悉 MATLAB 也可以很快的上手 Matplotlib。 1. 认识Matploblib 1.1 Figure 在任何绘图之前&#xff0c;我们需要一个Figure对象&#xff0c;可以理解成我们需要一张画板才能开始绘图。 import matplo…

【51单片机】AS608指纹锁设计

文章目录 一、主要功能二、硬件资源1.硬件准备2.硬件连接 三、软件设计1.软件结构2.主要代码 四、实验现象联系作者 一、主要功能 系统运行后&#xff0c;LCD显示指纹锁主界面&#xff0c;显示模块指纹库剩余容量和指纹对比等级数。如果已经添加了指纹的话&#xff0c;直接在主…

基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁)

目录 一、项目功能 二、视频 三、原理图 4、材料选择 5、部分程序 资料下载地址&#xff1a;基于STM32的多功能门禁系统 一、项目功能 1、AS608指纹解锁&#xff1b;可以录入、删除、验证指纹&#xff1b; 2、密码解锁&#xff1b;可以密码验证、修改密码和保存密码&a…

AS608指纹模块的上位机检测

​​​​​引言 最近在搞这个基于STC51的指纹锁&#xff0c;目前已经差不多完成&#xff0c;对于我这个小白来说还是有点难度的。上位机检测是之前做的&#xff0c;现在也算是回忆总结一下吧&#xff01; 正文 AS608指纹模块的介绍 PCB&#xff1a; 具体操作 第一步 将AS…

Arduino Nano+AS608指纹门禁系统

100元制作宿舍指纹门禁系统 效果图&#xff1a;硬件清单各个模块连接程序流程图驱动文件以及配置烧录环境驱动文件配置编译器 局部源码**演示视频**更新内容完整源码下载&#xff1a; 效果图&#xff1a; 这里用的是电容式的AS608指纹模块 硬件清单 名称用途Arduino Nano开发…

ATECC608A的完美兼容国产替代芯片

工程师强烈推荐的一款ATECC608A的完美兼容替代加密芯片&#xff1a;MOD8ID MOD8ID是一款MODSEMI推出的高安全等级加密芯片&#xff0c;真正做到了软硬件P2P兼容ATECC608系列&#xff0c;也就是说不需要改变主机端原有的Cryptolib库&#xff0c;甚至无需更改任何代码和硬件即可…

基于stm32f103c8t6及AS608-----指纹锁项目

一、关于本项目&#xff1a; 本文适合于初学者&#xff0c;大佬还请勿喷&#xff0c;欢迎提出意见&#xff0c;有纰漏之处将及时纠正。在浅学了stmf103c8t6后&#xff0c;想着依据现在所拥有的知识和能力做一个小项目。在了解到有关宿舍指纹锁的相关内容&#xff0c;对该功能的…

【基于STM32F103+AS608的智能打卡系统】

基于STM32F103AS608的智能打卡系统 工程源码链接 链接&#xff1a;https://pan.baidu.com/s/1RRc03nTrcTp--xfQnv2r9Q?pwdin9p 提取码&#xff1a;in9p --来自百度网盘超级会员V5的分享一、功能描述基于STM32F013AS608实行的智能打卡系统 1》进行打卡功能 2》指纹添加&…

as608指令c语言,单片机+AS608的使用,并带程序

之前在AS608的使用上走了许多弯路,这次希望身为初学者的我们可以吸取经验,特此介绍AS608. 指纹模块AS608的使用: 1脚红线:Vcc,连接3.3V电源供电,勿接3.3V以上电源 2脚黄线:接单片机串口TX端 3脚白线:接单片机串口RX端 4脚黑线:GND,3.3V电源的GND 5脚蓝线:模块触摸…

STM32+AS608指纹模块

前言&#xff1a;这个串口逻辑有点问题&#xff0c;要是用串口做命令输入端的话要自己改一下串口逻辑&#xff0c;串口只是调试能不能用指纹模块的功能&#xff0c;后期不需要串口发命令所以没怎么写串口的命令逻辑 1.AS608的资料挺全的&#xff0c;就是按照他给的来写命令&…