Python数据可视化(四)

news2024/11/14 17:52:16

实现图形的动画效果

在 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(),从而完成绘制动画的任务。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GVM: Golang多版本管理利器

本文介绍了 Go Version Manager 的功能和使用方法&#xff0c;介绍了如何通过 GVM 在系统上安装和管理多个 Go 语言版本。原文: GVM: Go Version Manager, for Golang manage multiple versions Go 版本管理器&#xff08;GVM&#xff0c;Go Version Manager&#xff09;是一款…

夏日炎炎,手机如何避免变成热源?这些降温技巧分享给你

夏日炎炎&#xff0c;手机也容易“中暑”。 高温不仅会让手机性能大打折扣&#xff0c;还可能引发安全隐患。因此&#xff0c;如何让手机在高温下“冷静”下来&#xff0c;成为了许多手机用户关心的问题。 本文将为你提供一些实用的降温技巧&#xff0c;帮助你的手机安全度过…

击穿盲点——【网络安全】社会工程学中的网络欺骗

社会工程学起源于上世纪60年代左右&#xff0c;是一种通过人际交流的方式来获得情报的非技术渗透手段。这种手段无需过多技术要求&#xff0c;却非常有效&#xff0c;目前已成为危害企业网络安全的重大威胁之一。著名黑客凯文米特尼克在《反欺骗的艺术》中曾提到&#xff0c;人…

【C++题解】1698. 请输出带有特殊尾数的数

问题&#xff1a;1698. 请输出带有特殊尾数的数 类型&#xff1a; 题目描述&#xff1a; 请输出1∼n 中所有个位为 1、3、5、7中任意一个数的整数&#xff0c;每行 1 个。( n<1000 ) 比如&#xff0c;假设从键盘读入 20&#xff0c;输出结果如下&#xff1a; 1 3 5 7 11 1…

08-Fortran基础--Fortran内置函数分类总结

08-Fortran基础--Fortran内置函数分类总结 0 引言1 Fortran内置函数1.1 常用到数学函数1.2 字符串函数&#xff1a;1.3 数组函数&#xff1a;1.4 数值查询函数1.5 文件操作函数&#xff1a; 2 结语 0 引言 Fortran是一种很古老的编程语言&#xff0c;但它仍然广泛使用于科学计算…

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

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

Vue从入门到实战Day07

一、vuex概述 目标&#xff1a;明确vuex是什么&#xff0c;应用场景&#xff0c;优势 1. 是什么&#xff1a; vuex是一个vue的状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;vuex是一个插件&#xff0c;可以帮助我们管理vue通用的数据&#xff08;多组件共享的…

【数据结构|C语言版】树、二叉树和堆

前言1. 树1.1 树的概念1.2 树的表示1.3 树在实际中的运用1.4 树的实现 2. 二叉树2.1 二叉树的概念和结构2.2 二叉树的性质2.3 二叉树的存储结构2.4 二叉树的代码实现 3. 堆4. 二叉树顺序结构的实现5. 二叉树链式结构的实现结语 #include<GUIQU.h> int main { 上期回顾: 【…

2024 一键批量下载雪球和东方财富文章导出excel和pdf

之前分享过雪球批量下载工具2023 批量下载雪球文章导出pdf&#xff0c;以市场高标解读这个号为例&#xff0c;下载效果&#xff1a; 下载文章后用我开发的htmltopdf.exe批量转换html为pdf&#xff0c;不过要注意不要放在中文目录下&#xff0c;否则提示错误 utf-8 codec cant d…

新建一个STM32工程(精简版)

一、新建一个STM32工程 二、建立三个文件夹 1、Start文件夹里的东西 &#xff08;1&#xff09;启动文件&#xff1a;STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm &#xff08;2&#xff09;STM32…

RobotFramework测试框架(13)--内置测试库

Builtln Evaluate方法 Evaluate。它可以做很多事情&#xff0c;主要的作用是可以直接调用Python的方法 一般用Evaluate都是前面放变量接收值&#xff0c;第三列是具体的运算表达式&#xff0c;第四列是要用到的Python的module。这里就是用random来进行一个随机数的生成 Cons…

买房送户口!多城加入“抢人大战”

业内人士认为&#xff0c;近期&#xff0c;多地推出的购房落户政策已区别于此前的人才落户政策&#xff0c;更聚焦于住房消费&#xff0c;降低了落户门槛&#xff0c;体现了各地对导入人口的重视&#xff0c;有利于人才流动&#xff0c;推动新型城镇化建设。 千万人口城市“后…

【C语言深度解剖】(16):C语言的文件读写操作

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏链接查看&…

Vue移动端登录页面

使用的是vant组件&#xff0c;引用和使用组件请去官网学习&#xff0c;链接↓vant组件官网 <div class"center"><!-- 背景图片 --><div class"background"><imgsrc"/assets/background.jpg"width"100%"heigh…

一篇文章教你入门Python

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Vue3解决“找不到模块“@/components/xxx.vue”或其相应的类型声明”

文章目录 前言背景问题描述解决方案总结 前言 在使用 Vue 3 开发项目时&#xff0c;遇到“找不到模块 ‘/components/xxx.vue’ 或其相应的类型声明”的错误是一个常见问题。这通常与 TypeScript 和模块解析相关的配置不当有关。本文将详细介绍如何解决此问题&#xff0c;确保…

LeetCode 1738.找出第 K 大的异或坐标值:二维前缀和——五彩斑斓的题解

【LetMeFly】1738.找出第 K 大的异或坐标值&#xff1a;二维前缀和 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-kth-largest-xor-coordinate-value/ 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, …

一文讲解——Java多态

目录 一、什么是多态&#xff1f;二、转型向上转型向下转型 三、方法覆盖与方法重载四、绑定动态绑定静态绑定 五、理解多态 一、什么是多态&#xff1f; 多态的词组字面意思是&#xff1a; 某种事物多种形态。 但是对于我们学习Java 的程序原来说&#xff0c;就不不能简单这样…

Jupyter Notebook:FileNotFoundError: [WinError 2] 系统找不到指定的文件怎么解决

打开Jupyter notebook时New 文件没有搭建的tensorflow环境&#xff0c;同时新建python3时&#xff0c;提示kernels 错误&#xff0c;提示信息&#xff1a;FileNotFoundError: [WinError 2] 系统找不到指定的文件。 由于Anaconda安装多个版本的python&#xff0c;或者由于多次卸…

55. UE5 RPG 处理当前功能在多人模式中的问题

在UE里面&#xff0c;我们运行项目可以设置多种网络模式&#xff0c;主要是分为三种&#xff1a; 运行Standalone 就是单人模式&#xff0c;没有网络交互以监听服务器运行&#xff0c;在界面里运行的游戏会作为服务器使用以客户端运行&#xff0c;UE会单独运行一个线程作为服务…