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