Python | NumPy | 3D 数据可视化 - 散点图

article/2025/9/18 5:39:39

本文介绍如何使用NumPy相关的数据实现数据的3D散点图可视化。
Updated: 2022 / 03 / 06


Python | NumPy | 3D 数据可视化 - 散点图

  • 数据导入及清洗
    • 导入
    • 清洗
      • 获取全部坐标
      • 筛选特定坐标
  • 数据3D可视化
    • 散点图
      • 单图
      • 多子图
  • 参考链接


数据导入及清洗

先导入坐标集数据,再进行针对性的数据清洗。

请点击此处来下载原数据文件(.npy)。

导入

这个坐标集数据是以[a, b, c, d]的形式集合,其中[a, b, c]视为坐标[x, z, y]以及[d]视为相应坐标的ID
以下方导入的示例数据中的[2, 2, 1920, 480]为例,[2, 2, 1920]对应坐标系中的[x, z, y][480]仅仅为[2, 2, 1920]ID识别码。

DATA = np.load('Exampledata_3D_scatter.npy')
'''
[([   2,    2, 1920,  480],) ([   1,    3, 1923,  480],)......([   4,    1, 1920,  480],) ([   3,    0, 1922,  480],)......([   3,    3, 1923,  480],)]⬆️ .shape, (69,)
⬆️ data.dtype, [('f0', '<i8', (4,))]
⬆️ type(data), <class 'numpy.ndarray'>
⬆️ type(data[0]), <class 'numpy.void'>
'''

其中,对于numpy.void12的处理, 截止目前为止,有2种方法:

  • np.array([DATA[i][0] for i in range(DATA.shape[0])])
data = np.array([DATA[i][0] for i in range(DATA.shape[0])])
'''
[[   2    2 1920  480]
......[   3    3 1923  480]]
⬆️ data.shape, (69, 4); data.dtype, [('f0', '<i8', (4,))]; type(data), <class 'numpy.ndarray'>data[-1], ([   3,    3, 1923,  480],)
⬆️ type(data[-1]), <class 'numpy.void'>; data[-1].dtype, [('f0', '<i8', (4,))]
'''
  • np.array(DATA.tolist()).squeeze(axis=1)
data = np.array(DATA.tolist()).squeeze(axis=1)
'''
DATA.tolist()
[(array([   2,    2, 1920,  480]),), ..., (array([   3,    3, 1923,  480]),)]
⬆️ type(DATA.tolist()), <class 'list'>np.array(DATA.tolist())
[[[   2    2 1920  480]][[   1    3 1923  480]]
....[[   3    3 1923  480]]]
⬆️ np.array(DATA.tolist()).shape, (69, 1, 4); np.array(DATA.tolist()).dtype, int64; type(np.array(DATA.tolist())), <class 'numpy.ndarray'>; np.array(DATA.tolist()).squeeze(axis=1)
[[   2    2 1920  480][   1    3 1923  480]
......[   3    3 1923  480]]
⬆️ np.array(DATA.tolist()).squeeze(axis=1).shape, (69, 4); np.array(DATA.tolist()).squeeze(axis=1).dtype, int64; 
type(np.array(DATA.tolist()).squeeze(axis=1)),<class 'numpy.ndarray'>
'''
data = np.array(DATA.tolist()).squeeze(axis=1)
'''
[[   2    2 1920  480][   1    3 1923  480]
......[   3    3 1923  480]]
⬆️ np.array(DATA.tolist()).squeeze(axis=1).shape, (69, 4); np.array(DATA.tolist()).squeeze(axis=1).dtype, int64; type(np.array(DATA.tolist()).squeeze(axis=1)),<class 'numpy.ndarray'>
'''

清洗

获取全部坐标

[2, 2, 1920, 480]为例,[2, 2, 1920]对应坐标系中的[x, z, y],我们只在意第0、1、2列。而此处有3列。为达到目的,可以使用np.hsplit3[:, 0:3]4来进行数组的切片。

