Python数据可视化(四)

实现图形的动画效果

在 matplotlib 中,不仅可以绘制静态图形,也可以绘制动态图形。对于动态图形来说,我们称 之为动画或许会让读者更容易明白。绘制动画的方法主要有两种:一种是使用模块 animation 绘制动 画;另一种是调用模块 pyplot 的 API 绘制动画。下面,我们就分别通过实用案例加以讲解,以使读 者理解这两种方法的区别和联系。

一,使用模块 animation 绘制动画

一般而言,在绘制复杂动画时,主要借助模块 animation 来完成。下面,我们就详细介绍模块 animation 中的类 FuncAnimation 的使用方法。

1.代码示例

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots(1, 1)

x = np.linspace(0, 2 * np.pi, 5000)
y = np.exp(-x) * np.cos(2 * np.pi * x)
line, = ax.plot(x, y, color="cornflowerblue", lw=3)
ax.set_ylim(-1.0, 1.0)


# to clear current frame
def init():
    line.set_ydata([np.nan] * len(x))
    return line,


# to update the data
def animate(data):
    line.set_ydata(np.exp(-x) * np.cos(2 * np.pi * x + float(data) / 100))
    return line,


# to call class FuncAnimation which connects animate and init
ani = FuncAnimation(
    fig,
    animate,
    init_func=init,
    frames=200,
    interval=2,
    blit=True)

# to save the animation
ani.save("mymovie.mp4", fps=20, writer="ffmpeg")

plt.show()

演示视频

2.代码讲解 

<1>我们定义了两个函数 init()和 animate(),函数 init()的作用是在绘制下一帧动画画面之前 清空画布窗口中的当前动画画面,函数 animate()的作用是绘制每帧动画画面。这两个函数的返 回值“line”后面的符号“,”是不可以省略的,原因就是只有添加了符号“,”,才可以使得返回 值是 Line2D 对象。

<2>同理,通过调用“ax.plot(x,y,color="cornflowerblue",lw=3)”语句,获得的返回值“line”的 后面也需要添加符号“,”。  

<3> 函数 init() 和 animate()分别作为参 数值传入 类 FuncAnimation 的构造函 数中。类FuncAnimation 的构造函数主要接收的参数有 Figure 对象、函数 func、帧数 frames、帧与帧之间的 间隔时间 interval。

<4>调用实例方法 save(),将绘制的每帧动画画面(图形)保存成图像文件,然后将全部图像 文件转存成视频文件,也就是动画 mymovie.mp4,这个动画的文件格式是 MPEG-4 Movie。如果计 算机安装的是 Windows 操作系统,则可以使用系统自带的 Windows Media Player 软件打开,当然也 可以使用其他视频播放软件打开。动画保存在生成动画的执行脚本所在的路径下。

<5>调用模块 pyplot 中的函数 show(),生成自动播放动画内容的画布窗口。在图 7-1 中,展示 了从动画内容中选取的 4 帧动画画面。

二,调用模块 pyplot 的 API 绘制动画  

1.代码示例

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.patches import Circle
from warnings import filterwarnings

# ignore warning
filterwarnings("ignore", ".*GUI is implemented.*")

# set several variables
word = "kaleidoscope"
row = int(len(word) / 4)
col = int(len(word) / 4)
num = int(len(word) / 4)

data = np.random.random((row, col, num))
colorMap = ["spring", "summer", "autumn", "winter"]

subplot_row = int(len(word) / 6)
subplot_col = int(len(word) / 6)

font = dict(family="monospace", weight="bold", style="italic", fontsize=10)
subplot_kw = dict(aspect="equal", frame_on=False, xticks=[], yticks=[])

# create subplots
fig, ax = plt.subplots(subplot_row, subplot_col, subplot_kw=subplot_kw)


