MATLAB三维图绘制教程:基础到进阶(mesh()/surf()/plot3()/contour3()全解析)

310 阅读9分钟

MATLAB三维绘图是可视化三维数据的核心手段,相比二维图能更直观展示数据的空间分布、曲面特征和序列关系。常用的三维绘图函数包括plot3()(三维曲线)、mesh()(网格图)、surf()(曲面图)、contour3()(三维等高线),分别适配不同的三维数据展示场景。本文从数据准备、基础绘图到样式美化,结合可直接运行的代码示例,详解各类三维图的用法,覆盖搜索引擎高频检索需求(如MATLAB三维曲面绘制、网格图颜色设置、三维曲线自定义),适合零基础掌握三维可视化技能。

一、三维绘图核心认知

1. 三维数据的基础形式

MATLAB三维绘图的核心是“网格数据”——需先通过meshgrid()生成二维网格坐标矩阵,再基于网格计算对应z轴数值,常见数据结构:

  • 三维曲线:单组x、y、z一维数组(如空间曲线的坐标点);
  • 三维曲面/网格:x、y二维网格矩阵 + z二维数值矩阵(如z = f(x,y)的函数曲面)。

2. 核心函数适用场景

函数核心用途典型应用场景
plot3()三维曲线绘制(单条/多条空间曲线)运动轨迹、三维离散序列
mesh()三维网格图(线框式曲面,突出结构)函数曲面轮廓、数据空间分布
surf()三维曲面图(填充式曲面,突出颜色)温度场、高度场、密度分布
contour3()三维等高线(展示z值等值面)地形等高线、气压等值线

3. 基础准备:meshgrid()生成网格

绘制曲面/网格图前,需用meshgrid()将一维x、y数组转换为二维网格矩阵:

% 示例:生成x∈[-2,2]、y∈[-2,2]的网格
x = -2:0.1:2;
y = -2:0.1:2;
[X, Y] = meshgrid(x, y);  % X、Y为二维网格矩阵,维度与x/y长度一致

二、plot3():三维曲线绘制

plot3()是二维plot()的三维扩展,核心绘制空间曲线,语法与plot()类似,仅多一个z轴参数。

1. 基础用法(单条三维曲线)

% 示例1:三维螺旋线
clear all; clc;
t = 0:0.1:10*pi;  % 参数t
x = sin(t);       % x坐标
y = cos(t);       % y坐标
z = t/2;          % z坐标

plot3(x, y, z, 'r--', 'LineWidth', 1.5);  % 红色虚线,线宽1.5
title('三维螺旋线(plot3基础用法)');
xlabel('x = sin(t)');
ylabel('y = cos(t)');
zlabel('z = t/2');  % 新增z轴标签
grid on;  % 显示三维网格
view(45, 30);  % 设置视角(方位角45°,仰角30°)

2. 进阶用法(多条三维曲线+标记点)

% 示例2:两条三维曲线对比(带标记点)
clear all; clc;
t = 0:0.5:10*pi;
% 曲线1:螺旋线1
x1 = sin(t);
y1 = cos(t);
z1 = t/2;
% 曲线2:螺旋线2(缩放)
x2 = 2*sin(t);
y2 = 2*cos(t);
z2 = t/2;

plot3(x1, y1, z1, 'r-o', 'LineWidth', 1.5, 'MarkerSize', 6);  % 红色+圆形标记
hold on;
plot3(x2, y2, z2, 'b-^', 'LineWidth', 1.5, 'MarkerSize', 6);  % 蓝色+三角标记
hold off;

title('两条三维螺旋线对比');
xlabel('x轴');
ylabel('y轴');
zlabel('z轴');
legend('曲线1','曲线2');
grid on;
view(60, 20);  % 调整视角

三、mesh():三维网格图

mesh()绘制线框式三维网格图,仅显示曲面的网格线,突出空间结构,适合展示曲面轮廓。

1. 基础用法(函数曲面网格)

% 示例3:z = x² + y² 抛物面网格图
clear all; clc;
% 1. 生成网格
x = -3:0.2:3;
y = -3:0.2:3;
[X, Y] = meshgrid(x, y);
% 2. 计算z值
Z = X.^2 + Y.^2;
% 3. 绘制网格图
mesh(X, Y, Z);
title('抛物面网格图(mesh基础用法)');
xlabel('x轴');
ylabel('y轴');
zlabel('z轴');
grid on;
colormap(jet);  % 设置颜色映射(jet为默认彩色)
colorbar;  % 显示颜色条(对应z值大小)

