python画图|在三维空间的不同平面上分别绘制不同类型二维图

【1】引言

前序已经完成了基础的二维图和三维图绘制教程探索,可直达的链接包括但不限于:

python画图|3D参数化图形输出-CSDN博客

python画三角函数图|小白入门级教程_正余弦函数画图python-CSDN博客

在学习过程中,发现一个案例: 在三维空间的不同平面上分别绘制不同类型二维图。

经过一段时间的学习,我对此有一些理解,现在分享出来和大家一起探讨。

【2】官网教程

打开下述链接可直达官网,官网的图形比较美丽,我对代码也进行了解读。

Plot 2D data on 3D plot --- Matplotlib 3.9.2 documentation

【3】代码解读

首先是引入画图模块和计算模块:

复制代码
import matplotlib.pyplot as plt #定义画图模块
import numpy as np #定义计算模块

然后非常丝滑地定义了要画三维图:

复制代码
ax = plt.figure().add_subplot(projection='3d') #定义要画三维图 

之后对xoy平面的图形进行了定义:

复制代码
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)') #在xoy平面画图

然后定义了一个新的数组:

复制代码
colors = ('r', 'g', 'b', 'k') #设置colors数组

定义随机数种子:

复制代码
np.random.seed(19680801) #定义随机数组种子

定义三个矩阵:

复制代码
x = np.random.sample(20 * len(colors)) #定义新矩阵x,以colors数组的长度为基础,生成20倍长度数量的随机数据
y = np.random.sample(20 * len(colors)) #定义新矩阵y,以colors数组的长度为基础,生成20倍长度数量的随机数据
c_list = [] #定义空矩阵

自定义一个函数,对c_list[ ]矩阵进行填充:

复制代码
for c in colors: #自定义函数
    c_list.extend([c] * 20) #对colors中的数据,乘以20后叠加到c_list

在XOZ平面绘制散点图:

复制代码
ax.scatter(x, y, zs=0, zdir='y', c=c_list, label='points in (x, z)') #在xoz平面画图

有上式可以看出,c_list代表的是变化的颜色, 所以上面的自定义函数是调整散点图的颜色。

之后设置坐标轴的基本属性:

复制代码
ax.legend() #输出图例
ax.set_xlim(0, 1) #设置X轴范围(0, 1)
ax.set_ylim(0, 1) #设置Y轴范围(0, 1)
ax.set_zlim(0, 1) #设置Z轴范围(0, 1)
ax.set_xlabel('X') #设置X轴标签为‘X’
ax.set_ylabel('Y') #设置Y轴标签为‘Y’
ax.set_zlabel('Z') #设置Z轴标签为‘Z’

最后输出图形:

复制代码
ax.view_init(elev=20., azim=-35, roll=0) #视角角度转换

plt.show() #输出图形

这里的 ax.view_init()函数是对三维图的观察角度进行调整,我们接下来会进行探索。

获得的输出图形为:

++图1++

【4】代码改写

【4.1】尝试修改颜色矩阵:

复制代码
colors = ('r', 'g', 'b', 'k','y') #设置colors数组

之前的自定义代码是100个取值,但colors数组中只有四个元素,及时乘以20也只有80个元素,但一共有100个输出值,为使颜色均匀分布,增加一个黄色的代码'y'。代码简写链接可以参考下述链接:

https://matplotlib.org/stable/users/explain/colors/colors.html#colors-def

此时的输出图形为:

++图2++

【4.2】修改ax.view_init()函数

在上述基础上,修改ax.view_init()函数,将其改为:

复制代码
ax.view_init(elev=90., azim=0, roll=0) #视角角度转换
ax.set_title('elev=90., azim=0, roll=0')

增加了一行 ax.set_title('elev=90., azim=0, roll=0')用以记录。

++图3++

可见elev=90是指从Z轴垂直看XOY平面。

然后继续修改:

复制代码
ax.view_init(elev=90., azim=90, roll=0) #视角角度转换
ax.set_title('elev=90., azim=90, roll=0')

输出结果为:

++图4++

可见elev=90,azim=90是指在从Z轴垂直看XOY平面的基础上,对XOY平面继续顺时针旋转90度。

然后继续修改:

复制代码
ax.view_init(elev=90., azim=90, roll=90) #视角角度转换
ax.set_title('elev=90., azim=90, roll=90')

输出结果为:

++图5++

可见elev=90,azim=90, roll=90是指在从Z轴垂直看XOY平面,对XOY平面顺时针旋转90度的基础上,再对整个图顺时针旋转90度。

未验证上述结论,继续修改:

复制代码
ax.view_init(elev=90., azim=60, roll=90) #视角角度转换
ax.set_title('elev=90., azim=60, roll=90')

输出图形为:

++图6++

可以看出:elev=90,azim=60, roll=90是指在从Z轴垂直看XOY平面,对XOY平面顺时针旋转960度的基础上,再对整个图顺时针旋转90度。

【5】结论

探索了在三维空间的不同平面上分别绘制不同类型二维图的教程。

相关推荐
FakeOccupational2 天前
【电路笔记 电源模块】“桥接”布局法+电源隔离+GND隔离+统一地平面防干扰
笔记·平面
Evand J2 天前
【MATLAB程序】基于RSSI的RFID二维轨迹定位仿真介绍,EKF滤波增加轨迹定位精度。附下载链接
开发语言·matlab·平面·滤波·定位·导航
Evand J5 天前
【代码介绍】二维平面上的雷达跟踪与UKF(无迹卡尔曼滤波),高精度估计目标轨迹,输出真值、估计值、误差特性等
matlab·平面·雷达·滤波·定位·导航·跟踪
bcbobo21cn5 天前
Three.js绘制三角形网格平面
前端·javascript·平面·三角形面·基础材质
fengfuyao9855 天前
基于遗传算法的分布式电源选址定容优化(考虑环境因素)
算法·matlab·平面
fengfuyao9856 天前
MATLAB计算任意倾斜平面的太阳辐射量,包括直射、散射和反射分量
算法·matlab·平面
RReality7 天前
【Unity Shader URP】平面反射(Planar Reflection)实战教程
ui·平面·unity·游戏引擎·图形渲染·材质
普密斯科技11 天前
齿轮平面度与正反面智能检测方案:3D视觉技术破解精密制造品控难题
人工智能·计算机视觉·平面·3d·自动化·视觉检测
AI科技星14 天前
v=c 物理理论核心参数转换表达式大全
开发语言·线性代数·算法·数学建模·平面
AI科技星14 天前
张祥前统一场论中两个电荷定义的统一性解析
开发语言·线性代数·算法·数学建模·平面