# generate a subplot
def rowcolgenerator(r, c, season):
    index = colorMap.index(season)
    t = index * num
    subtitle = "No.{} '{}' Theme of the {}"
    for j in range(len(data)):
        ax[r, c].cla()
        collection = ax[r, c].pcolor(data[j, :], cmap=colorMap[index])
        patch = Circle((1.5, 1.5), radius=1.5, transform=ax[r, c].transData)
        collection.set_clip_path(patch)
        element = colorMap[index].capitalize()
        ax[r, c].set_title(subtitle.format((j + 1), word[t:t + 3], element),
                           **font)
        ax[r, c].set_axis_off()
        plt.pause(1.0)


# create animation
def animation():
    i = 0
    for r in range(subplot_row):
        for c in range(subplot_col):
            rowcolgenerator(r, c, colorMap[i])
            i += 1

    title = "Life Kaleidoscope Consists of Four Seasons"
    plt.suptitle(title, family="serif", weight="black", fontsize=20)

    plt.subplots_adjust(wspace=0.05, hspace=0.2)

if __name__ == "__main__":
    animation()

2.代码讲解

(1)导入模块 pyplot、patches 和 warnings,其中,模块 patches 主要用于导入类 Circle,模块 warnings 主要用于导入函数 filterwarnings()。导入 NumPy 包用于生成类 ndarray 的数据对象。 注意: 函数 filterwarnings(action,message)主要用来设置对于警告信息而言脚本所采用的运行模式,其中, 参数 action 用来设置脚本运行模式,参数 message 用来收集必须与正则表达式相匹配的警告信息。

(2)通过调用“np.random.random((row,col,num))”语句,生成在半开区间(0.0,1.0]内的随机浮点数的数组 array,数据对象 ndarray 的形状是 row 行 col 列,而且数组 array 中的每个元素都包含 num 个浮点数。

(3)通过调用“colorMap = ["spring","summer","autumn","winter"]”语句,将颜色映射表的名称存储在列表 colorMap 中。

(4)通过调用“subplot_kw = dict(aspect="equal",frame_on=False,xticks=[],yticks=[])”语句,用字 典数据结构设置子区的坐标轴的展示形式,参数 aspect 的取值将 x 轴的刻度线之间的单位距离和 y轴的刻度线之间的单位距离设置成长度相同,参数 frame_on 的取值将轴脊隐藏,参数 xticks 和 yticks 的取值分别将 x 轴和 y 轴的刻度线去掉,相应地,也将坐标轴上的刻度标签去掉。

(5)函数 rowcolgenerator()的功能主要是在每个子区上绘制图形。具体而言,通过调用 “ax[r,c].cla()”语句,清除当前子区里的坐标轴 ax[r,c]上的图形。然后在坐标轴 ax[r,c]上,调用类 Axes 的实例方法重新绘制图形,也就是通过调用“ax[r,c].pcolor(data[j,:],cmap=colorMap[index])”语句, 绘制模拟颜色图,参数 cmap 用来设置模拟颜色图所使用的颜色映射表的名称。通过调用 “Circle((1.5,1.5),radius=1.5,transform=ax[r,c].transData)”语句,绘制一个半径为 1.5、圆心(1.5,1.5)位 置处的圆形补片,参数 transform 的取值表示使用 ax[r,c]的坐标系统,也就是使用类 Axes 的坐标系 统,例如,(0,0)表示坐标轴的左下角,(1,1)表示坐标轴的右上角。调用类 Collection 的实例方法 set_clip_path(),将圆形补片 patch 作为剪切模板或裁剪路径,裁剪出一幅圆形样式的模拟颜色图。 变量 element 存储的是首字母大写的颜色映射表的名称。调用类 Axes 的实例方法 set_title()设置子区 的文本标题。调用类 Axes 的实例方法 set_axis_off()关闭 x 和 y 坐标轴,也就是说,将两个维度的坐 标轴隐藏。最后,调用模块 pyplot 中的函数 pause(),设置在执行下一句代码之前的延迟时间,这个 函数一般可以用来实现简单的动画效果。  