X, Y, Z = np.hsplit(data[:, 0:3], 3)
'''
[[2]...[3]]
⬆️ X.shape, (69, 1)[[2]...[3]]
⬆️ Y.shape, (69, 1)[[1920]...[1923]]
⬆️ Z.shape, (69, 1)
'''

如果试图切割数组的所有列为单独的数组,
x, y, z, m = np.hsplit(data, data.shape[1])


筛选特定坐标

[ 7 3 1923 480]为例,对应坐标系中的[7, 3, 1923],我们只在意坐标集中x为7的坐标,因此为达到目的可以使用np.where(condition, x, y)56来对数组进行筛选。

x7 = data[np.where(data[:, 0]==7)]
'''
[[   7    3 1923  480]...[   7    1 1921  480]]
⬆️ x7.shape, (9, 4); x7.dtype, int64; type(x7), <class 'numpy.ndarray'>
'''x7x, x7y, x7z = np.hsplit(x7[:, 0:3], 3)
'''
[[7]......[7]]
⬆️ x7x.shape, (9, 1)[[3]......[1]]
⬆️ x7y.shape, (9, 1)[[1923]......[1921]]
⬆️ x7z.shape, (9, 1)
'''

数据3D可视化

此部分使用清洗中给出的示例数据介绍如何将数据实现3D可视化。

引入所需的库,

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

3D可视化的实现可参考78910

散点图

在这里插入图片描述

  • 注释111213
  • 字体14
  • 坐标轴
    [1] 尺寸15
    [2] 刻度161718
    [3] 标签19
  • 图例9
  • 标题20
  • 保存21

单图

fig = plt.figure(figsize=(6, 6))
ax = plt.axes(projection='3d')# [7, y, z, ID]
i = 7
xi = data[np.where(data[:, 0] == i)]
xix, xiy, xiz = np.hsplit(xi[:, 0:3], 3)
ax.scatter3D(xix, xiy, xiz, s=40, c=xiz, marker='o', alpha=0.8, edgecolor='white')# ticks
tickls, tickc = 5, 'black'
xmin, xmax = data[:, 0].min(), data[:, 0].max()
ymin, ymax = data[:, 1].min(), data[:, 1].max()
zmin, zmax = data[:, 2].min(), data[:, 2].max()
ax.set_xlim(xmin=xmin-1, xmax=xmax+1)
ax.set_xticklabels(range(xmin-1, xmax+1, 1), color=tickc)
ax.tick_params(axis='x', labelsize=tickls)
ax.set_ylim(bottom=ymin - 1, top=ymax + 1)
ax.set_yticklabels(range(ymin - 1, ymax + 1, 1), color=tickc)
ax.tick_params(axis='y', labelsize=tickls)
ax.set_zlim(bottom=zmin - 1, top=zmax + 1)
ax.set_zticklabels(range(zmin - 1, zmax + 1, 1), color=tickc)
ax.tick_params(axis='z', labelsize=tickls)# test
for idx in range(xi.shape[0]):ax.text(x=xix[idx][0], y=xiy[idx][0], z=xiz[idx][0], s=xi[idx][1:3], zdir='x', fontsize=5)# labels
labelfd = {'size': 8, 'color': 'black'}
ax.set_xlabel('X', fontdict=labelfd)
ax.set_ylabel('Y', fontdict=labelfd)
ax.set_zlabel('Z', fontdict=labelfd)# title
ax.set_title(f"x={i}", loc='left', fontsize=8)
plt.suptitle("Single(x=7)", x=0.5, y=0.92, fontsize=16, color='red')
plt.savefig("NumPy_Ex1_3Dscatter_Single(x=7).png", dpi=300)

效果图如下所示:
在这里插入图片描述

多子图

  • 子图2223
