Python数据可视化(七)

绘制 3D 图形

到目前为止,我们一直在讨论有关 2D 图形的绘制方法和绘制技术。3D 图形也是数据可视化的 一个很重要的应用方面,我们接下来就重点讲解有关 3D 图形的实现方法。绘制 3D 图形通常需要导 入 mpl_toolkits 包中的 mplot3d 包的相关模块,如 axes3d 模块,模块 axes3d 中包含类 Axes3D,对象 Axes3D 可以在 2D 的 matplotlib 画布中绘制 3D 图形对象。

一,绘制带颜色标尺的彩色曲面

在 2D 画布中绘制 3D 图形时,绘制的本质就是绘制三维曲面,即由一对有序数对映射成的数据 值和有序数对所组成的三元元组在画布上的描点成面。这个三维曲面不仅可以着色,还可以按照曲 面的高度分别涂上不同的颜色,同时用颜色标尺进行注释,说明高度变化。接下来,我们就讲解带 颜色标尺的彩色曲面的绘制方法。

1.代码示例

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
from mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection="3d")x = np.arange(-3, 3, 0.25)
y = np.arange(-3, 3, 0.25)
x, y = np.meshgrid(x, y)
r = np.sqrt(np.power(x, 2) + np.power(y, 2))
z = np.sin(r)# plot 3d surface
surf = ax.plot_surface(x, y, z,rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0,antialiased=False)# customize the z axis
ax.set(zlim=(-1, 1))
ax.zaxis.set_major_locator(LinearLocator(7))
ax.zaxis.set_major_formatter(FormatStrFormatter("%3.2f"))# add a color bar mapping values to colors
fig.colorbar(surf, shrink=0.6, aspect=10)plt.show()

2.代码解释 

为了绘制 3D 图形,需要从 mpl_toolkits 包里的 mplot3d 包的 axes3d 模块中导入类 Axes3D,实 现在 2D 的 matplotlib 画布中绘制 3D 图形对象的目标。

(1)通过调用“plt.figure()”语句,生成类 Figure 的实例 fig。

(2)向画布 fig 中添加 3D 投影模式的子区,得到可以绘制 3D 图形的坐标轴实例 ax。 接下来,设置 x 轴、y 轴和 z 轴的数据内容。

(3)这样,我们就可以在坐标轴实例 ax 中,调用类 Axes3D 的实例方法 plot_surface()绘制曲 面了。通过参数 rstride 和 cstride 设置曲面上单位曲面的大小,参数 cmap 用于设置曲面补片的颜 色映射表类型。单位曲面(曲面补片)的衔接线的线条宽度设置为 0,以求突出曲面补片的颜色 变化情况。

(4)为了使 z 轴的刻度线和刻度标签更加清晰和直观,使用一组代码对 z 轴的刻度线和刻度标 签进行定制化设置,主要调整刻度线的数量和刻度标签的小数点位数。

(5)向画布中的曲面实例添加颜色标尺,通过参数 shrink 设置颜色标尺的整体大小,通过参数 aspect 设置标尺框的长和宽的比例。 这样,通过上面的 Python 代码,我们就完成了带颜色标尺的彩色曲面的绘制任务。

二,在3D 空间里分层展示投射到指定平面后的2D 柱状图

我们在 2D 平面上可以绘制柱状图,如果要绘制多组数据的柱状图,则可以尝试使用堆叠柱状 图或并列柱状图。但是,如果数据组数过多,那么使用这两种柱状图展示数据的可视化效果就不是 很理想。这时候,我们可以先将多组数据的柱状图投射到指定平面上,再借助指定坐标轴将投射后 的柱状图分层,从而在 3D 空间里实现多组数据的分层展示的 2D 柱状图的绘制任务。 

1.代码示例

