当前位置: 首页 > news >正文

【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()

这个示例演示了如何创建一个简单的正弦波动画。让我们分析一下代码: 

  1. 我们首先导入必要的库,包括NumPy和Matplotlib中的FuncAnimation类。

  2. 创建一个图形对象(fig)和一个坐标轴对象(ax),然后创建一个空白的线条对象(line)。

  3. 设置坐标轴范围。

  4. 编写init函数,它用于初始化图形,此处是清空线条。

  5. 编写update函数,它在每一帧中更新线条的数据。在这个示例中,我们绘制了一个在x轴上以不同速度移动的正弦波。

  6. 创建FuncAnimation对象,传递初始化函数、更新函数、帧数等参数。

  7. 最后,您可以选择将动画保存为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文件。以下是代码的主要部分和功能分析: 

  1. 首先,导入必要的Python库:

    • numpy:用于处理数学运算和数组操作。
    • matplotlib.pyplot:Matplotlib的绘图模块,用于创建和显示图形。
    • mpl_toolkits.mplot3d.Axes3D:Matplotlib的3D绘图工具。
    • matplotlib.animation.FuncAnimation:用于创建动画的Matplotlib类。
  2. 创建一个3D图形对象(fig)和一个3D坐标轴对象(ax)。

  3. 定义立方体的顶点坐标(vertices)和连接顺序(faces)。vertices包含了立方体的八个角点的坐标,而faces包含了连接这些点的面。

  4. 定义每个面的颜色(colors),这里使用了六种不同的颜色。

  5. 编写初始化函数init,它返回一个空白的3D图形。

  6. 编写动画更新函数update,它在每一帧中清除当前图形,然后重新绘制旋转后的立方体。动画中的旋转通过逐渐改变角度(angle)来实现。每个面的顶点坐标都根据旋转角度计算出旋转后的坐标,然后使用Poly3DCollection来绘制立方体的面,每个面使用不同的颜色。

  7. 定义动画帧数(frames),表示动画的总帧数。

  8. 使用FuncAnimation类创建动画对象(ani),传递初始化函数、更新函数、帧数等参数。

  9. 使用ani.save方法将动画保存为GIF文件,指定文件名('rotating_colored_cube_animation.gif')、GIF编写器('pillow',使用Pillow库)和帧速率(fps=30)。

  10. 最后,通过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动画示…...

变量、常量以及与其他语言的差异 - Go语言从入门到实战

知识点 源码文件以_test结尾:xxx_test.go测试方法名以Test开头:func TestXXX(t *testing.T){…} 利用单元测试来写代码段,保存之后会自动运行程序返回结果,可以快速实践得到反馈。 编写测试程序 接下来练习一下,怎…...

Android 编译插桩操纵字节码

本文讲解如何编译插桩操纵字节码。 就使用 ASM 来实现简单的编译插桩效果,通过插桩实现在每一个 Activity 打开时输出相应的 log 日志。实现思路 过程主要包含两步: 1、遍历项目中所有的 .class 文件​ 如何找到项目中编译生成的所有 .class 文件&#…...

云原生的简单理解

一、何谓云原生? 一种构建和运行应用软件的方法 应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹性分布式优势。 二、包括以下四个要素 采用容器化部署:实现云平…...

AVL Cruise 2020.1 安装教程

文章目录 安装包安装破解 安装包 链接:https://pan.baidu.com/s/1GxbeDj_SyvKFyPeTsstvTQ?pwd6666 提取码:6666 安装 安装文件: 双击setup.exe: 一直netx,中间要修改两次路径,第一次是安装位置&#xf…...

数组07-滑动窗口、HashMap

LeetCode——904. 水果成篮 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩&#xff0c…...

【C++杂货店】类和对象(上)

【C杂货店】类和对象(上) 一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装4.1 访问限定符4.2 封装 五、类的作用域六、类的实例化七、类对象模型7.1 类对象的存储规则7.2 例题7.3结构体内存对齐规则 八、this指针8.2 t…...

