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 Axes3D

fig = 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 np

from mpl_toolkits.mplot3d import Axes3D

fig = 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 np

from mpl_toolkits.mplot3d import Axes3D

fig = 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 空间里绘制散点图的数据可视化任务。

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

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

相关文章

【openlayers系统学习】3.6-3.7添加可视化选择器,手动选择可视化的图像源

六、添加可视化选择器(选择可视化的图像类型) 在前面的示例中,我们已经看到了同一Sentinel-2图像的真彩色合成、假彩色合成和NDVI渲染。如果能让用户从这些可视化中选择一个或更多,而不必每次都更改我们的代码,那就太…

2024年顶级算法-黑翅鸢优化算法(BKA)-详细原理(附matlab代码)

黑翅鸢是一种上半身蓝灰色,下半身白色的小型鸟类。它们的显著特征包括迁徙和捕食行为。它们以小型哺乳动物、爬行动物、鸟类和昆虫为食,具有很强的悬停能力,能够取得非凡的狩猎成功。受其狩猎技能和迁徙习惯的启发,该算法作者建立…

C++利用TinyXML读取XML文件

TinyXML是什么? TinyXML是一个轻量级的C XML解析器,它提供了一种简单的方法来解析和操作XML文档。TinyXML被设计为易于使用和集成到C项目中,并且非常适合处理小型XML文件。 以下是TinyXML的一些主要特点和优点: 轻量级: T…

0基础从前端到Web3 —— Mine Clearance Frontend(二)

在一的基础上继续往下,本篇主要是链上调用部分,让整个项目可以进行最基本的扫雷游戏。 S u i M o v e \mathit {Sui\ Move} Sui Move 链上部署的自主实现的简单扫雷游戏可以点击查看,只不过这里将区域大小扩大为了 10 20 \text {10}\ \tim…

Plesk中如何移除之前添加的域名

我这边想要移除我之前绑定到主机的域名,但是不知道如何在主机上面进行移除,由于我使用的Hostease的Windows虚拟主机产品默认带普通用户权限的Plesk面板,但是不知道如何在Plesk上操作移除域名,因为也是对于Hostease主机产品不是很了…

python给图片加上图片水印

python给图片加上图片水印 作用效果代码 作用 给图片加上图片水印图片水印的透明度,位置可自定义 效果 原始图片: 水印图片: 添加水印后的图片: 代码 from PIL import Image, ImageDraw, ImageFontdef add_watermark(in…

联盟 | 歌者 AIPPT X HelpLook携手,开启企业高效办公新时代

面对日益增长的工作负荷和追求效率优化的压力,企业知识的积累与传播显得愈发重要。如何系统化地沉淀员工与企业的知识精华?如何快速分享内外部知识?更重要的是,如何在获取这些知识后,迅速将其转化为精美的PPT&#xff…

抖店一件代发,从0到1操作全流程

我是王路飞。 先说明一点,新手不需要纠结抖店一件代发(即无货源模式)还能不能做的问题。 无货源只是前期帮助新手阶段的你进入到这个市场里来的一种方式,不是你长期做店的思路。 入门之后,基本就转型为有货源去玩了…

漫画|基于SprinBoot+vue的漫画网站(源码+数据库+文档)

漫画网站 目录 基于SprinBootvue的漫画网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大…

node 版本对应的 node-sass 版本号

当我们在项目中使用 node-sass 时,电脑的 node版本号一定要与 node-sass 版本号对应,不对应时下载就会报错 ❌问题?node-sass: Command failed. ✅解决方案,可能是node 跟 node-sass版本不一致 1、查询node版本 node -v &#…

RabbitMQ - SimpleMessageListenerContainer的实现逻辑

RabbitMQ - SimpleMessageListenerContainer的实现逻辑 Queue(队列):在 RabbitMQ 中用于存储消息的数据结构。生产者将消息发送到队列中,而消费者从队列中接收消息。 Connection(连接):连接是应…

Unity 实现心电图波形播放(需波形图图片)

实现 在Hierarchy 面板从2D Object 中新建一个Sprite,将波形图图片的赋给Sprite。 修改Sprite 的Sprite Renderer 组件中Draw Mode 为Tiled, 修改Sprite Renderer 的Size 即可实现波形图播放。 在Hierarchy 面板从2D Object 中新建一个Sprite Mask 并赋以遮罩图片…

【学习笔记】Windows GDI绘图(六)图形路径GraphicsPath详解(中)

上一篇【学习笔记】Windows GDI绘图(五)图形路径GraphicsPath详解(上)介绍了GraphicsPath类的构造函数、属性和方法AddArc添加椭圆弧、AddBezier添加贝赛尔曲线、AddClosedCurve添加封闭基数样条曲线、AddCurve添加开放基数样条曲线、基数样条如何转Bezier、AddEllipse添加椭圆…

2024年了, 你还不会使用node.js做压力测试?

前些天刷抖音,看到网传的Java继父,求人攻击压测他的网站,这不得摩拳擦掌。 所以今天来聊聊如何对自己的项目、接口进行压力测试。 压力测试的目的 首先, 绝对不是为了压测、攻击别人的网站为乐。 1、探索线上系统流量承载的极限&#xff…

python批发模块的调试之旅:从新手到专家的蜕变

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、调试技巧的重要性 二、批发模块调试的实战演练 1. 设置断点 2. 逐行执行代码 3. 观察…

安全风险 - 检测Android设备系统是否已Root

在很多app中都禁止 root 后的手机使用相关app功能,这种场景在金融app、银行app更为常见一些;当然针对 root 后的手机,我们也可以做出风险提示,告知用户当前设备已 root ,谨防风险! 最近在安全检测中提出了一…

【博主推荐】HTML5实现520表白、情人节表白模板源码

文章目录 1.设计来源1.1 表白首页1.2 甜蜜瞬间11.3 甜蜜瞬间21.4 甜蜜瞬间31.5 甜蜜瞬间41.6 甜蜜瞬间51.7 甜蜜瞬间61.8 永久珍藏 2.效果和源码2.1 页面动态效果2.2 页面源代码2.3 源码目录2.4 更多为爱表白源码 3.源码下载地址 作者:xcLeigh 文章地址:…

行业首发 | MS08067-SecGPT(送邀请码)

一、简介 MS08067-SecGPT基于LLM大模型技术专门为网络安全领域设计的智能助手,集问答、分析、工具为一体的对话式安全专家,支持可以创建多会话问答。目的是辅助用户完成网络安全相关的工作,学员通过问答方式体验到SecGPT所具备的威胁情报分…

mySql从入门到入土

基础篇 在cmd中使用MYSQL的相关指令: net start mysql // 启动mysql服务 net stop mysql // 停止mysql服务 mysql -uroot -p1234//登录MYSQL(-u为用户名-p为密码) //登录参数 mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认1…