Matplotlib 3D 线框图

Matplotlib 3D 线框图函数

在处理一些三维数据时,除了 3D 散点图3D条形图,我们可能还需要一种能够更清晰地展示数据表面形态和拓扑结构的方式。比如,在数学或物理领域,我们可能需要可视化一个函数在三维空间中的曲面,此时可以考虑使用 3D 线框图来实现。

在 Matplotlib 中,我们可以使用 plot_wireframe() 函数来绘制 3D 线框图。

语法:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection='3d')

ax.plot_wireframe(
    X,
    Y,
    Z,
    rstride=1,
    cstride=1,
    color='black',
    **kwargs
)

说明:

如果想要使用 3D 线框图,我们需要先从 mpl_toolkits.mplot3d 导入 Axes3D 类,然后使用 add_subplot() 函数创建一个 3D 的 子图,最后调用 plot_wireframe() 函数来创建 3D 线框图。

其中,plot_wireframe() 函数接收以下参数。

  • X 和 Y(必选):是一个二维数组,表示线框图上点的 x 和 y 坐标。通常通过 np.meshgrid() 函数创建。
  • Z(必选):是一个二维数组,表示线框图上点的 z 坐标,其维度必须与 X 和 Y 相同。
  • rstride(可选):定义 row(行)的步长,用于控制线框图中采样的密度。默认值为 1。
  • cstride(可选):定义 column(列)的步长,用于控制线框图中采样的密度。默认值为 1。
  • color(可选):设置线框的颜色。
  • **kwargs:其他传递给 plot_wireframe 函数的关键字参数,例如 linewidth(线宽)。

Matplotlib 3D 线框图示例

接下来,我们通过几个简单例子来介绍一下 Matplotlib 是如何绘制 3D 线框图的。

示例 1:绘制基本的 3D 线框图

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
fig = plt.figure()
ax = fig.add_subplot(projection='3d')

# 创建 x 和 y 的网格
num1 = np.arange(-5, 5, 0.5)
num2 = np.arange(-5, 5, 0.5)
X, Y = np.meshgrid(num1, num2)

# 定义 z 轴数据 (例如一个高斯函数)
Z = np.exp(-(X**2 + Y**2) / 2)

# 绘制线框图
ax.plot_wireframe(X, Y, Z)

# 设置标题和标签
ax.set_title('3D 线框图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib 基本 3D 线框图

分析:

在这个例子中,我们首先创建了 x 和 y 轴的数值范围,并使用 NumPy 的 meshgrid() 函数将它们转换为二维的网格 X 和 Y。

接着,我们定义了一个简单的数学函数来计算每个 (x, y) 坐标对应的 z 值,并将结果存储在二维数组 Z 中。

最后,我们调用 ax.plot_wireframe() 函数,传入 X、Y 和 Z 来绘制线框图。默认情况下,线框是黑色的。

示例 2:自定义线框的步长和颜色

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
fig = plt.figure()
ax = fig.add_subplot(projection='3d')

# 创建 x 和 y 的网格,增加步长以减少线条数量
num1 = np.arange(-5, 5, 1)
num2 = np.arange(-5, 5, 1)
X, Y = np.meshgrid(num1, num2)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 绘制线框图,自定义行和列的步长和颜色
ax.plot_wireframe(X, Y, Z, rstride=5, cstride=5, color='blue')

# 设置标题和标签
ax.set_title('3D 线框图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib 自定义步长和颜色的 3D 线框图

分析:

在这个例子中,我们通过增大 np.arange() 的步长来减少数据的点数,从而在 plot_wireframe() 中设置更大的 rstride 和 cstride 值。这会使得线框图的线条更加稀疏。

示例 3:绘制一个更复杂的曲面线框

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
fig = plt.figure()
ax = fig.add_subplot(projection='3d')

# 创建参数化曲面的数据
u = np.linspace(-np.pi, np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))

# 绘制线框图
ax.plot_wireframe(x, y, z, color='green')

# 设置标题和标签
ax.set_title('3D 线框图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib 复杂曲面的 3D 线框图

分析:

这个例子展示了如何使用参数方程来生成更复杂的 3D 曲面,并使用 plot_wireframe() 函数绘制其线框图。我们创建了一个球体的参数化表示,并将其坐标传递给函数。

Matplotlib 3D 线框图案例

假设需要可视化一个物理模型中的地形表面,其高度 Z 由 X 和 Y 坐标决定。此时,我们可以使用 3D 线框图来直观地展示这个地形的起伏和结构。

示例 4:3D 线框图的实际应用

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
fig = plt.figure()
ax = fig.add_subplot(projection='3d')

# 创建 X 和 Y 的网格,表示二维平面上的坐标
x_coords = np.linspace(-3, 3, 50)
y_coords = np.linspace(-3, 3, 50)
X, Y = np.meshgrid(x_coords, y_coords)

# 定义 Z 轴数据,模拟一个凹凸不平的地形表面
# 这里使用一个简单的函数:Z = sin(X) + cos(Y)
Z = np.sin(X) + np.cos(Y)

# 绘制线框图
ax.plot_wireframe(X, Y, Z, color='gray', rstride=2, cstride=2)

# 设置标题和标签
ax.set_title('地形表面线框图')
ax.set_xlabel('经度')
ax.set_ylabel('纬度')
ax.set_zlabel('高度')

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib 3D 线框图的实际应用

分析:

在这个例子中,我们模拟了一个地形表面,其中 X 轴代表经度,Y 轴代表纬度,Z 轴代表高度。我们使用 np.meshgrid() 创建 X 和 Y 坐标网格,并用一个简单的数学函数计算出每个点的 Z 值。

最后,我们使用 plot_wireframe() 函数绘制了线框图,并设置了线框颜色为灰色,步长为 2,从而清晰地展示了模拟地形的起伏结构。

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号