Matplotlib 3D 曲面图

Matplotlib 3D 曲面图函数

3D 曲面图用于展示三个变量之间的关系,其中两个变量作为自变量(通常在 x 轴和 y 轴上),第三个变量作为因变量(在 z 轴上),其值由前两个变量的值决定,形成一个三维的表面。

比如在气象学中,我们可以用 3D 曲面图来展示不同经度和纬度上的气压变化。而在物理学中,可以用它来描绘电场或磁场的强度分布。

在 Matplotlib 中,我们可以使用 plot_surface() 函数来绘制 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_surface(
    X,
    Y,
    Z,
    rstride=1,
    cstride=1,
    cmap='viridis',
    edgecolor='none',
    **kwargs
)

说明:

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

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

  • X 和 Y(必选):是一个二维数组,表示曲面上的点的 x 和 y 坐标。通常通过 np.meshgrid() 函数创建。
  • Z(必选):是一个二维数组,表示曲面上的点的 z 坐标,其维度必须与 X 和 Y 相同。
  • rstride(可选):定义 row(行)的步长,用于控制曲面图中采样的密度。默认值为 1。
  • cstride(可选):定义 column(列)的步长,用于控制曲面图中采样的密度。默认值为 1。
  • cmap(可选):指定颜色映射方案 (colormap)。例如,'viridis'、'plasma'、'magma'、'coolwarm' 等。
  • edgecolor(可选):设置曲面网格线的颜色。设置为 'none' 可以隐藏网格线。
  • **kwargs:其他传递给 plot_surface 函数的关键字参数,例如 alpha(透明度)、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.1)
num2 = np.arange(-5, 5, 0.1)
X, Y = np.meshgrid(num1, num2)

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

# 绘制曲面
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis')

# 设置标题和标签
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_surface() 函数,传入 X、Y、Z 以及颜色映射 cmap 来绘制曲面。

示例 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, 0.5) # 增大步长
num2 = np.arange(-5, 5, 0.5) # 增大步长
X, Y = np.meshgrid(num1, num2)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 绘制曲面,自定义行和列的步长,并使用不同的颜色映射
ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap='plasma', edgecolor='black')

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

# 显示
plt.show()

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

Matplotlib 自定义步长和颜色映射的 3D 曲面图

分析:

在上面例子中,我们通过增大 np.arange() 的步长来减少数据的点数,从而在 plot_surface() 中设置更大的 rstride 和 cstride 值,这样会使得曲面图的网格更加稀疏。

同时,我们将 cmap 参数设置为 'plasma',使用了不同的颜色映射方案,并且添加了黑色的 edgecolor 来显示网格线。

示例 3:使用 'coolwarm' 颜色映射并隐藏网格线

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.linspace(-5, 5, 50)
num2 = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(num1, num2)
Z = X**2 - Y**2

# 绘制曲面,使用 'coolwarm' 颜色映射并隐藏网格线
ax.plot_surface(X, Y, Z, rstride=3, cstride=3, cmap='coolwarm', edgecolor='none')

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

# 显示
plt.show()

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

Matplotlib 颜色映射并隐藏网格线的 3D 曲面图

分析:

在上面例子中,我们使用了 np.linspace() 函数来创建更密集的 x 和 y 数据。然后将颜色映射设置为 'coolwarm',它通常用于表示数据的中心值附近使用冷色、两端使用暖色。通过设置 edgecolor='none',可以隐藏了曲面上的网格线,使得图表看起来更加平滑。

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_cost = np.linspace(0, 10, 50)
y_cost = np.linspace(0, 10, 50)
X, Y = np.meshgrid(x_cost, y_cost)

# 定义 z 轴数据,模拟利润函数: Z = 100 + 5*X + 8*Y - 0.5*X**2 - 0.4*Y**2
# 这是一个简单的抛物面函数,模拟利润随着投入增加先上升后下降
Z = 100 + 5*X + 8*Y - 0.5*X**2 - 0.4*Y**2

# 绘制曲面图
surf = ax.plot_surface(X, Y, Z, cmap='plasma', rstride=1, cstride=1, linewidth=0)

# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=5, label='利润')

# 设置标题和标签
ax.set_title('广告费用与研发费用对利润的影响')
ax.set_xlabel('广告费用 (万元)')
ax.set_ylabel('研发费用 (万元)')
ax.set_zlabel('利润 (万元)')

# 显示
plt.show()

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

Matplotlib 3D 曲面图的实际应用

分析:

在这个例子中,我们模拟了一个简单的企业利润模型。其中,X 轴表示广告费用,Y 轴表示研发费用,Z 轴则表示对应的利润。这里使用了一个二次函数来模拟利润随着投入增加先上升后下降的趋势。

plot_surface() 函数用于将这些数据点连接成一个平滑的曲面,并通过颜色映射(plasma)直观地展示了不同投入组合下的利润水平。此外,我们还添加了颜色条(colorbar),从而可以更清楚地了解颜色深浅所代表的利润值。

上一篇: Matplotlib 3D 线框图

下一篇: Python 教程

给站长反馈

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

邮箱:lvyenet@vip.qq.com

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