K8S笔记

...

MySQL关于日期函数的使用-笔记

韩老师笔记 select current_time select CURRENT_DATE create table mes ( id int, content VARCHAR(255), send_time DATETIME ) select * from mes; insert into mes values(1,北京,CURRENT_DATE) insert into mes (id,send_time) values(2,CURRENT_TIME) insert into mes v…...

【postgresql 】 ERROR: “name“ is not supported as an alias

org.postgresql.util.PSQLException: ERROR: "name" is not supported as an alias 错误:不支持将“name”作为别名 SELECT real_name name FROM doc_user 加上 在关键词上加上 “” 示例: SELECT real_name "name" FROM do…...

都用HTTPS了,还能被查出浏览记录?

最近,群里一个刚入职的小伙因为用公司电脑访问奇怪的网站,被约谈了。他很困惑 —— 访问的都是HTTPS的网站,公司咋知道他访问了啥? 实际上,由于网络通信有很多层,即使加密通信,仍有很多途径暴露…...

vi配置文件.vimrc内容示例

1、.vimrc配置文件介绍 (1).vimrc是vi编辑器的配置文件,里面可以对vi编译器做个性化配置; (2).vimrc在用户目录下,每个用户有一个,类似于.bashrc文件,将下面的配置文件内…...

MacOS上的Pip和Python升级指南

在MacOS系统上,保持Pip和Python版本的最新状态对于顺利进行Python开发至关重要。通过升级Pip和Python,你可以享受到最新的功能、修复的bug以及提升的开发效率。本文将为你提供在MacOS上升级Pip和Python的详细指南,助你打造更强大的开发环境。…...

VB6.0实现修改EXE程序的图标

当你给一家公司做技术支持的时候,需求各种各样的,其中今天遇到就是要修改某个程序的图标,代码实现如下。 // q1016058890 群 214016721 //注 意:这个方法貌似只对有些EXE文件有效,这不是万能的方法,此…...

Python 编程基础 | 第二章-基础语法 | 2.3、for 语句

一、for 语句 1、循环语句 for循环的语法格式如下: for iterating_var in sequence:statements(s)例如: for ch in "hello world":print(ch)fruits ["banana", "apple", "mango"] for fruit in fruits:print(…...

linux下解决tomcat错误问题

错误一: Linux下Tomcat启动报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 原因:可能是Linux环境变了,需要在catalina.sh文件里指定JDK路径 解决方式: 在/bin/catalina.sh配置文件中加…...

PMP证书的价值如何?

2022年开始,PMP考试启用了新考纲,不光考试内容进行了大刀阔斧的改革,出题方式也进行了更新。除原有的PMBOK6和PMBOK7主考教材外,还增加了一本《敏捷实践指南》。 别小看新加的这本书,它虽然与PMBOK代表的预测法属于完…...

linux上mysql数据备份(全量备份策略+增量备份策略)

执行备份策略前,先做好scp命令的准备 解决思路: 生成SSH公钥/私钥后,您需要将公钥添加到服务器上,从而使服务器可以使用该公钥来验证您的身份。 生成SSH公钥/私钥的命令为 ssh-keygen -t rsa -b 4096什么都不用输入&#xff0c…...

PHP实现DFA算法,查找关键词

# 添加关键词 到全局字典dict里面 protected function addWord($strWord) {$len mb_strlen($strWord,UTF-8);$curNode &$this->dict;for ($index 0; $index < $len; $index) {$word mb_substr($strWord, $index, 1, UTF-8);if (!isset($curNode[$word])) {$curNo…...

JTS:08 JTS图形相交

这里写目录标题 版本JTS disjoint intersects俩个图形不相交俩个图形 边相交俩个图形 内部相交俩个图形 点相交 版本 org.locationtech.jts:jts-core:1.19.0 链接: github JTS disjoint intersects 不相交的 九交模型FF*FF**** 相交的 九交模型 [T********] [*T*******] [**…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...