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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HT5169 内置BOOST升压的11WI2S输入D类音频功放
  • wangeditor——cdn引入的形式创建一个简易版编辑器——js技能提升
  • 从状态管理到性能优化:全面解析 Android Compose
  • 【 前端优化】Vue 3 性能优化技巧
  • 二叉树(上)
  • 2.大语言模型LLM的涌现能力和关键技术
  • JVM面试(七)G1垃圾收集器剖析
  • css问题:display:flex布局+justify-content: space-between; 最后一行不能左对齐
  • 2024年重磅报告!国内AI大模型产业飞速发展!
  • APO使用场景之:统一的指标采集展示
  • Android SPN/PLMN 显示逻辑简介
  • 图算法 | 图算法的分类有哪些?(下)
  • HTML 基础知识详解与代码示例
  • Vue3流程图插件-Vue Flow
  • 黑神话 Java,Solon v2.9.2 发布
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java 内存分配及垃圾回收机制初探
  • Java程序员幽默爆笑锦集
  • Laravel Telescope:优雅的应用调试工具
  • Netty源码解析1-Buffer
  • Otto开发初探——微服务依赖管理新利器
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 前嗅ForeSpider中数据浏览界面介绍
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何学习JavaEE,项目又该如何做?
  • 微信公众号开发小记——5.python微信红包
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序01:wepy框架整合iview webapp UI
  • 原生js练习题---第五课
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • # .NET Framework中使用命名管道进行进程间通信
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #pragma once
  • (2)STM32单片机上位机
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (理论篇)httpmoudle和httphandler一览
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (正则)提取页面里的img标签
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)人的集合论——移山之道
  • (转载)hibernate缓存
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net FrameWork简介,数组,枚举
  • .net 按比例显示图片的缩略图
  • 。。。。。
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [20161101]rman备份与数据文件变化7.txt
  • [20190401]关于semtimedop函数调用.txt
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)