(6)函数 animation()的功能主要是通过 for 循环语句,分别在每个子区上绘制圆形模拟颜色图。 其中,调用模块 pyplot 中的函数 suptitle()在画布上添加文本标题,调用模块 pyplot 中的函数 subplots_adjust()分别设置子区之间的宽度和高度。

(7) 通过if语句,如果执行脚本,那么条件表达式“__name__ == "__main__"”的返回值是“True”, 进而调用函数 animation(),从而完成绘制动画的任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644662.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++题解】1699 - 输出是2的倍数,但非3的倍数的数

问题&#xff1a;1699 - 输出是2的倍数&#xff0c;但非3的倍数的数 类型&#xff1a;循环 题目描述&#xff1a; 请从键盘读入一个整数 n&#xff0c;输出 1∼n 中所有是 2 的倍数&#xff0c;但非 3 的倍数的数&#xff0c;每行 1个。 比如&#xff0c;读入一个整数10 &…

[Algorithm][动态规划][简单多状态DP问题][按摩师][打家劫舍Ⅱ][删除并获得点数][粉刷房子]详细讲解

目录 1.按摩师1.题目链接2.算法思路详解3.代码实现 2.打家劫舍 II1.题目链接2.算法思路详解3.代码实现 3.删除并获得点数1.题目链接2.算法思路详解3.代码实现 4.粉刷房子1.题目链接2.算法思路详解3.代码实现 1.按摩师 1.题目链接 按摩师 2.算法思路详解 思路&#xff1a; 确…

2024 ISCC pwn wp

iscc 练武pwn 总结第一周chaosISCC_easyFlagshopping 第二周ISCC_easyISCC_Uheapheap 第三周miaoYour_programeazy_heap 总结 总体感觉iscc考察的题目都挺基础的&#xff0c;在目前这种比赛的大环境下&#xff0c;仍然出这种&#xff0c;比较基础的题目&#xff0c;实在是难得…

原生js实现拖拽改变元素顺序

代码展示如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

NLP(19)--大模型发展(3)

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 大模型训练相关知识&#xff1a; 问题&#xff1a; 数据集过大&#xff0c;快速训练模型过大&#xff0c;gpu跑不完 方案&#xff1a; 数据并行训练&#xff1a; 复制数据&#xff08;batch_size&#xff09;到多个gpu&…

毕设 大数据校园卡数据分析

文章目录 0 前言1 课题介绍2 数据预处理2.1 数据清洗2.2 数据规约 3 模型建立和分析3.1 不同专业、性别的学生与消费能力的关系3.2 消费时间的特征分析 4 Web系统效果展示5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设…

人工智能场景下的网络负载均衡技术

AI技术驱动智能应用井喷&#xff0c;智能算力增速远超通用算力。IDC预测&#xff0c;未来五年&#xff0c;我国智能算力规模年复合增长率将超50%&#xff0c;开启数据中心算力新纪元。随着需求激增&#xff0c;数据中心或智算网络亟需扩容、增速、减时延&#xff0c;确保网络稳…

SM2258G专用SSD开卡工具(三星闪存),后附工具下载

工具下载&#xff1a; https://download.csdn.net/download/weixin_43097956/89354302

【C++】深入解析C++智能指针:从auto_ptr到unique_ptr与shared_ptr

文章目录 前言&#xff1a;1. 智能指针的使用及原理2. C 98 标准库中的 auto_ptr:3. C 11 中的智能指针循环引用&#xff1a;shared_ptr 定制删除器 4. 内存泄漏总结&#xff1a; 前言&#xff1a; 随着C语言的发展&#xff0c;智能指针作为现代C编程中管理动态分配内存的一种…

VMare下载安装

一.下载 1.百度搜索BROADCOM官网 打开官网&#xff1a; https://www.broadcom.com/​ 2.点击右上角&#xff0c;进行账号注册&#xff0c;注册好后&#xff0c;进行登陆 3.注册好后&#xff0c;进入个人界面&#xff1a;https://support.broadcom.com/#. 按下图所示点击进…