import matplotlib.pyplot as plt
import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection="3d")colorsList = ["r", "b", "y"]
yLayersList = [2, 1, 0]for color, layer in zip(colorsList, yLayersList):x = np.arange(10)y = np.random.rand(10)ax.bar(x, y, zs=layer, zdir="y", color=color, alpha=.7)ax.set(xlabel="X", ylabel="Y", zlabel="Z", yticks=yLayersList)plt.show()

2.代码解释 

(1)需要从 mpl_toolkits 包里的 mplot3d 包的 axes3d 模块中导入类 Axes3D,实现在 2D 的 matplotlib 画布中绘制 3D 图形对象的目标。

(2)调用模块 pyplot 中的函数 figure(),生成类 Figure 的实例 fig。

(3)向画布 fig 中添加 3D 投影模式的子区,得到可以绘制 3D 图形的坐标轴实例 ax。

(4)分别设置柱状图的柱体颜色和柱状图投射层次的序号,分别存储在列表 colorsList 和 yLayersList 中。

(5)借助内置函数 zip(),获得颜色和层次序号的元组列表,通过 for 循环实现迭代绘制柱状图 的目标。

(6)在 for 循环中,需要重点说明语句块“ax.bar(x,y,zs=layer,zdir="y",color=color,alpha=.7)”的 作用,也就是类 Axes3D 的实例方法 bar()的使用方法。其中,参数 x 表示柱体左边位置的列表;参 数 y 表示柱体高度的列表;参数 zs 是将柱状图进行投射的层次序号;参数 zdir 是将 z 轴用来表示柱 体的高度,即将 y 轴设定成 z 轴;参数 zs 和 zdir 组合使用的效果就是在 y 轴的刻度线位置 2、1 和 0 处所在的与 z 轴所属平面平行的平面上绘制 2D 柱状图;参数 color 用于设置柱体的颜色;参数 alpha 用于设置柱体的透明度。这样,我们就将 2D 柱状图投射到 z 轴所属的平面上,再借助 y 轴分层展示投射到 z 轴所属平面上的 2D 柱状图,从而实现在 3D 空间里分层展示投射到指定平面 后的 2D 柱状图。

(7)通过调用实例方法 set(),统一设置 x 轴、y 轴和 z 轴的坐标轴标签,以及将 y 轴的刻度线位 置设置成投射层次的位置序号。类 Axes 的实例方法 set()是属性批量设置器,也就是说,可以将类 Axes 的若干属性设置一起放在实例方法 set()中来实现。

三,在 3D 空间里绘制散点图

我们可以在 2D 平面内绘制散点图,但在很多时候,出于实际项目需要,需要在 3D 空间里绘制 散点图。在 3D 空间里绘制散点图,就是在 x 轴和 y 轴之外再添加一条 z 轴后,使用三元有序数对在 3D 空间里进行描点。下面,我们就介绍在 3D 空间里绘制散点图的实现方法。

1.代码示例

import matplotlib.pyplot as plt
import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()ax = fig.add_subplot(projection = '3d')xs = np.random.rand(50) * 10
ys = np.random.rand(50) * 10 + 20
zs1 = np.random.rand(50) * 10
zs2 = np.sqrt(xs ** 2 + ys ** 2)ax.scatter(xs, ys, zs=zs1, zdir="z", c="cornflowerblue", marker="o", s=40)
ax.scatter(xs, ys, zs=zs2, zdir="z", c="purple", marker="^", s=40)ax.set(xlabel="X", ylabel="Y", zlabel="Z")plt.show()

2.代码解释 

与前面讲过的导入 3D 绘图模式一样,同样从 mpl_toolkits 包里的 mplot3d 包的 axes3d 模块中导 入类 Axes3D,实现在 2D 的 matplotlib 画布中绘制 3D 图形对象的目标。

(1)调用模块 pyplot 中的函数 figure(),生成类 Figure 的实例 fig。

(2)调用实例方法 add_subplot()获得 3D 模式下的坐标轴实例 ax。

(3)构建一组模拟数据 xs、ys、zs1 和 zs2,用于绘制 3D 空间里的散点图。

