在MATLAB中绘制三维图是可视化三维数据关系的核心技能,常用的三维图类型包括三维网格图、曲面图、散点图、线图等。我会从「数据准备→核心绘图函数→美化技巧」一步步讲解,所有代码可直接运行,覆盖新手最常用的场景。
一、三维图绘制基础(核心步骤)
绘制三维图的通用流程:
- 生成/导入三维数据(通常用
meshgrid生成网格矩阵); - 选择对应绘图函数(mesh/surf/scatter3/plot3);
- 美化图表(坐标轴、颜色、视角等)。
1. 第一步:数据准备(meshgrid生成网格)
三维图的X/Y轴通常需要网格矩阵(而非一维数组),meshgrid是生成网格的核心函数:
% 生成X/Y网格:范围-2π到2π,步长0.1
x = linspace(-2*pi, 2*pi, 100); % 一维数组
y = linspace(-2*pi, 2*pi, 100);
[X, Y] = meshgrid(x, y); % 转换为100x100的网格矩阵% 定义Z轴(三维曲面公式,以z = sin(√(X²+Y²))/(√(X²+Y²))为例)
R = sqrt(X.^2 + Y.^2); % 点到原点的距离(元素级运算用.^)
Z = sin(R)./R;
% 处理R=0时的NaN(除以0)
Z(R==0) = 1; % sin(0)/0极限为1
二、核心三维图类型(实战示例)
1. 三维网格图(mesh):展示曲面轮廓(空心)
适合突出曲面的网格结构,视觉上更简洁:
figure('Name', '三维网格图');
mesh(X, Y, Z); % 核心函数
% 基础美化
xlabel('X轴', 'FontSize', 12);
ylabel('Y轴', 'FontSize', 12);
zlabel('Z轴', 'FontSize', 12);
title('三维网格图:z = sin(√(X²+Y²))/(√(X²+Y²))', 'FontSize', 14);
colormap(jet); % 设置颜色映射(jet是MATLAB经典配色)
colorbar; % 显示颜色条(对应Z值大小)
grid on;
view(3); % 设置3D视角(也可用view(az, el)自定义方位角/仰角)
2. 三维曲面图(surf):展示填充曲面(实心)
适合强调曲面的颜色和高度,是最常用的三维图类型:
figure('Name', '三维曲面图');
surf(X, Y, Z, ...'FaceColor', 'interp', ... % 颜色插值(平滑着色)'EdgeColor', 'none', ... % 隐藏网格线(更美观)'FaceAlpha', 0.8); % 透明度(0-1,0为全透明)
% 进阶美化
xlabel('X轴', 'FontSize', 12);
ylabel('Y轴', 'FontSize', 12);
zlabel('Z轴', 'FontSize', 12);
title('三维曲面图(平滑着色+透明)', 'FontSize', 14);
colormap(parula); % 更柔和的配色(MATLAB默认)
colorbar;
shading interp; % 进一步平滑颜色
axis tight; % 紧凑坐标轴
camlight; % 添加光源(增强立体感)
lighting gouraud; % 光影效果
3. 三维散点图(scatter3):展示离散三维数据
适合可视化离散点的三维分布(如传感器数据、聚类结果):
% 生成示例离散数据(3类聚类数据)
rng(1); % 固定随机种子,结果可复现
% 第一类点
x1 = randn(50,1) + 2;
y1 = randn(50,1) + 2;
z1 = randn(50,1) + 2;
% 第二类点
x2 = randn(50,1) - 2;
y2 = randn(50,1) - 2;
z2 = randn(50,1) - 2;
% 第三类点
x3 = randn(50,1);
y3 = randn(50,1);
z3 = randn(50,1) - 3;figure('Name', '三维散点图');
scatter3(x1, y1, z1, 50, 'r', 'filled', 'DisplayName', '类别1'); % 50=点大小,红色填充
hold on;
scatter3(x2, y2, z2, 50, 'g', 'filled', 'DisplayName', '类别2');
scatter3(x3, y3, z3, 50, 'b', 'filled', 'DisplayName', '类别3');
% 美化
xlabel('X轴', 'FontSize', 12);
ylabel('Y轴', 'FontSize', 12);
zlabel('Z轴', 'FontSize', 12);
title('三维聚类数据散点图', 'FontSize', 14);
legend('Location', 'best');
grid on;
hold off;
4. 三维线图(plot3):展示三维曲线
适合可视化三维轨迹(如运动路径、时间序列):
% 生成三维螺旋线数据
t = linspace(0, 10*pi, 500);
x = cos(t);
y = sin(t);
z = t/2;figure('Name', '三维线图');
plot3(x, y, z, 'Color', [0.2 0.6 0.8], 'LineWidth', 2);
% 美化
xlabel('cos(t)', 'FontSize', 12);
ylabel('sin(t)', 'FontSize', 12);
zlabel('t/2', 'FontSize', 12);
title('三维螺旋线', 'FontSize', 14);
grid on;
axis equal; % 等比例坐标轴
三、三维图进阶技巧(美化+交互)
1. 自定义视角(view)
通过view(az, el)自定义视角,az是方位角(绕Z轴旋转,0=正前方,90=右侧),el是仰角(与XY平面的夹角,0=俯视,90=正视):
% 为曲面图设置自定义视角
figure('Name', '自定义视角曲面图');
surf(X, Y, Z);
xlabel('X'); ylabel('Y'); zlabel('Z');
title('视角:方位角30°,仰角45°');
view(30, 45); % 方位角30°,仰角45°
colormap(jet);
colorbar;
2. 等高线叠加(contour3)
在三维图中叠加等高线,更清晰展示Z值分布:
figure('Name', '带等高线的曲面图');
surf(X, Y, Z);
hold on;
contour3(X, Y, Z, 20, 'k'); % 20条等高线,黑色
hold off;
xlabel('X'); ylabel('Y'); zlabel('Z');
title('曲面图+等高线');
colormap(jet);
colorbar;
3. 保存高分辨率三维图
三维图保存需注意视角和分辨率,推荐用print函数:
% 保存三维曲面图为300dpi的PNG图片
figure('Position', [100, 100, 800, 600]); % 窗口大小
surf(X, Y, Z);
colormap(parula);
colorbar;
title('高分辨率三维图');
print(gcf, '3D_surface.png', '-dpng', '-r300'); % 300dpi,PNG格式
4. 交互式旋转/缩放
MATLAB绘图窗口默认支持交互:
- 鼠标左键:旋转视角;
- 鼠标右键:缩放;
- 鼠标滚轮:快速缩放;
- 双击坐标轴:修改刻度/标签。
四、常见问题解决
- 中文乱码:
全局设置中文字体,避免三维图中中文标签乱码:set(0, 'DefaultAxesFontName', 'Microsoft YaHei'); % 坐标轴字体 set(0, 'DefaultTextFontName', 'Microsoft YaHei'); % 标题/图例字体 - 曲面颜色异常:
若曲面颜色不均匀,添加shading interp实现平滑着色;若想让颜色随Z值变化,确保surf的第四个参数为Z(默认就是)。 - 网格矩阵维度不匹配:
报错Dimensions of matrices being concatenated are not consistent时,检查X/Y/Z的维度是否一致(需同为m×n矩阵)。
五、核心函数速查
| 三维图类型 | 核心函数 | 适用场景 |
|---|---|---|
| 网格图 | mesh | 曲面轮廓展示 |
| 曲面图 | surf | 填充曲面,突出高度/颜色 |
| 散点图 | scatter3 | 离散三维数据分布 |
| 线图 | plot3 | 三维曲线/轨迹 |
| 等高线图 | contour3 | 叠加等高线展示Z值分布 |
| 视角调整 | view | 自定义观察角度 |