【多线程开发 2】从代码到实战TransmittableThreadLocal

【多线程开发 2】从代码到实战TransmittableThreadLocal 本文将从以下几个点讲解TransmittableThreadLocal(为了方便写以下简称ttl)&#xff1a; 前身 是什么&#xff1f; 可以用来做什么&#xff1f; 源码原理 实战 前身 ThreadLocal 要了解ttl就要先了解Java自带的类…

嵌入式全栈开发学习笔记---C语言笔试复习大全24

目录 内存管理 内存分配 堆和栈的区别&#xff1f;&#xff08;面试重点&#xff09; 申请内存的函数 malloc realloc free gcc工具链 编译的过程&#xff08;面试重点&#xff09; 第一步&#xff0c;预处理&#xff1a; 第二步&#xff0c;编译&#xff1a; 第三…

MySQL-数据库基础

一.MySQL安装 1.1卸载MySQL 把用户切换为root 查看是否有mysql数据库 ps axj | grep mysql 我这个是已经安装好的&#xff0c;为了更清楚的演示我把mysql关闭和mysql安装包卸载 关闭指令 systemctl stop mysqld查看是否在运行指令 systemctl stop mysqld查看安装包指令 …

校园招新之获取进QQ群但未报名人员

校园的社团、实验室招新一般由是校领导会发一个QQ通知&#xff0c;让各个班的同学们进一个招新群。 群里面会有负责人提示大家报名&#xff0c;但是群成员不总是都会报名&#xff0c;我们需要的就是&#xff0c;找到那些&#xff0c;已经进群&#xff0c;但是没有报名的同学&am…

网络原理 一

一、协议 网络通信中,协议是非常重要的概念. 协议进行了分层,此处就是按照这几层顺序来介绍每一层中的核心协议. 应用层,就对应着应用程序,是程序员打交道最多的一层,调用系统提供的 网络api 写出的代码都是基于应用层的. 应用层这里当然也有很多现成的协议,但更多的还是,程…

mysql实战——XtraBackup二进制包安装

1、二进制包下载网站 Software Downloads - Percona 2、安装xtrabackup 解压安装包 tar xvf percona-xtrabackup-8.0.27-19-Linux-x86_64.glibc2.17.tar.gz -C /usr/local 进入目录 cd percona-xtrabackup-8.0.27-19-Linux-x86_64.glibc2.17/ 安装依赖 yum install perl-Dig…

游戏子弹类python设计与实现详解

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、子弹类设计思路 1. 属性定义 2. 方法设计 三、子弹类实现详解 1. 定义子弹…

SimLab Composer v11.0.46 解锁版安装教程 (3D设计和逼真场景的多功能软件)

前言 SimLab Composer是由Simulation Lab公司推出的一款用于3D设计和逼真场景的多功能软件。该程序具有集成的图形环境&#xff0c;用于真实设计物理场景和对象&#xff0c;用户可以使用该软件中的工具设计简单到复杂和复杂。该程序的一个重要功能是能够构建和共享三维pdf文件…

揭秘章子怡成功之路:她是如何征服世界的?

章子怡的演艺生涯可谓是一部传奇❗❗❗ 从一个普通工人家庭的女孩&#xff0c;到如今的国际巨星 她的每一步都充满了努力和汗水 她的舞蹈基础为她日后的演艺事业奠定了坚实的基础 而她对戏剧和电影的热爱更是让她在演艺道路上不断前行 从《我的父亲母亲》到《卧虎藏龙》&…

【CTF Web】CTFShow web5 Writeup(SQL注入+PHP+位运算)

web5 1 阿呆被老板狂骂一通&#xff0c;决定改掉自己大意的毛病&#xff0c;痛下杀手&#xff0c;修补漏洞。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\…