fig = plt.figure(figsize=(12, 12))
for i in range(8):ax = fig.add_subplot(2, 4, i+1, projection='3d')                                    # create subplotx7 = data[np.where(data[:, 0] == 7)]x7x, x7y, x7z = np.hsplit(x7[:, 0:3], 3)                                            # [0~7, y, z, ID]ax.scatter3D(x7x, x7y, x7z, s=40, c=x7z, marker='o')# tickstickls, tickc = 5, 'black'xmin, xmax = data[:, 0].min(), data[:, 0].max()ymin, ymax = data[:, 1].min(), data[:, 1].max()zmin, zmax = data[:, 2].min(), data[:, 2].max()ax.set_xlim(xmin=xmin - 1, xmax=xmax + 1)ax.set_xticklabels(range(xmin - 1, xmax + 1, 1), color=tickc)ax.tick_params(axis='x', labelsize=tickls)ax.set_ylim(bottom=ymin - 1, top=ymax + 1)ax.set_yticklabels(range(ymin - 1, ymax + 1, 1), color=tickc)ax.tick_params(axis='y', labelsize=tickls)ax.set_zlim(bottom=zmin - 1, top=zmax + 1)ax.set_zticklabels(range(zmin - 1, zmax + 1, 1), color=tickc)ax.tick_params(axis='z', labelsize=tickls)# annotationfor idx in range(x7.shape[0]):ax.text(x=x7x[idx][0], y=x7y[idx][0], z=x7z[idx][0], s=x7[idx][1:3], zdir='x', fontsize=3)# labelslabelfd = {'size': 8, 'color': 'black'}ax.set_xlabel('X', fontdict=labelfd)ax.set_ylabel('Y', fontdict=labelfd)ax.set_zlabel('Z', fontdict=labelfd)# titleax.set_title(f"x={7}", loc='right', fontsize=8)plt.suptitle("x=7", x=0.5, y=0.88, fontsize=16, color='red')
plt.savefig("8*Subplots(x=7).png", dpi=300)

效果图如下所示:
在这里插入图片描述


参考链接

%数据处理

% 画图

% 注释

%坐标轴

% 图例

%标题

% 保存


  1. python – numpy.void类型 – 如何使用它? ↩︎

  2. Extract an ndarray from a np.void array ↩︎

  3. numpy——hsplit函数、vsplit函数、array_split函数 ↩︎

  4. Numpy 笔记(二): 多维数组的切片(slicing)和索引(indexing) ↩︎

  5. numpy.where() 用法详解 ↩︎

  6. numpy ndarray 按条件筛选数组,关联筛选 ↩︎

  7. 使用Matplotlib绘制3D图形 ↩︎

  8. Python三维绘图–Matplotlib ↩︎

  9. python matplotlib 图像可视化 一 (论文画图参考) ↩︎ ↩︎

  10. matplotlib点线 坐标刻度 3D图绘制(六) ↩︎

  11. Text annotations in 3D ↩︎

  12. Matplotlib 标记散点 ↩︎

  13. Matplotlib中annotate详解 ↩︎

  14. Change Font Size in Matplotlib ↩︎

  15. matplotlib画3D图形时设置z轴尺寸 ↩︎

  16. python设置坐标轴刻度值字体大小,刻度值范围,标签大小 ↩︎

  17. Matplotlib入门-2-坐标轴axis/axes设置 ↩︎

  18. Matplotlib中修改坐标轴刻度线的属性 ↩︎

  19. 如何在 Matplotlib 中设置刻度标签 xticks 字体大小 ↩︎

  20. matplotlib之pyplot模块之标题(title()和suptitle()) ↩︎

  21. 【Python】解决使用 plt.savefig 保存图片时一片空白 ↩︎

  22. python在for循环中绘制多个3D子图 ↩︎

  23. 5.Matplotlib绘图之3D图,subplot子图(多图合一),动态图 ↩︎


http://chatgpt.dhexx.cn/article/k1QdV3hC.shtml

相关文章

使用 Learner Lab - 使用 API Gateway 与 Lambda 上传图片到 S3

使用 Learner Lab - 使用 API Gateway 与 Lambda 上传图片到 S3 AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务&#xff0c;让学生可以在 100 USD的金额下&#xff0c;自行练习所要使用的 AWS 服务&#xff0c;如何进入 Learner Lab 请参考 使用 Lear…

