Matplotlib-绘制3D曲面-plot_surfaceh与plot_trisurf函数-数据结构
3D平面绘制示例-plot_surfaceh
平面和曲面的绘制方法一样,而用平面更容易分析,开始。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure() # 创建一个画布
ax = Axes3D(fig, auto_add_to_figure=False) # 画布上创建一个三维坐标系
# auto_add_to_figure=False,必须有这个参数设置,否则报错
# 但设置为False后需要手动为图像添加轴,即下面一行代码
fig.add_axes(ax)
X = [0, 1]
Y = [0, 1, 2]
X, Y = np.meshgrid(X, Y)
Z = X + Y
# 以下是构成这个3d平面的6个点,分别对应x,y,z坐标
x = [0, 1, 0, 1, 0, 1]
y = [0, 0, 1, 1, 2, 2]
z = [0, 1, 1, 2, 2, 3]
ax.scatter(x, y, z, color='black') # 绘制3D散点图
ax.plot_trisurf(x, y, z) # 绘制3D曲平面
plt.show()
到这里就有问题了,两个一维的数据是如何形成这6个点的?那么先来看一下X,Y,Z都是什么。
X = [[0, 1], [0, 1], [0, 1]]
Y = [[0, 0], [1, 1], [2, 2]]
Z = [[0, 1], [1, 2], [2, 3]]
x = [0, 1, 0, 1, 0, 1]
y = [0, 0, 1, 1, 2, 2]
z = [0, 1, 1, 2, 2, 3]
X,Y,Z都是二维数据,而竖着看就是x,y,z对应的6个坐标点,但为何要用这种三个二维表的形式呢?这也许源于某个标准,虽然我对这个标准没兴趣,但对这个标准的底层逻辑很感兴趣。那就从np.meshgrid()函数开始研究。
网格采样点的生成函数np.meshgrid()
从上面的例子可以看出np.meshgrid()的运算机制如下:
可以看出np.meshgrid()是将两个一维数据转换为两个二维数据,而两这个矩阵的计算结果就是Z的值,如果把X,Y,Z叠起来就得到了绘图所需要的6个坐标点。
3D平面绘制示例-plot_trisurf
如果想通过输入6个坐标点来绘制3D平面图呢,用plot_trisurf就OK了。
fig = plt.figure()
ax = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)
# 以下是用于绘图的6个点,分别对应x,y,z坐标
x = [0, 1, 0, 1, 0, 1]
y = [0, 0, 1, 1, 2, 2]
z = [0, 1, 1, 2, 2, 3]
ax.scatter(x, y, z, color='black') # 绘制3D散点
ax.plot_trisurf(x, y, z) # 绘制3D平面
plt.show()
殊途同归: