当前位置: 首页 > news >正文

Matplotlib精品学习笔记001——绘制3D图形详解+实例讲解

3D图片更生动,或许在时间序列数据的展示上更胜一筹

想法: 学习3D绘图的想法来自科研绘图中。我从事的专业是古植物学,也就是和植物化石打交道。化石有三大信息:1.物种信息,也就是它的分类学价值;2.时间信息,也就是它的存在时间;3.地理信息,即它在过去某时存在于某地。

要想在一张图里展示同时展示这些信息并不容易,因为研究工作通常涉及一个类群,该类群存在的化石记录少则几条,多则几百条,如何合理地展示出来是一项不小的考验。

原先的做法: 首先回顾一下化石的三大信息:物种、时间、地理。如果要在地图上标注化石坐标,需要明确:1.现在发现化石的经纬度并不是过去它存在时的经纬度,换句话说,它生活的板块在漂移。2.也就表明全球地图是不断变化的,不同时间存在的化石应画在对应的古地图上。
所以,大部分人的做法,或者说现在的展现方法要么是在当今地图上把所有化石标注出来,要么挑几个大的时间段古地理图,把化石分别标注上去。

我的想法: 计算化石的古地理坐标并在古地理图上标注的方法很多,之前在GPlates上做过,并且有动态展示,但是无法用于科研文章中。而如果把每块化石标注在对应时间的古地理图上有会太多而没有意义。
虽然我的想法可能已经有人想到并尝试过,由目前尚无类似科研绘图来看,很可能行不通。我也大致猜想了一下行不懂的原因:首先,如果化石点没有标注在地理图上,那就没有展示意义,所以要向Z轴里插卡片一样插入古地理图。如此一来,古地理图间的阴影几乎肯定让图形不可示人。
反过来说,如果只展示化石点,那么无法直观地看到化石在地图上的呈现。也是没有意义的。如果用波面展示能反映出化石的经纬度变化,但也是没有意义的,因为化石记录不可能完全展现类群的演化历史,所以经纬度的上下波动没有研究价值。按统计学的思维来说,就是样本量缺失导致分析结果不可信。

说了这么多打击自己的话,但还是要自己撞一回南墙才知道有多疼。

要解决的坎:

  1. 计算古地理坐标,有大量算法支持,不算难事
  2. 以化石的古地理经度(X轴)、古地理纬度(Y轴)和年龄(Z轴)绘制3D图形,写完本文可就会了,不算事
  3. 如果展示古地理图。不知matplotlib能否向Z轴插入底图,有则最好,无则尽力解决。如果没法解决,需要思考别的展现地理信息的方式,需要思考,需要灵感。

预备工作

总而言之,要达到我的目标,必须要对matplotlib能绘制哪些3D图做到心中有数,所以本文及后续会完成3D图形绘制学习。

学习3D绘图

在3D坐标轴上绘制2D数据

学习资料: matplotlib3D绘图简例

以下示例使用ax.plot()的zdir关键字参数,将2D数据绘制到3D坐标轴上。
在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as npax = plt.figure().add_subplot(projection='3d')x = np.linspace(0, 1, 100)
y = np.sin(x*2*np.pi) / 2 + 0.5ax.plot(x, y, zs=0, zdir='z', label='curve in (x,y)')colors = ('r', 'g', 'b', 'k')np.random.seed(19680801)x = np.random.sample(20*len(colors))
y = np.random.sample(20*len(colors))
c_list = []for c in colors:c_list.extend([c]*20)ax.scatter(x, y, zs=0, zdir='y', c=c_list, label='points in (x,z)')ax.legend()
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_zlim(0, 1)ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')ax.view_init(elev=20., azim=-35, roll=0)plt.show()

在运行上述代码时遇到的问题及解决方法

TypeError: Axes3D.view_init() got an unexpected keyword argument ‘roll‘

绘制3D柱状图

演示如何绘制有阴影和没有阴影的3D条形图。

import numpy as np
import matplotlib.pyplot as plt# set up the figure and axes
fig = plt.figure(figsize=(8, 3))
ax1 = fig.add_subplot(121, projection='3d')
ax2 = fig.add_subplot(122, projection='3d')# fake data
_x = np.arange(4)
_y = np.arange(5)
_xx, _yy = np.meshgrid(_x, _y)
x, y = _xx.ravel(), _yy.ravel()top = x + y
bottom = np.zeros_like(top)
width = depth = 1ax1.bar3d(x, y, bottom, width, depth, top, shade=True)
ax1.set_title('Shaded')ax2.bar3d(x, y, bottom, width, depth, top, shade=False)
ax2.set_title('Not Shaded')plt.show()

