Skip to content

MATLAB - 绘制网格曲面

MATLAB - 现代三维网格和曲面绘图

Section titled “MATLAB - 现代三维网格和曲面绘图”

在三维空间中可视化二元函数是科学和工程中的一项基本任务。MATLAB 主要通过其 mesh 和 surf 函数为此提供了强大的工具。这些函数允许您渲染复杂曲面、分析数学函数并以直观的三维格式呈现数据。

mesh 函数生成线框图。它非常适合查看曲面的底层结构和网格。相比之下,surf 函数创建填充曲面图,颜色表示曲面的高度(Z 值),提供了更实心、视觉效果更丰富的表示。第三个函数 surfc 将曲面图与下方的等高线图结合起来,在单个可视化中提供两种视角。

% Modern Recommended Syntax
mesh(X, Y, Z)
surf(X, Y, Z)
% Additional Options
mesh(Z)
mesh(..., Name, Value)
s = mesh(...)

让我们分解一下现代语法及其变体:

  • mesh(X, Y, Z):创建一个三维线框图。Z 是一个矩阵,定义了由矩阵 X 和 Y 定义的网格上每个点的高度。线框的颜色通常与高度 Z 成比例。
  • surf(X, Y, Z):创建一个三维彩色曲面图。这通常是最终可视化的首选,因为它显示了一个实心曲面。
  • mesh(Z):一种简化语法,MATLAB 使用矩阵 Z 的行和列索引作为 x 和 y 坐标。适用于快速可视化矩阵数据。
  • mesh(..., Name, Value):使用名称-值对自定义绘图外观。这是控制透明度 ('FaceAlpha')、颜色 ('FaceColor') 和边缘样式 ('EdgeColor') 等属性的现代、灵活方式。这同样适用于 surf。
  • s = mesh(...):返回一个图表曲面对象。此句柄 s 允许您在绘图创建后以编程方式修改其属性,这是高级绘图的关键最佳实践。

让我们通过更新的、可运行的代码示例来探索这些概念。

peaks 函数是 MATLAB 中一个经典的二元函数示例。让我们使用 mesh 和 surf 来可视化它,看看它们之间的区别。

% 1. 定义网格
[X, Y] = meshgrid(-3:0.25:3);
% 2. 计算高度数据
Z = peaks(X, Y);
% 3. 创建两个图以比较 mesh 和 surf
figure; % 创建一个新的图窗窗口
% 子图 1:网格图
subplot(1, 2, 1); % 创建 1x2 的子图网格,并使用第一个
mesh(X, Y, Z);
title('Mesh Plot of peaks()');
xlabel('X-axis');
ylabel('Y-axis');
% 子图 2:曲面图
subplot(1, 2, 2); % 使用网格中的第二个图
surf(X, Y, Z);
title('Surface Plot of peaks()');
xlabel('X-axis');
ylabel('Y-axis');

最佳实践:请注意使用 figure 创建新窗口,subplot 排列多个绘图,以及 title/xlabel/ylabel 正确标注可视化。这使您的绘图清晰且专业。

让我们绘制一个更复杂的数学函数并自定义其外观。

% 定义更精细的网格以获得更平滑的绘图
[X, Y] = meshgrid(-8:0.5:8);
% 计算与原点的距离
R = sqrt(X.^2 + Y.^2) + eps; % 添加 eps 以避免在原点处除以零
% 计算 Sinc 函数
Z = sin(R) ./ R;
% 创建曲面图
figure;
surf(X, Y, Z);
% 添加标签和颜色条以提供上下文
title('3D Sinc Function');
xlabel('X');
ylabel('Y');
zlabel('Z');
colorbar; % 显示颜色到 Z 值的映射

示例 3:使用名称-值对自定义外观

Section titled “示例 3:使用名称-值对自定义外观”

现代 MATLAB 绘图严重依赖名称-值对进行自定义。让我们创建一个具有透明度且没有黑色网格线的绘图。

[X, Y] = meshgrid(-3:0.2:3);
Z = peaks(X,Y);
figure;
s = surf(X, Y, Z, ...
'EdgeColor', 'none', ... % 移除黑色网格线
'FaceColor', 'interp', ... % 平滑面上的颜色
'FaceAlpha', 0.8); % 使曲面 80% 不透明
% 添加光照以获得更逼真的 3D 效果
light;
lighting gouraud;
title('Customized Surface Plot');
xlabel('X');
ylabel('Y');
% 专业提示:使用句柄 's' 在创建后修改属性
s.Shininess = 50; % 使曲面更具光泽

解释:'EdgeColor', 'none' 非常适合创建干净、平滑的曲面。'FaceAlpha' 对于可视化多个重叠曲面至关重要。使用返回的句柄 s 修改属性是实现动态或复杂可视化的强大技术。

meshc 函数(带等高线的网格)仍然存在,但其现代的曲面图对应函数是 surfc。它将等高线投影到 xy 平面上,同时为您提供 2D 和 3D 视图。

surfc(X, Y, Z)

surfc(X, Y, Z) 创建一个带有在其下方绘制的等高线的曲面图。它接受与 surf 相同的所有名称-值对参数。

让我们将 surfc 应用到我们的 peaks 数据。

[X, Y, Z] = peaks(25);
figure;
surfc(X, Y, Z);
title('Surface Plot with Contours');
xlabel('X-axis');
ylabel('Y-axis');
colorbar;

应用:这在地理(地形图)、物理(势场)和工程(应力分析)等需要同时查看曲面高程和等值线的领域中非常有用。

  • 矩阵维度不匹配:最常见的错误。X、Y 和 Z 的维度必须匹配。在绘图前使用 size(X)、size(Y) 和 size(Z) 进行检查。meshgrid 是确保它们匹配的标准方法。
  • 忘记使用元素级运算符:当从 X 和 Y 的函数定义 Z 时,请记住使用元素级运算符(.^、.*、./),以便将操作应用于矩阵的每个元素。忘记这一点将导致矩阵乘法错误。
  • 绘图为平面:如果您的 Z 矩阵包含所有相同的值(或 NaN),则绘图将显示为平面。检查 Z 的计算。