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

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垂线标记图的画法,并对垂线密度、类型和起始圆圈、标记类型进行了修改,此外显示了各坐标轴的标签。 


http://www.kler.cn/a/302677.html

相关文章:

  • 985研一学习日记 - 2024.11.14
  • qt QProcess详解
  • nginx配置负载均衡详解
  • 【OceanBase 诊断调优】—— ocp上针对OB租户CPU消耗计算逻辑
  • 俏美韵从心出发,与女性一道为健康生活贡献力量
  • 网站小程序app怎么查有没有备案?
  • 九、Redis 的实际使用与Redis的设计
  • Android Auto助力电动汽车智能驾驶
  • Java面试篇基础部分-Java各种垃圾收集器
  • 电脑提示丢失mfc140u.dll的详细解决方案,mfc140u.dll文件是什么
  • DAY99 APP 攻防-小程序篇反编译外在抓包主包分包配置泄漏算法逆向未授权
  • VS code 写下 print 时让编译器自动添加括号
  • 第二百二十五节 JPA教程 - JPA列长度示例、JPA列精度范围示例
  • 安卓framework美化手势导航侧滑返回UI
  • OpenAI O1:人工智能推理能力的新里程碑
  • 快讯丨深蓝L07将于9月20日正式上市
  • 【视频教程】遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用
  • 【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(二十七)
  • 自测的重要性
  • 如何分辨IP地址是否能够正常使用
  • DFS算法专题(二)——穷举vs暴搜vs深搜vs回溯vs剪枝【OF决策树】
  • 2024网络安全人才实战能力白皮书安全测试评估篇
  • Python中列表、元组、字典和集合的详细解释
  • 用Java实现人工智能
  • Linux 安装神州通用数据库 ShenTong7.0.8_342.92_linux64
  • 大数据集群搭建以及使用过程中几个实用的shell脚本