2. 样式自定义(网格颜色/透明度)

% 示例4:自定义网格样式(黑色网格+透明度)
clear all; clc;
x = -3:0.2:3;
y = -3:0.2:3;
[X, Y] = meshgrid(x, y);
Z = X.^2 + Y.^2;

h = mesh(X, Y, Z);
set(h, 'EdgeColor', 'k', 'FaceAlpha', 0.1);  % EdgeColor:网格线颜色;FaceAlpha:透明度(0-1)
title('自定义网格图样式');
xlabel('x轴');
ylabel('y轴');
zlabel('z轴');
colormap(gray);  % 灰度色映射
colorbar;
grid on;
view(30, 40);

四、surf():三维曲面图

surf()绘制填充式三维曲面图,网格间的区域填充颜色,突出z值的数值差异,是三维数据可视化最常用的函数。

1. 基础用法(基础曲面)

% 示例5:z = sin(sqrt(x² + y²))/sqrt(x² + y²) 山峰曲面
clear all; clc;
x = -10:0.5:10;
y = -10:0.5:10;
[X, Y] = meshgrid(x, y);
R = sqrt(X.^2 + Y.^2) + eps;  % eps避免分母为0
Z = sin(R)./R;

surf(X, Y, Z);
title('山峰曲面(surf基础用法)');
xlabel('x轴');
ylabel('y轴');
zlabel('z轴');
colormap(jet);
colorbar;
shading interp;  % 平滑着色(默认faceted,网格线明显)
grid on;

2. 进阶用法(曲面+等高线叠加)

% 示例6:曲面图叠加底面等高线
clear all; clc;
x = -10:0.5:10;
y = -10:0.5:10;
[X, Y] = meshgrid(x, y);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;

surf(X, Y, Z);
hold on;
% 叠加底面等高线(z=-0.5位置)
contour3(X, Y, Z, 20, 'k', 'LineWidth', 1);  % 20条等高线,黑色
hold off;

title('曲面图+等高线叠加');
xlabel('x轴');
ylabel('y轴');
zlabel('z轴');
colormap(jet);
colorbar;
shading flat;  % 平坦着色(无网格线,区域填充)
grid on;

五、contour3():三维等高线图

contour3()绘制三维等高线,每条线代表z值相等的点,适合展示z值的分布规律。

1. 基础用法(默认等高线)

% 示例7:山峰曲面三维等高线
clear all; clc;
x = -10:0.5:10;
y = -10:0.5:10;
[X, Y] = meshgrid(x, y);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;

contour3(X, Y, Z, 30);  % 30条等高线
title('三维等高线图(contour3基础用法)');
xlabel('x轴');
ylabel('y轴');
zlabel('z轴');
colormap(jet);
colorbar;
grid on;

2. 自定义等高线(标注数值)

% 示例8:带数值标注的等高线
clear all; clc;
x = -10:0.5:10;
y = -10:0.5:10;
[X, Y] = meshgrid(x, y);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;

% 绘制等高线并获取句柄
[C, h] = contour3(X, Y, Z, 15);  % 15条等高线
clabel(C, h, 'FontSize', 8);  % 标注等高线数值
title('带数值标注的三维等高线');
xlabel('x轴');
ylabel('y轴');
zlabel('z轴');
colormap(jet);
colorbar;
grid on;

六、三维图核心美化技巧

1. 视角调整(view())

view(az, el)设置三维视角,az为方位角(绕z轴旋转,0°=正前方,90°=右侧),el为仰角(与xy平面夹角,0°=俯视,90°=正视):

view(45, 30);  % 常用视角(45°方位角,30°仰角)
view(0, 90);   % 正上方俯视
view(90, 0);   % 正右侧正视
view(3);       % 默认三维视角(az=-37.5°, el=30°)

2. 颜色映射(colormap())

MATLAB内置多种色映射,适配不同场景:

colormap(jet);    % 彩虹色(默认,适合数值对比)
colormap(gray);   % 灰度色(适合黑白打印)
colormap(hot);    % 热色(红-黄-白,适合温度/密度)
colormap(cool);   % 冷色(青-品红,适合冷色调数据)
colormap(parula); % 柔和色(MATLAB R2014b+默认)

3. 着色方式(shading())

调整曲面填充方式,影响视觉效果:

shading faceted;  % 默认:带网格线的分块着色
shading flat;     % 无网格线,区域平坦着色
shading interp;   % 插值着色,颜色平滑过渡

4. 坐标轴与网格优化

% 统一坐标轴范围
xlim([-10, 10]);
ylim([-10, 10]);
zlim([-0.5, 1]);

