python画图|3D垂线标记

在前述学习过程中,我们学习了二维坐标上的垂线标记画图,链接如下:

python画图|垂线标记系列_python画点相对x轴的垂线-CSDN博客

也学习了3D作图基本方法:

python画图|3D图基础教程-CSDN博客

现在我们尝试将这二者结合,绘制3D垂线标记图。

【1】官网教程

打开下述链接,直达官网:

https://matplotlib.org/stable/gallery/mplot3d/stem3d_demo.html#sphx-glr-gallery-mplot3d-stem3d-demo-py

官网给出了非常简洁的程序,我们尝试一起解读一下。

【2】代码解读

首先依然是引入numpy用于计算、matplotlib用于绘图。

复制代码
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

然后定义了一串变量,这里使用高等数学参数化定义函数的方法,先定义一个参数theta,然后将x、y和z都定义成关于theta的因变量。代码相对简洁,函数的定义非常高效。

复制代码
theta = np.linspace(0, 2*np.pi) #自变量theta取值范围[0,2pi)
x = np.cos(theta - np.pi/2) #定义因变量
y = np.sin(theta - np.pi/2) #定义因变量
z = theta  #定义因变量

最后定义了要输出3D图,指明3D图类型为垂线标记图。

复制代码
fig, ax = plt.subplots(subplot_kw=dict(projection='3d')) #定义画3D图
ax.stem(x, y, z) #指明3D图类型为垂线标记图

plt.show() #输出图形

输出后的图形为:

++图1++

由图1可见,3D垂线标记图自XOY平面画出了垂直Z轴的垂线,且在Z值的位置坐了圆形标记。

【3】代码修改

【3.1】垂线加密

将参数theta的取值增多,修改后的代码为;

复制代码
theta = np.linspace(0, 2*np.pi,100) #之前未曾定义自变量数量,现在将其明确为100个

输出结果为:

++图2++

由图2可见,随着参数取值的增多,垂线已经实现加密。

【3.2】垂线类型更新

默认的垂线是实现,尝试将其改为虚线,在ax.stem中增加linefmt=':',改后代码和图形如下:

复制代码
ax.stem(x, y, z,linefmt=':') 

图3

图3输出了虚线式的垂线。

【3.3】标记类型更新

默认的标记是一个圆球,尝试将其改为其他类型,在ax.stem中增加markerfmt='g',改后代码和图形如下:

复制代码
ax.stem(x, y, z,linefmt=':',markerfmt='g') 

++图4++

图4的顶端不再是圆形,而是绿色的实线。

【3.4】显示坐标轴标签

坐标轴标签是否显示对图像分析有很大影响,在plt.show()前面增加一行代码以输出坐标轴标签,,改后代码和图形如下:

复制代码
ax.set(xlabel='x', ylabel='y', zlabel='z')
plt.show() #输出图形

++图5++

图5已经将XYZ显示在坐标轴旁边。

【3.5】垂线起始位置更新

垂线的起始位置默认是0,现将其更新。在ax.stem()中增加bottom=2.5,改后代码和图形如下:

++图6++

图6的红色圆圈位于Z=2.5位置处。

继续修改bottom=100,此时的输出结果为:

++图7++

由图7可见,如果垂线起始圆圈位置放得过高,或者说与自变量的值相差太大,会削弱图像的表达能力。图7中真正要输出的变量在绿色线上,现在被压缩到很小的一片区域。

红色箭头指示的区域就是自变量的变化范围,这个值和100相比显然较小。

这提示我们以后设置垂线其实圆圈因考虑自变量值的范围。

【4】总结

本文学习了3D垂线标记图的画法,并对垂线密度、类型和起始圆圈、标记类型进行了修改,此外显示了各坐标轴的标签。

相关推荐
Psycho_MrZhang13 分钟前
高并发服务设计思路
python
FAFU_kyp16 分钟前
Rust 语法速查
开发语言·后端·rust
sheji341630 分钟前
【开题答辩全过程】以 基于JSP的汽车租赁管理系统为例,包含答辩的问题和答案
java·开发语言·汽车
liulilittle32 分钟前
CLANG 交叉编译
linux·服务器·开发语言·前端·c++
多米Domi01136 分钟前
0x3f 第21天 三更java进阶1-35 hot100普通数组
java·python·算法·leetcode·动态规划
沐知全栈开发1 小时前
Pandas 相关性分析
开发语言
小程故事多_801 小时前
从零吃透PyTorch,最易懂的入门全指南
人工智能·pytorch·python
kylezhao20192 小时前
C#读取字节数组某个位的值
开发语言·c#
资生算法程序员_畅想家_剑魔2 小时前
Java常见技术分享-26-事务安全-锁机制-作用与分类
java·开发语言·数据库
Keep_Trying_Go2 小时前
基于无监督backbone无需训练的类别无关目标统计CountingDINO算法详解
人工智能·python·算法·多模态·目标统计