【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…...
工作几年还是悟不懂自动化测试的意义
【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 有人问:自动化测试的成本高效果差,那么自动化测试的意义在哪呢? 我…...
Redis面试问题三什么是缓存雪崩怎么解决
定义 缓存雪崩是因为大量的key设置了同一过期时间的导致在同一时间类缓存同时过期,而这时因为请求过来已经没有缓存了,DB压力大数据库崩溃了。 解决方法 我可以在设置过期时间的时候加一个随机时间,在1-5分钟那样可以分散过期时间…...
【Unittest】自动化测试框架核心要素
【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 1、什么是Unittest框架? python自带一种单元测试框架 2、为什么使用UnitTest框架࿱…...
Hyperloglog
一,前言 在互联网行业中存在两个比较重要的指标:PV(页面访问量)和 UV(用户访问量) 如果有这样的一个业务: 统计PV,那么你会怎么做? 我们可以使用Redis的incr、incrby指…...
如何自动获取短信验证码?
点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 这篇文章通过解决实际项目开发中遇到的如何自动获取短信验证码的问题,进一步讲述在Java中如何使用正则。 Java中如何使用正则 Java中正则相关类位于java.util.r…...
Linux 本地 Docker Registry本地镜像仓库远程连接【内网穿透】
Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…...
基于Yolov8的工业小目标缺陷检测(4):SPD-Conv,低分辨率图像和小物体涨点明显
💡💡💡本文改进:SPD-Conv,处理低分辨率图像和小物体等更困难的任务时效果明显。 SPD-Conv | 亲测在工业小目标缺陷涨点明显,原始mAP@0.5 0.679提升至0.775 收录专栏: 💡💡💡深度学习工业缺陷检测 :http://t.csdn.cn/fVSgs ✨✨✨提供工业缺陷检测性能提升…...
平均精度(AP)
什么是平均精度(AP) 平均精度 (AP)并不是精度 (P)的平均值。 平均精度 (AP) 是按类别计算的。 mAP(mean average precision)是一个平均值,常用作目标检测中的检测精度指标mAP 指标通过对于一个平均目标来检测任务中多个目标所对应不同 AP&a…...
建议收藏《Verilog代码规范笔记_华为》(附下载)
华为verilog编程规范是坊间流传出来华为内部的资料,其贴合实际工作需要,是非常宝贵的资料,希望大家善存。至于其介绍,在此不再赘述,大家可看下图详细了解,感兴趣的可私信领取《Verilog代码规范笔记_华为》。…...
Nginx环境搭建、负载均衡测试
Nginx环境搭建、负载均衡测试 系统环境: win10,IDEA2020,JDK8 一、nginx环境搭建 1.ngxin下载 Nginx官网下载: http://nginx.org/en/download.html Nginx有三种版本,分别是Mainline version(开发版&…...
软件工程知识总结梳理
🔥🔥宏夏Coding网站,致力于为编程学习者、互联网求职者提供最需要的内容!网站内容包括求职秘籍,葵花宝典(学习笔记),资源推荐等内容。在线阅读:https://hongxiac.com&…...
最大的网站开发公司/国内做seo最好的公司
火山PC批量添加图片水印 本文作者:灰羊羊 一、需要准备的软件: photoshop 二、火山调用的模块 1.MFC界面支持库 2.火山模块 3.CxImage图像处理支持库 三、混合图片说明 此命令为核心命令,将需要添加水印的图片与logo图片合并,上图命令中,图…...
常德网站建设哪家快/站长统计网站
对应的问题: 在用tensorflow构造自己的损失函数时,经常会涉及到复杂的矩阵乘法。而这些矩阵乘法本来并不复杂, 比如只是简单的 维度为ABA\times BAB 的矩阵 X\mathbf{X}X 和 维度为 BCB\times CBC的矩阵Y\mathbf{Y}Y相乘。 但是由于在深度学…...
低代码建站平台/百度知道客服电话人工服务
by Jos Mara Mndez 原文链接: http://www.gamedev.net/reference/programming/features/simpleSSAO/ 绪论 全局照明(global illumination, GI)是一个计算机图形学术语, 它指的是所有表面之间相互作用的光照现象(光线来回跳动, 折射, 或者被遮挡), 例如: 渗色(color bleeding),…...
php 实现网站扫码登录/站长之家站长工具
Linux 命令之grep 的常见使用总结:一、grep简介Grep(Global Regular Expression Print),它是Linux系统中一种强大的文本搜索工具,根据用户指定的文本模式去对目标文件或标准输入进行逐行查找输入,显示能够被匹配到的字符串的所在行。这是提到…...
深圳装修公司排名前十口碑推荐/河北seo网络优化师
SQL Server 2005 新增 cross apply 和 outer apply 联接语句,增加这两个东东有啥作用呢? 我们知道有个 SQL Server 2000 中有个 cross join 是用于交叉联接的。实际上增加 cross apply 和 outer apply 是用于交叉联接表值函数(返回表结果集…...
上海云盾为网站做防护/百度做网站
package leetcode.sort;import java.util.*; /** * Description: 两个数组的交集* 给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2,2] 示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出: [4,9] 说明&…...