在这里插入图片描述

在不同的平面上创建二维条形图

演示了如何制作一个3D图形,该图形将二维条形图投影到平面y=0, y=1等。

import matplotlib.pyplot as plt
import numpy as np# Fixing random state for reproducibility
np.random.seed(19680801)fig = plt.figure()
ax = fig.add_subplot(projection='3d')colors = ['r', 'g', 'b', 'y']
yticks = [3, 2, 1, 0]
for c, k in zip(colors, yticks):# Generate the random data for the y=k 'layer'.xs = np.arange(20)ys = np.random.rand(20)# You can provide either a single color or an array with the same length as# xs and ys. To demonstrate this, we color the first bar of each set cyan.cs = [c] * len(xs)cs[0] = 'c'# Plot the bar graph given by xs and ys on the plane y=k with 80% opacity.ax.bar(xs, ys, zs=k, zdir='y', color=cs, alpha=0.8)ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')# On the y-axis let's only label the discrete values that we have data for.
ax.set_yticks(yticks)plt.show()

在这里插入图片描述

这个效果图和我想要达到的效果比较相近,只要把Y轴上的每个柱形图换为带有化石标定点的古地理图即可。但从本土来看,或许太多个图形看起来不清楚,上图仅是单色柱形图就难以观察到后面的情况,如果是色彩更复杂的地理图,效果不知会有多差。

未完待续

相关文章:

Matplotlib精品学习笔记001——绘制3D图形详解+实例讲解

3D图片更生动,或许在时间序列数据的展示上更胜一筹 想法: 学习3D绘图的想法来自科研绘图中。我从事的专业是古植物学,也就是和植物化石打交道。化石有三大信息:1.物种信息,也就是它的分类学价值;2.时间信息…...

学习ifconfig实战技巧,成为网络管理高手

文章目录前言一. ifconfig 命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示网络设备信息3.2 启动和关闭指定的网卡3.3 对指定的网卡设备执行修改IP地址操作3.4 启动和关闭ARP协议3.5 使用ifconfig添加网卡总结前言 大家好,又见面了,我是沐风晓月&a…...

day38|70. 爬楼梯(进阶)、322. 零钱兑换、279.完全平方数

70. 爬楼梯(进阶) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2…...

SpringBoot全局异常处理

一、目的 当客户端/前端向服务端发送一个请求后,这个请求并不是每次都能完全正确的处理,比如出现一些资源不存在、参数错误或者内部错误等信息的时候,就需要将异常反馈给客户端或者前端。那么这就需要程序有完整的异常处理机制。 在 Java 中所…...

SpringBoot异常处理

目录 一、 错误处理 1. 默认规则 2. 定制错误处理逻辑 二、自定义异常处理 1. 实现 ErrorController 2. RestControllerAdvice/ControllerAdvice ExceptionHandler 实现自定义异常 3. 新建 UserController.class 测试 3 种不同异常的处理 4. 最终效果如下 补充 1. 参…...

《C++ Primer Plus》(第6版)第8章编程练习

