Matplotlib 怎么画 Surface Plots 表面图?

文章导读
Previous Quiz Next 曲面图是一种在平面的二维表面上表示三维数学函数或数据的方法。它展示了函数或数据值如何随两个输入变量(通常表示在 x 和 y 轴上)而变化,以及这种变化如何影响输出变量(表示在 z 轴上)。
📋 目录
  1. Matplotlib 中的曲面图
  2. plot_surface() 函数
  3. 示例 - 鞍形曲面图
  4. 示例 - 高斯曲面图
  5. 示例 - 正弦和余弦曲面图
  6. 示例 - 随机噪声曲面图
A A

Matplotlib - 曲面图



Previous
Quiz
Next

曲面图是一种在平面的二维表面上表示三维数学函数或数据的方法。它展示了函数或数据值如何随两个输入变量(通常表示在 x 和 y 轴上)而变化,以及这种变化如何影响输出变量(表示在 z 轴上)。

想象你有一个表格,其中两列表示两个自变量,第三列表示因变量。曲面图使用这三列数据创建一个 3D 表示,其中两个自变量位于 x 和 y 轴上,因变量由曲面的高度或颜色表示 −

Surface Plot

Matplotlib 中的曲面图

我们可以使用 mpl_toolkits.mplot3d 模块中的 plot_surface() 函数在 Matplotlib 中创建曲面图。此函数适用于可视化两个变量的函数或三维数据集。它生成一个曲面图,与传统的二维图相比,提供更清晰的数据视图。

plot_surface() 函数

Matplotlib 中的 plot_surface() 函数接受使用 meshgrid 组织成网格结构的 x 和 y 坐标,对应的 z 值决定了每个网格点的高度或值。生成的图表为您提供数据的 3D 形状的视觉表示。

语法

以下是 Matplotlib 中 plot_surface() 函数的语法 −

ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='black', **kwargs)

其中,

  • X 是值的 x 坐标(2D 数组或 meshgrid)。
  • Y 是值的 y 坐标(2D 数组或 meshgrid)。
  • Z 是值的 z 坐标(2D 数组或 meshgrid)。
  • cmap 是用于为曲面着色的颜色映射。它根据 Z 值指定曲面的颜色映射。
  • edgecolor 是曲面边缘的颜色。
  • **kwargs 是用于自定义的其他关键字参数(例如,颜色、透明度)。

示例 - 鞍形曲面图

鞍形曲面是 Matplotlib 中的一种三维图,用于可视化类似于马鞍或双曲抛物面的数学曲面。此曲面由数学函数 z=x2-y2 定义。该图清晰地展示了函数值如何在 X 和 Y 维度上变化。

在以下示例中,我们使用 "saddle_surface" 函数定义一个鞍形曲面,并在指定范围内生成曲面数据点。然后使用 plot_surface() 函数创建一个 3D 曲面图,显示带有 "Viridis" 颜色映射和 "black" 边缘的鞍形曲面 −

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

# 定义鞍形曲面
def saddle_surface(x, y):
    return x**2 - y**2

# 生成数据点
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = saddle_surface(X, Y)

# 创建曲面图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='black')

ax.set_title('Saddle-shaped Surface')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

plt.show()

输出

执行上述代码后,我们得到以下输出 −

Saddle-shaped Surface

示例 - 高斯曲面图

Matplotlib 中的高斯曲面图是对高斯分布(或称钟形曲线)这种数学函数的三维表示。这种曲面图提供了函数 z=e-(x2+y2) 的视觉表示,其中 x 和 y 是输入变量。

在这里,我们使用 "gaussian_surface" 函数定义了一个高斯曲面,然后在指定范围内为该曲面生成一组数据点。然后,我们使用 plot_surface() 函数创建一个 3D 曲面图来显示高斯曲面 −

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

# 定义高斯曲面
def gaussian_surface(x, y):
    return np.exp(-(x**2 + y**2))

# 生成点
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = gaussian_surface(X, Y)

# 创建曲面图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='plasma', edgecolor='black')

ax.set_title('Gaussian Surface')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

plt.show()

输出

以上代码的输出如下 −

Gaussian Surface Plot

示例 - 正弦和余弦曲面图

Matplotlib 中的正弦和余弦曲面图表示了结合正弦和余弦项的数学函数的三维可视化。这些图展示了函数 z=sin(√x2+y2)+cos(√x2+y2) 的行为,其中 x 和 y 是输入变量。

现在,我们通过在 meshgrid 上结合正弦和余弦函数的值来生成一个 3D 曲面图。结果曲面由网格中每个点的正弦和余弦波的高度相加形成 −

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

# 创建 meshgrid
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)

# 使用正弦和余弦函数定义曲面
Z = np.sin(np.sqrt(X**2 + Y**2)) + np.cos(np.sqrt(X**2 + Y**2))

# 创建曲面图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='black')

ax.set_title('Sine and Cosine Surface')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

plt.show()

输出

以上代码的输出如下 −

Sine and Cosine Surface Plots

示例 - 随机噪声曲面图

Matplotlib 中的随机噪声曲面图是用随机噪声生成的曲面的 3D 表示。这种图表适用于可视化带有随机性或变异性的数据。

在下面的示例中,我们生成一个表示随机噪声的 3D 曲面图。np.random.rand() 函数创建一个 0 到 1 之间的随机值网格,形成曲面的高度。使用 Matplotlib 以 "Cividis" 颜色映射和 "black" 边缘显示该图,展示了在指定 x 和 y 范围内高度随机波动的曲面 −

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

# 为曲面生成随机噪声
np.random.seed(42)
X = np.linspace(-5, 5, 100)
Y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(X, Y)
Z = np.random.rand(100, 100)

# 创建曲面图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='cividis', edgecolor='black')

ax.set_title('Random Noise Surface')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

plt.show()

输出

获得的输出如图所示 −

Random Noise Surface Plot