(4)调用类 Axes3D 的实例方法 scatter(),实例方法 scatter()的大部分参数与 2D 平面里的实例 方法 scatter()的大部分参数相同。这里需要重点说明的就是参数 zs。参数 zs 是与 xs 和 ys 数组长度 相同的数组,将 z 轴本身作为 z 坐标轴,这样,就会在 z 轴上的 zs 列表里的元素的位置处绘制由 xs 和 ys 的对应位置的元素所组成的有序数对的坐标点。

(5)调用“ax.set(xlabel="X",ylabel="Y",zlabel="Z")”语句,设置 x 轴、y 轴和 z 轴的坐标轴标签。 这样,通过上面的操作步骤,就可以完成在 3D 空间里绘制散点图的数据可视化任务。

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

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

相关文章

三、Gazebo中实现机器人仿真(小白上手)+ubuntu18.04

接上一篇文章 1、\导航 vim .bashrc \先采用Nanocar尝试导航 关闭终端:roslaunch robot_navigation gmapping.launch simulation:true rosrun teleop_twist_keyboard teleop_twist_keyboard.py 重启终端: cd catkin_ws source ./devel/setu…

护网经验面试题目原版

文章目录 一、护网项目经验1.项目经验**Hvv的分组和流程**有没有遇到过有意思的逻辑漏洞?有没有自己开发过武器/工具?有做过代码审计吗?有0day吗有cve/cnvd吗?有src排名吗?有没有写过技战法有钓鱼经历吗?具…

【数据结构】哈夫曼树和哈夫曼编码

一、哈夫曼树 1.1 哈夫曼树的概念 给定一个序列,将序列中的所有元素作为叶子节点构建一棵二叉树,并使这棵树的带权路径长度最小,那么我们就得到了一棵哈夫曼树(又称最优二叉树) 接下来是名词解释: 权&a…

VC++位移操作>>和<<以及逻辑驱动器插拔产生的掩码dbv.dbcv_unitmask进行分析的相关代码

VC位移操作>>和<<以及逻辑驱动器插拔产生的掩码dbv.dbcv_unitmask进行分析的相关代码 一、VC位移操作符<<和>>1、右位移操作符 >>&#xff1a;2、左位移操作符 <<&#xff1a; 二、逻辑驱动器插拔产生的掩码 dbv.dbcv_unitmask 进行分析的…

如何使用Suno:免费的AI歌曲生成器

文章目录 Suno AI 是什么&#xff1f;Suno AI 如何工作&#xff1f;选择Suno AI的理由&#xff1a;核心优势易于操作多样化创作灵活的定价策略版权保障技术突破 如何使用Suno AI创作歌曲&#xff1f;第1步&#xff1a;注册Suno AI账户第2步&#xff1a;输入提示词创建第 3 步&a…

作业-day-240522

思维导图 使用IO多路复用实现并发 select实现TCP服务器端 #include <myhead.h>#define SER_IP "192.168.125.112" #define SER_PORT 8888int main(int argc, const char *argv[]) {int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd -1){perror("socket er…

脆皮之“字符函数与字符串函数”宝典

hello&#xff0c;大家好呀&#xff0c;感觉我之前有偷偷摸鱼了&#xff0c;今天又开始学习啦。加油&#xff01;&#xff01;&#xff01; 文章目录 1. 字符分类函数2. 字符转换函数3. strlen的使用和模拟实现3.1 strlen 的使用3.1 strlen 的模拟1.计算器方法2.指针-指针的方…

Python的shutil模块探索,文件操作的瑞士军刀

hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎关注交流。 希望可以持续更新一些有意思的文章&#xff0c;如果觉得还不错&#xff0c;欢迎点赞关注&#xff0c;有啥想说的&#xff0c;可以留…