《C Primer Plus》(第6版)第8章编程练习《C Primer Plus》(第6版)第8章编程练习1. 打印字符串2. CandyBar3. 将string对象的内容转换为大写4. 设置并打印字符串5. max5()6. maxn()7. SumArray()《C Primer Plus》(第6版…...

RAD Studio 11.3 Alexandria Crack

RAD Studio 11.3 Alexandria Crack 瞄准最新平台版本-此版本增加了对Android 13和Apple macOS Ventura的官方支持。它还支持Ubuntu 22 LTS和Microsoft Windows Server 2022。 使用生物特征认证-New为FireMonkey移动应用程序提供了新的移动生物特征认证组件。 部署嵌入式InterBa…...

Stm32 iic 协议使用

/* 第1个参数为I2C操作句柄 第2个参数为从机设备地址 第3个参数为从机寄存器地址 第4个参数为从机寄存器地址长度 第5个参数为发送的数据的起始地址 第6个参数为传输数据的大小 第7个参数为操作超时时间 */ HAL_I2C_Mem_Write(&hi2c2,salve_add,0,0,PA_BUFF,sizeof(PA_BUFF…...

Malware Dev 02 - Windows SDDL 后门利用之 SCManager

写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我拥有 OSCP,OSEP,OSWE,OSED&…...

每日一题29——山峰数组的顶部

符合下列属性的数组 arr 称为 山峰数组&#xff08;山脉数组&#xff09; &#xff1a; arr.length > 3 存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] < arr[1] < ... arr[i-1] < arr[i] arr[i] > arr[i1] > ... &g…...

Linux- 系统随你玩之--好用到炸裂的系统级监控、诊断工具

文章目录1、前言2、lsof介绍2.1、问题来了&#xff1a; 所有用户都可以采用该命令吗&#xff1f;3、 服务器安装lsof3.1、安装3.2、检查安装是否正常。4、lsof 命令4.1、常用功能选项4.2、输出内容4.2.1 、FD和 TYPE列5、 lsof 命令实操常见用法6 、常用组合命令7、 结语1、前言…...

第十三节 继承

什么是继承&#xff1f; java中提供一个关键字extends&#xff0c;用这个关键字&#xff0c;我们可以让一个类和另一个类建立父子关系。 public class Student extends People{} student为子类&#xff08;派生类&#xff09;&#xff0c;people为父类&#xff08;基类或者超类…...

【优化】性能优化Springboot 项目配置内置Tomcat使用Http11AprProtocol(AIO)

Springboot 项目配置内置tomcat使用Http11AprProtocol(AIO) Windows版本 1.下载Springboot对应版本tomcat包 下载地址 Apache Tomcat - Apache Tomcat 9 Software Downloads 找到bin目录下 tcnative-1.dll 文件 2 放到jdk的bin目录下 Linux版本 在Springboot中内嵌的Tomcat默…...

SpringBoot之@ConfigurationProperties、@EnableConfigurationProperties

ConfigurationProperties 这个注解不仅可以为yml某个类注入还可以为第三方bean绑定属性 为yml某个类注入 只要将对应的yml类对象声明实体pojo并交给spring容器管理&#xff0c;再在类上使用ConfigurationProperties绑定对应的类名即可 涉及到两个知识点&#xff0c;这个类对…...

数组一次性删除多条数据

需求描述 最后提交时删除表格中的空行 实现方法 单行删除 - 并不是一次性删除 表格每行的最后设置删除按钮&#xff0c;点击时将当前行的索引传递给方法&#xff0c;splice 删除当前行。 <el-table :data"tableData" class"myTable" border>..…...

相机删除照片如何恢复?一键解决它

相机删除照片如何恢复&#xff1f;喜欢用相机拍照的人&#xff0c;总会在空闲时多拍几张&#xff0c;这使我们相机中会储存大量的、各种各样的照片。等到回家后&#xff0c;在进行删除&#xff0c;并选出比较好的照片。但也很容易就误删了一些好看的照片。碰到这种意外事&#…...

vue3搭建教程(基于webpack+create-vue+ element-plus)

前言使用vue脚手架搭建vuetswebpack项目搭建步骤&#xff1a;下载node 版本可以 12 或者14或者 16.0&#xff0c;此次使用的>16.0版本&#xff0c;vue-cli通过npm i -g vue/cli 升级到了 vue cli v5.0.8建目录&#xff0c;如&#xff08;vue3Study&#xff09;用IDE工具打开…...

代码随想录算法训练营第四十二天 | leetcode 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

代码随想录算法训练营第四十二天 | leetcode 1049. 最后一块石头的重量 II&#xff0c;494. 目标和&#xff0c;474.一和零1049. 最后一块石头的重量 II494. 目标和474.一和零1049. 最后一块石头的重量 II 题目&#xff1a; 有一堆石头&#xff0c;每块石头的重量都是正整数。…...

Java8中Lambda表达式之Collection 的常见用法

背景 在java8中引入了Lambda表达式。其实&#xff0c;他就是一个匿名函数。我们经常会用到一些循环遍历&#xff0c;起始完全就可以通过Lambda来简化我们不必要的操作&#xff0c;下面我们来看一下Lambda常用的方法。 准备条件 DataBuilderprivate static class Person {priv…...

SpringCloud系列知识快速复习 -- part 2(Sentinel微服务保护,Seata分布式事务,Redis分布式缓存和多级缓存)

SpringCloud系列知识快速复习 -- part 2&#xff08;Sentinel微服务保护&#xff0c;Seata分布式事务&#xff0c;Redis分布式缓存和多级缓存Sentinel微服务保护什么是雪崩问题&#xff1f;解决方法服务保护技术对比流量控制簇点链路Sentinel流控模式流控效果热点参数限流隔离和…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...