【100天精通Python】Day67:Python可视化_Matplotlib 绘动画,2D、3D 动画 示例+代码
1 绘制2D动画(animation)
Matplotlib是一个Python绘图库,它提供了丰富的绘图功能,包括绘制动画。要绘制动画,Matplotlib提供了
FuncAnimation
类,允许您创建基于函数的动画。下面是一个详细的Matplotlib动画示例,演示了如何创建一个简单的动画。
示例1:Matplotlib绘制一个简单的正弦波动画 :
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation# 创建一个空白图形
fig, ax = plt.subplots()# 创建一个空白线条,稍后将在动画中更新
line, = ax.plot([], [], lw=2)# 设置坐标轴范围
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1, 1)# 初始化函数,用于创建空白图形
def init():line.set_data([], [])return line,# 动画更新函数,在每一帧中更新线条数据
def update(frame):x = np.linspace(0, 2*np.pi, 1000)y = np.sin(2*np.pi * (x - 0.01 * frame))line.set_data(x, y)return line,# 创建动画对象,传递初始化函数和更新函数
ani = FuncAnimation(fig, update, frames=200, init_func=init, blit=True)# 保存动画为gif文件(可选)
ani.save('sine_wave_animation.gif', writer='pillow', fps=30)# 显示动画
plt.show()
这个示例演示了如何创建一个简单的正弦波动画。让我们分析一下代码:
我们首先导入必要的库,包括NumPy和Matplotlib中的
FuncAnimation
类。创建一个图形对象(
fig
)和一个坐标轴对象(ax
),然后创建一个空白的线条对象(line
)。设置坐标轴范围。
编写
init
函数,它用于初始化图形,此处是清空线条。编写
update
函数,它在每一帧中更新线条的数据。在这个示例中,我们绘制了一个在x轴上以不同速度移动的正弦波。创建
FuncAnimation
对象,传递初始化函数、更新函数、帧数等参数。最后,您可以选择将动画保存为GIF文件(使用
ani.save
)或直接在窗口中显示(使用plt.show()
)。
示例2:绘制散点图动画
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as npfig, ax = plt.subplots()x = np.random.rand(100)
y = np.random.rand(100)
scatter = ax.scatter(x, y)def update(frame):scatter.set_offsets(np.column_stack((x+frame/100, y)))return scatter,ani = animation.FuncAnimation(fig, update, frames=100, interval=50)
ani.save('animation.gif', writer='pillow')
plt.show()
2 matplotlib 绘制3D动画(animation)
Matplotlib允许您创建3D动画,通过使用FuncAnimation
类,您可以在3D场景中制作动画。
示例:Matplotlib 绘制旋转的魔方动画
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation
from mpl_toolkits.mplot3d.art3d import Poly3DCollection# 创建一个3D图形对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')# 定义立方体的顶点坐标和连接顺序
vertices = np.array([[1, 1, 1], [1, 1, -1], [1, -1, -1], [1, -1, 1],[-1, 1, 1], [-1, 1, -1], [-1, -1, -1], [-1, -1, 1]])faces = [[vertices[0], vertices[1], vertices[2], vertices[3]],[vertices[4], vertices[5], vertices[6], vertices[7]],[vertices[0], vertices[1], vertices[5], vertices[4]],[vertices[2], vertices[3], vertices[7], vertices[6]],[vertices[0], vertices[3], vertices[7], vertices[4]],[vertices[1], vertices[2], vertices[6], vertices[5]]]# 定义每个面的颜色
colors = ['r', 'g', 'b', 'y', 'm', 'c']# 初始化函数,创建空白图形
def init():return ax# 动画更新函数,用于旋转立方体
def update(frame):ax.cla() # 清除当前图形ax.set_xlim(-2, 2)ax.set_ylim(-2, 2)ax.set_zlim(-2, 2)ax.set_title(f'Frame {frame}')# 旋转立方体angle = frame * (360 / frames)for i, face in enumerate(faces):rotated_face = []for vertex in face:x, y, z = vertexx_rotated = x * np.cos(np.radians(angle)) - z * np.sin(np.radians(angle))z_rotated = x * np.sin(np.radians(angle)) + z * np.cos(np.radians(angle))rotated_face.append([x_rotated, y, z_rotated])rotated_face = np.array(rotated_face)ax.add_collection3d(Poly3DCollection([rotated_face], facecolors=colors[i], alpha=0.8))return axframes = 100 # 动画帧数
ani = FuncAnimation(fig, update, frames=frames, init_func=init, blit=False)# 在创建FuncAnimation对象之后,添加以下代码保存动画为GIF文件
ani.save('rotating_colored_cube_animation.gif', writer='pillow', fps=30)# 显示动画
plt.show()
上述代码演示了如何使用Matplotlib创建一个旋转的彩色3D立方体动画,并将其保存为GIF文件。以下是代码的主要部分和功能分析:
首先,导入必要的Python库:
numpy
:用于处理数学运算和数组操作。matplotlib.pyplot
:Matplotlib的绘图模块,用于创建和显示图形。mpl_toolkits.mplot3d.Axes3D
:Matplotlib的3D绘图工具。matplotlib.animation.FuncAnimation
:用于创建动画的Matplotlib类。创建一个3D图形对象(
fig
)和一个3D坐标轴对象(ax
)。定义立方体的顶点坐标(
vertices
)和连接顺序(faces
)。vertices
包含了立方体的八个角点的坐标,而faces
包含了连接这些点的面。定义每个面的颜色(
colors
),这里使用了六种不同的颜色。编写初始化函数
init
,它返回一个空白的3D图形。编写动画更新函数
update
,它在每一帧中清除当前图形,然后重新绘制旋转后的立方体。动画中的旋转通过逐渐改变角度(angle
)来实现。每个面的顶点坐标都根据旋转角度计算出旋转后的坐标,然后使用Poly3DCollection
来绘制立方体的面,每个面使用不同的颜色。定义动画帧数(
frames
),表示动画的总帧数。使用
FuncAnimation
类创建动画对象(ani
),传递初始化函数、更新函数、帧数等参数。使用
ani.save
方法将动画保存为GIF文件,指定文件名('rotating_colored_cube_animation.gif')、GIF编写器('pillow',使用Pillow库)和帧速率(fps=30)。最后,通过
plt.show()
显示动画。
这段代码实现了一个具有旋转动画效果的3D立方体,每个面都有不同的颜色,生成的动画保存为GIF文件。您可以根据需要修改颜色、帧数、文件名等参数来自定义动画。
3 总结:绘制动画的通用流程
(1)导入必要的库:首先,你需要导入Matplotlib库及其子模块,例如pyplot和animation。通常使用以下语句导入这些库:
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
(2) 创建画布和子图:使用Matplotlib创建一个画布并添加子图(axes)。可以使用`plt.subplots()`函数来完成这个步骤:
fig, ax = plt.subplots()
(3)定义初始化函数:创建一个函数来初始化动画。这个函数会设置图形的初始状态,例如绘制图形的背景、坐标轴的范围等,确保动画的每一帧都从相同的初始状态开始。
def init():# 设置图形的初始状态return ax
(4) 定义更新函数:创建一个函数来更新动画的每一帧。通常,这个函数根据时间或数据的变化更新图形。例如,你可以使用以下语句在每一帧中更新线条的位置:
```python
def update(frame):# 更新图形的每一帧# 更新线条的位置或其他图形元素return ax
```
(5)创建动画对象:使用`FuncAnimation`类创建一个动画对象。这个类接受以下参数:绘制图形的画布、更新函数、帧数、帧之间的延迟以及初始化函数。可以使用以下语句创建动画对象:
anim = FuncAnimation(fig, update, frames=num_frames, init_func=init, interval=interval, blit=True)
其中,`fig`是创建的画布对象,通常为第2步中创建的对象;`update`是在第4步中定义的更新函数;`num_frames`是动画的总帧数;`init`是在第3步中定义的初始化函数;`interval`是帧之间的延迟(以毫秒为单位);`blit`是一个布尔值,表示是否只绘制变化的部分(默认值为False)。
(6)显示动画:使用`plt.show()`函数来显示动画。
相关文章:

【100天精通Python】Day67:Python可视化_Matplotlib 绘动画,2D、3D 动画 示例+代码
1 绘制2D动画(animation) Matplotlib是一个Python绘图库,它提供了丰富的绘图功能,包括绘制动画。要绘制动画,Matplotlib提供了FuncAnimation类,允许您创建基于函数的动画。下面是一个详细的Matplotlib动画示…...

Linux内核源码分析 (B.x)Linux页表的映射
Linux内核源码分析 (B.x)Linux页表的映射 文章目录 Linux内核源码分析 (B.x)Linux页表的映射一、ARM32页表1、页表术语2、虚拟地址到物理地址转换3、一级页表项4、二级页表项 二、ARM64页表1、ARMv8-A架构2、4KB大小页4级映射 三、Linux内核中关于页表的函数和宏1、查询页表2、…...

机器学习(15)---代价函数、损失函数和目标函数详解
文章目录 一、各自定义二、各自详解三、代价函数和损失函数区别四、例题理解 一、各自定义 1. 代价函数:代价函数(Cost Function)是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。它用于衡量模型在…...
计算机专业大学规划之双非
亲爱的计算机专业大一学弟学妹们,欢迎来到充满挑战和机遇的大学校园!在经历了小半年的大学生活后,是否会对自己的未来感到一些迷茫,借着前几天给我大一的妹妹聊天的机会,我想发表一下关于我的建议(仅限个…...

2.策略模式
UML图 代码 main.cpp #include "Strategy.h" #include "Context.h"void test() {Context* pContext nullptr;/* StrategyA */pContext new Context(new StrategyA());pContext->contextInterface();/* StrategyB */pContext new Context(new Strat…...

算法通过村第七关-树(递归/二叉树遍历)黄金笔记|迭代遍历
文章目录 前言1. 迭代法实现前序遍历2. 迭代法实现中序遍历3. 迭代法实现后序遍历总结 前言 提示:在一个信息爆炸却多半无用的世界,清晰的见解就成了一种力量。 --尤瓦尔赫拉利《今日简史》 你是不是觉得上一关特别简单,代码少,背…...

MySQL数据库简介+库表管理操作+数据库用户管理
Mysql Part 1 一、数据库的基本概念1.1 使用数据库的必要性1.2 数据库基本概念1.2.1 数据(Data)1.2.2 表1.2.3 数据库1.2.4 数据库管理系统(DBMS)1.2.5 数据库系统 1.3 数据库的分类1.3.1 关系数据库 SQL1.3.2 非关系数据库 NoSQL…...

PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类
目录 前言 一、卷积神经网络概述 二、卷积神经网络特点 卷积运算 单通道,二维卷积运算示例 单通道,二维,带偏置的卷积示例 带填充的单通道,二维卷积运算示例 Valid卷积 Same卷积 多通道卷积计算 1.局部感知域 2.参数共…...

MapRdeuce工作原理
hadoop - (三)通俗易懂地理解MapReduce的工作原理 - 个人文章 - SegmentFault 思否 MapReduce架构 MapReduce执行过程 Map和Reduce工作流程 (input) ->map-> ->combine-> ->reduce-> (output) Map: Reduce...
完整指南:使用JavaScript从零开始构建中国象棋游戏
引言 中国象棋,又被称为国际象棋,是一款起源于中国的古老棋类游戏。本文旨在为大家提供一个简单明了的步骤,教你如何使用JavaScript从零开始构建这款经典的棋类游戏。 1. 游戏简介 在中国象棋中,两方各有一军队,包括…...
PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni
一、风哥PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni 课程目标: 本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL主从复制与高可用集群阶段之PostgreSQL高可用集群项目实战之Patroni,学完本课…...

数据库管理-第105期 安装Database Valut组件(20230919)
数据库管理-第105期 安装Database Valut组件(20230919) 之前无论是是EXPDP还是PDB中遇到的一些问题,其实都跟数据库的DV(Database Valut)组件有关,因为目标库没有安装DV导致启动时会出现问题。 1 DV/OLS …...

企望制造ERP系统RCE漏洞 复现
文章目录 企望制造ERP系统RCE漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 企望制造ERP系统RCE漏洞 复现 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播…...

【unity小技巧】Unity 存储存档保存——PlayerPrefs、JsonUtility和MySQL数据库的使用
文章目录 前言PlayerPrefs一、基本介绍二、Demo三、优缺点 JsonUtility一、基本使用二、Demo三、优缺点 Mysql(扩展)完结 前言 游戏存档不言而喻,是游戏设计中的重要元素,可以提高游戏的可玩性,为玩家提供更多的自由和…...

2023-9-22 滑雪
题目链接:滑雪 #include <cstring> #include <algorithm> #include <iostream>using namespace std;const int N 310;int n, m; int h[N][N]; int f[N][N];int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1};int dp(int x, int y) {int &v f…...

基于Yolov8的工业小目标缺陷检测(6):多检测头结合小缺陷到大缺陷一网打尽的轻量级目标检测器GiraffeDet,暴力提升工业小目标缺陷检测能力
💡💡💡本文改进:多头检测器结合大小缺陷一网打尽的GiraffeDet,进一步提升处理低分辨率图像和小物体等更困难的检测能力。 多头检测器+ GiraffeDet | 亲测在工业小目标缺陷涨点明显,原始mAP@0.5 0.679提升至0.734 收录专栏: 💡💡💡深度学习工业缺陷检测 :h…...

exe文件运行后无输出直接闪退如何找解决办法
一.搜索栏搜事件查看器 二.点开windows日志下的应用程序 三.找到错误处 四.搜索异常代码 点开有错误的详细信息,直接用搜索引擎搜索这个异常代码能大致判断是什么问题,给了一个解决思路,不至于不知道到底哪里出了问题...

OpenHarmony应用开发—ArkUI组件集合
介绍 本示例为ArkUI中组件、通用、动画、全局方法的集合。 效果预览 使用说明: 1.点击组件、通用、动画、全局方法四个按钮或左右滑动切换不同视图。 2.点击二级导航(如通用属性、通用事件等),若存在三级导航则展开三级导航&#…...

Linux(CentOS)安装msf
目录 一、安装MSF 1.1 在线安装 1.2 离线安装 二、安装Postgresql数据库 一、安装MSF 1.1 在线安装 需要挂梯子!挂完梯子需要reboot重启,多试几次就可以,国内网络我试了很久都不行。没条件没梯子的看1.2离线安装 cd /opt curl https://ra…...

工作几年还是悟不懂自动化测试的意义
【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 有人问:自动化测试的成本高效果差,那么自动化测试的意义在哪呢? 我…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...