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

news2024/11/27 22:38:15

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 np

ax = plt.figure().add_subplot(projection='3d')

x = np.linspace(0, 1, 100)
y = np.sin(x*2*np.pi) / 2 + 0.5

ax.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 = 1

ax1.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轴上的每个柱形图换为带有化石标定点的古地理图即可。但从本土来看,或许太多个图形看起来不清楚,上图仅是单色柱形图就难以观察到后面的情况,如果是色彩更复杂的地理图,效果不知会有多差。

未完待续

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

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

相关文章

RealBasicVSR模型转成ONNX以及用c++推理

文章目录安装RealBasicVSR的环境1. 新建一个conda环境2. 安装pytorch(官网上选择合适的版本)版本太低会有问题3. 安装 mim 和 mmcv-full4. 安装 mmedit下载RealBasicVSR源码下载模型文件写一个模型转换的脚步测试生成的模型安装RealBasicVSR的环境 1. 新建一个conda环境 cond…

第一次做性能测试,有亿点点紧张

确认需求 确定性能需求和性能测试方案、需要确定性能测试范围(覆盖哪些场景)、性能测试策略、并发用户数和加压方式。 时间、人员、任务的分配安排,一般在总体测试计划中会预留性能测试的时间。性能测试方案是开展性能测试前的核心内容&…

时序预测 | MATLAB实现Rmsprop算法优化LSTM长短期记忆神经网络时间序列多步预测(滚动预测未来,多指标,含验证Loss曲线)

时序预测 | MATLAB实现Rmsprop算法优化LSTM长短期记忆神经网络时间序列多步预测(滚动预测未来,多指标,含训练和验证Loss曲线) 目录 时序预测 | MATLAB实现Rmsprop算法优化LSTM长短期记忆神经网络时间序列多步预测(滚动预测未来,多指标,含训练和验证Loss曲线)效果一览基本描…

Flume使用入门

目录 一. Flume简单介绍 1. Agent 2. Source 3. Sink 4. Channel 5. Event 二. 环境安装 1. 创建日志目录 2. 修改日志配置文件 3.修改运行堆内存 4. 确定日志打印的位置 5. 修改flume使用内存 内存调大 三. 校验flume 1. 安装netcat工具和net-tools工具 2. 判…

MySQL服务端与客户端之间的连接过程

服务器程序和客户端程序本质上是两个进程,所以连接过程的本质就是两个进程直接的通信,MySQL支持下面三种方式来进行通信。一:TCP/IP数据库服务器进程和客户端进程可能运行在不同的主机中,需要通过网络来进行通信二:命名…

初识scrapy

认识scrapyscrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需实现少量的代码,就能实现数据的快速抓取scrapy使用了Twisted异步网络架构,可以加快下载速度 pip install twisted安装:pip install s…

进程控制(详解)

进程控制上篇文章介绍了进程的相关概念,形如进程的内核数据结构task_struct 、进程是如何被操作系统管理的、进程的查看、进程标识符、进程状态、进程优先级、已经环境变量和进程地址空间等知识点; 本篇文章接着上篇文章继续对进程的控制进行展开&#x…

Spark 内存运用

RDD Cache 当同一个 RDD 被引用多次时,就可以考虑进行 Cache,从而提升作业的执行效率 // 用 cache 对 wordCounts 加缓存 wordCounts.cache // cache 后要用 action 才能触发 RDD 内存物化 wordCounts.count// 自定义 Cache 的存储介质、存储形式、副本…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.04-03.10 #12场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号同时会推送最新的比赛消息,欢迎关注!更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考,以比赛官网为准目录2023-03-04&…

从100%进口到自主可控,从600块降到10块,中科院攻克重要芯片

前言 2月28日,“20多位中科院专家把芯片价格打到10块”冲上微博热搜,据河南省官媒大象新闻报道,热搜中提到的中科院专家所在企业为全球最大的PLC分路器芯片制造商仕佳光子,坐落于河南鹤壁。 为实现芯片技术自主可控自立自强&#…

根据栅格数据的范围和像元大小生成等比例的矢量数据

为啥会有这么一个需求呢,后面要是继续写的话会详细说,首先是有一个栅格数据,比如这样的:我的目标是这样的(矢量),就是这样,上面的栅格数据像大小是2*2的,直接上代码&…

【JAVA程序设计】【C00109】基于SSM(非maven)的员工工资管理系统

基于SSM(非maven)的员工工资管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架非maven开发的企业工资管理系统共分为二个角色:系统管理员、员工 管理员角色包含以下功能: 系统后台登陆、管理员管理、员工信…

Linux基础命令-nice调整进程的优先级

文章目录 Nice 命令介绍 语法格式 常用参数 参考实例 1 调整bash的优先级为-10 2 调整脚本的优先级为6 3 调整指令的优先级 4 默认使用nice命令调整优先级 命令总结 Nice 命令介绍 nice命令的主要功能是用于调整进程的优先级,合理分配系统资源。Linux系…

torchaudio的I/O函数

info、load、save1.1 infotorchaudio.info(filepath: str, ...)Fetch meta data of an audio file. Refer to torchaudio.backend for the detail.返回音频文件的meta信息这里的meta元信息包括采样率、帧数、通道数、量化位数、音频格式info torchaudio.info(rE:\adins\data\2…

Java使用DFA算法实现敏感词过滤

1 前言敏感词过滤就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检测出来,很多项目中都会有一个敏感词管理模块,在敏感词管理模块中你可以加入敏感词,然后根据加入的敏感词去过滤输入内容中的敏感词并进行…

测试软件5

一 css基础 css定义:可以设置网页中的样式,外观,美化 css中文名字:级联样式表,层叠样式表,样式表 二 css基础语法 1.style标签写在title标签后面 2.选择器{属性名1:属性值1;属性名…

ChatGPT最牛应用,让它帮你更新网站新闻吧!

谁能想到,ChatGPT火了!既能对话入流,又能写诗歌论文、出面试题、编代码,甚至还通过了谷歌面试拿到L3工程师offer,放在一年之前,没人相信这是当前AI能够达到的水平。ChatGPT自面世以来,凭借其极为…

【数据结构初阶】手把手带你实现栈

前言 在进入数据结构初阶的学习之后,我们学习了顺序表和链表,当然栈也是一种特殊的数据结构,他的特点是后进先出。 栈的概念及结构 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删…

iptables的介绍

iptables简介 1、 什么是iptables? iptables是linux防火墙工作在用户空间的管理工具,是 netfilter/iptables IP信息包过滤系统的一部分,用来设置、维护和检查Linux内核的IP数据包过滤规则 2、 iptables特点 iptables是基于内核的防火墙&…

【pytorch 入门系列】02 手把手多分类从0到1

温故而知新,通过手把手写一个多分类任务来复习之前所学过的知识。 前置知识 factorize的妙用:把文本数据枚举化 labels, uniques pd.factorize([b, b, a, c, b]) labels,uniques(array([0, 0, 1, 2, 0]), array([‘b’, ‘a’, ‘c’], dtypeobject))…