12306查询车票(爬虫小练_1)

文章目录 导入模块导入City.json文件内容分析撸代码city.json文件 导入模块 # 数据请求模块 import requests # 序列化和反序列化 import json # 表格格式输出&#xff08;美化输出&#xff09; import prettytable as pt 导入City.json文件 里面存放的是城市的对应标识(放在文…

K8S+Jenkins+Harbor+Docker+gitlab集群部署

K8SJenkinsHarborDockergitlab服务器集群部署 所需资源下载地址 将此文章写给我最心爱的女孩 目录 K8SJenkinsHarborDockergitlab服务器集群部署1.准备以下服务器2.所有服务器统一处理执行2.1 关闭防火墙2.2 关闭selinux2.3 关闭swap&#xff08;k8s禁止虚拟内存以提高性能&a…

多项式运算

多项式求逆 已知 f ( x ) f(x) f(x)&#xff0c;求 g ( x ) g(x) g(x)满足 f ( x ) g ( x ) ≡ 1 ( m o d x n ) f(x)g(x)\equiv 1\pmod{x^n} f(x)g(x)≡1(modxn)。 若 f 0 0 f_00 f0​0&#xff0c;那么显然不可能存在形式幂级数 g ( x ) g(x) g(x)满足条件。于是假定 f 0 …

Beyond Accuracy:Behavioral Testing of NLP Models with Checklist 论文阅读

本文主要介绍以及翻译一篇ACL2020 Best Paper Beyond Accuracy:Behavioral Testing of NLP Models with Checklist Abstract 尽管传统评估模型好坏的方法是在测试集上观察accuracy指标&#xff0c;然而这个指标常常高估了NLP模型的真实表现&#xff0c;而另外一些评估模型的方法…

国密 SM4 高并发服务 加压测服务 加生成秘钥 结合上篇一起使用 国密 SM2 SM3 SM4 后续升级版本,内容丰富单独写一篇百万压测4000毫秒加解密

介绍 这篇是专门适用于高并发场景的加解密功能服务&#xff0c;提供了并发代码 &#xff0c;压测代码 以及压测报告结合上篇文章一起使用最好&#xff0c;先看上篇在看这篇&#xff0c;循序渐进&#xff0c;上篇主要看SM4 方面即可其他概要观看即可&#xff0c;有需要可以看看也…

创建dependencies.gradle文件报错

创建AS项目统一管理build.gradle但是报错 1.Only Project and Settings build scripts can contain plugins {} blocks 大概意思&#xff0c;是使用plugins目前还不能在自己创建的gradle文件中使用所以还是需要使用apply plugin 2.dependencies.gradle No signature of method…

JCE cannot authenticate the provider BC

我是用hutool做RSA加密时候出现这个问题的&#xff0c;具体原因网上各说各的&#xff0c;解决办法也试过下载jar、配置jvm&#xff0c;用是能用&#xff0c;但是我们是在公共包写的&#xff0c;部署新服务的时候就麻烦了。 看了下hutool报错的地方&#xff0c;顺着找了找&#…

JDK8安装JCE无限强度

原文&#xff1a;https://www.jianshu.com/p/de81059a9e97 https://blog.csdn.net/arctan90/article/details/68066660 报错提示&#xff1a; Exception in thread "main" org.jasypt.exceptions.EncryptionOperationNotPossibleException: 下载jar&#xff1a;h…

java jce配置_jce_policy安装【java密码扩展无限制权限策略文件安装】

下载与JDK或JRE对应版本的jce文件包&#xff0c;当前机器的jdk为1.8&#xff0c;所以下载jce_policy-8.zip。 下载解压后&#xff0c;把jar文件上传到需要安装jce机器上JDK或JRE的security目录下&#xff0c;覆盖源文件即可。 JDK&#xff1a;将两个jar文件放到%JDK_HOME%\jre\…