% 显示/隐藏网格
grid on;   % 显示三维网格
grid off;  % 隐藏网格

% 隐藏坐标轴
axis off;

七、完整实战案例:三维数据综合可视化

以“地形高度数据”为例,整合mesh()/surf()/contour3()做全方位展示:

% 实战:地形高度数据三维可视化
clear all; clc;

% 1. 生成模拟地形数据
x = -20:1:20;
y = -20:1:20;
[X, Y] = meshgrid(x, y);
% 模拟双峰地形
Z1 = exp(-((X-5).^2 + (Y-5).^2)/50);
Z2 = exp(-((X+5).^2 + (Y+5).^2)/50);
Z = (Z1 + Z2) * 10;

% 2. 子图1:网格图
subplot(2,2,1);
mesh(X, Y, Z);
title('地形网格图(mesh)');
xlabel('x轴');
ylabel('y轴');
zlabel('高度');
colormap(jet);
grid on;

% 3. 子图2:曲面图
subplot(2,2,2);
surf(X, Y, Z);
title('地形曲面图(surf)');
xlabel('x轴');
ylabel('y轴');
zlabel('高度');
shading interp;
colormap(jet);
colorbar;
grid on;

% 4. 子图3:三维等高线
subplot(2,2,3);
contour3(X, Y, Z, 15);
title('地形三维等高线(contour3)');
xlabel('x轴');
ylabel('y轴');
zlabel('高度');
colormap(jet);
grid on;

% 5. 子图4:曲面+等高线叠加
subplot(2,2,4);
surf(X, Y, Z, 'FaceAlpha', 0.7);  % 半透明曲面
hold on;
contour3(X, Y, Z, 10, 'k', 'LineWidth', 1);  % 黑色等高线
hold off;
title('曲面+等高线叠加');
xlabel('x轴');
ylabel('y轴');
zlabel('高度');
shading flat;
colormap(jet);
colorbar;
grid on;

% 6. 调整子图间距+总标题
subplotadjust('hspace',0.4, 'wspace',0.4);
sgtitle('地形高度数据三维综合可视化', 'FontSize', 14, 'FontWeight', 'bold');

八、常见问题与避坑指南

常见错误原因分析解决方法
mesh/surf绘图报错X/Y/Z矩阵维度不一致(未用meshgrid生成网格)确保[X,Y]=meshgrid(x,y),Z与X/Y维度相同
三维图颜色无变化未设置colormap或Z值范围过小用colormap(jet),或缩放Z值范围
等高线数值标注不显示clabel()参数错误,或等高线条数过多减少等高线条数,确保[C,h]=contour3()后调用clabel
视角调整后图形变形坐标轴比例不一致(默认自动缩放)用axis equal统一坐标轴比例
中文标签乱码未设置中文字体添加set(gca,'FontName','SimHei')

九、进阶技巧

1. 交互式调整三维图

绘制完成后,可通过MATLAB绘图窗口的“旋转3D”工具手动拖动调整视角,或通过“属性编辑器”修改颜色、透明度、网格样式,快速优化效果。

2. 保存高清三维图

% 保存为300dpi的PNG图(无模糊)
print('-dpng', '-r300', '3D_terrain.png');
% 保存为矢量PDF图(可无限放大)
print('-dpdf', '3D_terrain.pdf');

3. 批量绘制三维子图

% 示例:循环绘制4种视角的曲面图
clear all; clc;
x = -3:0.2:3;
y = -3:0.2:3;
[X,Y] = meshgrid(x,y);
Z = X.^2 + Y.^2;
views = {[30,30], [45,45], [60,30], [90,0]};  % 4组视角

for i = 1:4
    subplot(2,2,i);
    surf(X,Y,Z);
    view(views{i});
    title(['视角:', num2str(views{i}(1)), '°,', num2str(views{i}(2)), '°']);
    colormap(jet);
    shading interp;
end
sgtitle('不同视角的抛物面曲面图', 'FontSize', 14);

MATLAB三维绘图的核心总结

MATLAB三维绘图的核心是“数据结构+函数匹配+样式美化”:

  1. 数据准备:用meshgrid()生成二维网格,确保X/Y/Z维度一致;
  2. 函数选择:曲线用plot3()、轮廓用mesh()、填充曲面用surf()、等值线用contour3()
  3. 美化核心:通过view()调整视角、colormap()设置颜色、shading()优化填充、colorbar()标注数值;
  4. 实战技巧:叠加等高线/曲线丰富信息,批量绘制子图提升效率。