每周刷题第三期

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏&#xff1a;Python 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 目录 题目一&#xff1a;环形链表 题目二&#xff1a;删除有序数组中的重复项 题目三&#xff1a;有效的括号 题…

从左上角到右下角的最小距离和

题目描述&#xff1a;给定一个二维数组matrix&#xff0c;一个人必须从左上角出发&#xff0c;最后到达右下角&#xff0c;沿途只可以向下或者向右走&#xff0c;沿途的数字都累加就是距离累加和&#xff0c;返回最小距离累加和。 way&#xff1a;无他&#xff0c;dp[i] [j]表…

《队列》

描述 学校体操队到操场集合&#xff0c;排成每行2人&#xff0c;最后多出1人;排成每行3人&#xff0c;也多出1人。分别排成每行4、5、6人&#xff0c;都多出1人。当排成每行7人时&#xff0c;正好不多,求校体操队至少多少人。 输入描述 无 输出描述 满足要求的人数 样例输入…

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…

shell遍历路径所有文件并把列表写成字符串遍历

1. ls dir/* | tr ‘\n’ ’ ’ 换行替换成空格 你可以使用 ls 命令和 tr 命令来将文件列表根据空格拼接起来成一个字符串。以下是一个示例&#xff1a; ls dir/* | tr \n 解释 ls dir/*&#xff1a;列出 dir 目录下的所有文件。tr \n &#xff1a;将所有的换行符&#xf…

ChatGPT生成常见面试题【面试准备】

ChatGPT生成常见面试题【面试准备】 前言版权ChatGPT生成常见面试题【面试准备】MySQL面试问题与回答1. 数据库连接与操作2. 索引和查询优化3. 事务管理4. 索引是什么&#xff1f;为什么使用索引可以提高查询性能&#xff1f;如何在MySQL中创建索引&#xff1f;5. SQL查询优化有…

Varjo XR-4功能详解:由凝视驱动的XR自动对焦相机系统

Varjo是XR市场中拥有领先技术的虚拟现实设备供应商&#xff0c;其将可变焦距摄像机直通系统带入到虚拟和混合现实场景中。在本篇文章中&#xff0c;Varjo的技术工程师维尔蒂莫宁详细介绍了这项在Varjo XR-4焦点版中投入应用的技术。 对可变焦距光学系统的需求 目前所有其他XR头…

WPF之容器标签之Canvas布局标签

Canvas: 定义一个区域&#xff0c;可在其中使用相对于 Canvas 区域的坐标以显式方式来定位子元素。 实例 可以在子标签使用Canvas属性设置定位 <Canvas Width"500" Height"300"><StackPanel Width"100" Height"100"Backgro…

网页抓取之requests库的使用

Python网络数据采集利器 - Requests库的使用指南 简介 在Python网络爬虫领域,优秀的第三方库Requests可谓是必学的重要工具。它提供了相当人性化的API,让我们能够用极其简洁的代码发送HTTP/HTTPS请求,并且自动处理cookies、headers、编码等诸多繁琐细节,大大减轻了网页抓取的…

【pdb的使用方法】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、 pdb 是什么&#xff1f;二、基本用法1.启动 PDB 调试器&#xff1a;2.单步执行代码&#xff1a;3.查看变量值&#xff1a;4.退出调试器&#xff1a; 三、高级用…

指数分布的理解,推导与应用

指数分布的定义 在浙大版的教材中&#xff0c;指数分布的定义如下&#xff1a; 若连续型的随机变量 X X X的概率密度为&#xff1a; f ( x ) { 1 θ e − x θ , x>0 0 , 其他 f(x) \begin{cases} \frac{1}{\theta} e^{-\frac{x}{\theta}}, & \text{x>0}\\ 0, &a…

mvn编译所有单元测试报错OOM

org.mockito.exceptions.base.MockitoException: Cannot instantiate InjectMocks field named ‘productLogic’ of type ‘class .ProductLogic’. You haven’t provided the instance at field declaration so I tried to construct the instance. However the constructo…