java jce配置_配置jce开发环境 | 学步园

虽然JDK1.4将java安全包包含在核心库中&#xff0c;但如果不对jce进行配置&#xff0c;也没办法使用jce进行开发。 首先从sun网上下载jce1.2.2(我在网上看到的都是下载一个包&#xff0c;没用sun默认的)&#xff0c;然后把解压得到的lib里面的所有jar文件拷到your_jdk\jre\lib\…

java jce-KeyGenerator(密钥生成)

java jce-KeyGenerator&#xff08;密钥生成&#xff09; 在开发时&#xff0c;总要涉及到数据的加密与解密&#xff0c;之前一直有些糊涂&#xff0c;最近看了 jce.jar的源码&#xff0c;来整理记录一下 接着上篇 java jce-Cipher&#xff08;加密、解密&#xff09; 来介绍…

java jce-Cipher(加密、解密)

java jce-Cipher&#xff08;加密、解密&#xff09; 在开发时&#xff0c;总要涉及到数据的加密与解密&#xff0c;之前一直有些糊涂&#xff0c;最近看了 jce.jar的源码&#xff0c;来整理记录一下 1、概念 JCA&#xff08;Java Cryptography Architecture&#xff09;: J…

什么是文件扩展名 JCE?

有没有人给您发送过 JCE文件&#xff0c;而您却不知道该如何打开&#xff1f;可能您在电脑上发现了一个 JCE文件却不知道这是做什么用的&#xff1f;Windows 可能会告诉您无法打开文件&#xff0c;或者最糟糕的是&#xff0c;您可能会收到一个JCE文件相关的错误信息。 打开JCE文…

JAVA加密--JCA、JCE、CSP概念、体系架构与使用示例

1 概念 JCA: Java密码体系结构 Java Cryptography Architecture JCE&#xff08;Java Cryptography Extension&#xff09;&#xff0c;在早期JDK版本中&#xff0c;由于受美国的密码出口条例约束&#xff0c;Java中涉及加解密功能的API被限制出口&#xff0c;所以Java中安全组…

JCE的功能分析

什么是JCE JCE&#xff08;Java Cryptography Extension&#xff09;即Java密码扩展&#xff0c;是JDK1.4的一个重要部分。它是一组包&#xff0c;它们提供用于加密、密钥生成算法和协商以及 Message Authentication Code&#xff08;MAC&#xff09;算法的框架和实现。 它提…

第四章 数据关联分析方法

基本概念和方法 关联规则和算法应用 基本概念和术语 关联规则算法应用&#xff1a; 一个关联规则分析的例子—————超市购物篮分析 不要看 后面数字看不懂 项集&#xff1a;是指项的集合。包含k个项的项集称为k-项集 支持度&#xff1a;若A是一个项集&#xff0c;则A的…

关联性——典型相关分析

1、作用 典型相关分析是研究多个变量和多个变量之间的线性相关关系&#xff0c;能够揭示出两组变量之间的内在联系。首先在每组变量中找到变量的线性组合&#xff0c;使得两组的线性组合之间具有最大的相关系数。然后选取和最初挑选的这对线性组合不相关的线性组合&#xff0c…

数据挖掘——关联分析基础介绍(上)

一、前提介绍&#xff1a; 啤酒与尿布&#xff1a; 在美国有婴儿的家庭中&#xff0c;一般是母亲在家中照看婴儿&#xff0c;年轻的父 亲前去超市购买尿布。父亲在购买尿布的同时&#xff0c;往往会顺便为自己购 买啤酒&#xff0c;这样就会出现啤酒与尿布这两件看上去不相干…

R语言做关联分析

目录 &#xff08;一&#xff09;案例简介 案例使用 数据预处理 分析结果 完整代码 目录 关联分析 理解关联分析的相关概念&#xff1a;关联分析、支持度、置信度、强规则、项集、频繁项集等。 掌握关联分析的基本方法&#xff1a;数据是事务的或关系的&#xff0c;如何由大量…