【MATLAB绘图进阶教程】MATLAB三维绘图:plot3、mesh、surf三种立体图绘图讲解与示例

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

在这里插入图片描述

简述

本教程包含:

  1. plot3(三维曲线)

    • 基础语法和使用场景
    • 螺旋线、多条曲线、动态曲线等示例
    • 适合绘制轨迹、路径和时间序列数据
  2. mesh(网格曲面)

    • 网格结构的可视化
    • 不同网格密度、颜色配置
    • 复杂数学函数和动态动画示例
  3. surf(填充曲面)

    • 光滑曲面绘制
    • 不同着色模式对比
    • 参数化曲面(球面、环面、双曲面等)
  4. 对比分析:帮助你根据具体需求选择合适的绘图方法

  5. 综合应用:展示如何组合使用多种绘图命令

每个示例都提供了完整的代码,可以直接在MATLAB中运行,文末也有整合各种示例的mlx文件,下载后可直接在MATLAB上运行查看

plot3 - 三维曲线绘制

基本语法

plot3(x, y, z)
plot3(x, y, z, LineSpec)
plot3(x1, y1, z1, LineSpec1, x2, y2, z2, LineSpec2, ...)

使用场景

  • 绘制三维空间中的曲线轨迹
  • 显示参数方程的三维图形
  • 绘制数据点的连线
  • 可视化时间序列的三维演化

基础示例

% 螺旋线
t = 0:pi/50:10*pi;
x = sin(t);
y = cos(t);
z = t;
plot3(x, y, z, 'r-', 'LineWidth', 2);
grid on;
xlabel('X'); ylabel('Y'); zlabel('Z');
title('三维螺旋线');

运行结果:
在这里插入图片描述

进阶示例

多条曲线绘制

% 绘制多条三维曲线
t = 0:pi/100:4*pi;

% 曲线1:螺旋线
x1 = cos(t);
y1 = sin(t);
z1 = t/(2*pi);

% 曲线2:椭圆螺旋
x2 = 2*cos(t);
y2 = sin(t);
z2 = t/(4*pi);

% 曲线3:波浪螺旋
x3 = cos(t) .* (1 + 0.3*sin(5*t));
y3 = sin(t) .* (1 + 0.3*sin(5*t));
z3 = t/(3*pi);

figure;
hold on;
plot3(x1, y1, z1, 'r-', 'LineWidth', 2, 'DisplayName', '标准螺旋');
plot3(x2, y2, z2, 'g--', 'LineWidth', 2, 'DisplayName', '椭圆螺旋');
plot3(x3, y3, z3, 'b:', 'LineWidth', 2, 'DisplayName', '波浪螺旋');
grid on;
legend('show');
xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴');
title('多条三维曲线对比');
view(45, 30);

运行结果:
在这里插入图片描述

动态三维曲线

% 动态绘制三维曲线
figure;
t = 0:0.1:4*pi;
for k = 1:length(t)
    % 动态螺旋线
    x = cos(t(1:k));
    y = sin(t(1:k));
    z = t(1:k)/(2*pi);
    
    plot3(x, y, z, 'b-', 'LineWidth', 2);
    grid on;
    xlabel('X'); ylabel('Y'); zlabel('Z');
    title(sprintf('动态螺旋线 (t = %.1f)', t(k)));
    axis([-1.5 1.5 -1.5 1.5 0 2]);
    view(45, 30);
    drawnow;
    pause(0.05);
end

运行结果:

动态绘图

参数化三维曲线族

% 不同参数的三维曲线族
figure;
hold on;
colors = ['r', 'g', 'b', 'c', 'm', 'y'];
t = 0:0.1:4*pi;

for a = 1:6
    x = cos(a*t);
    y = sin(a*t);
    z = t;
    plot3(x, y, z, colors(a), 'LineWidth', 1.5, ...
          'DisplayName', sprintf('频率参数 a = %d', a));
end

grid on;
legend('show');
xlabel('X'); ylabel('Y'); zlabel('Z');
title('不同频率参数的三维曲线族');
view(45, 30);

运行结果:
在这里插入图片描述

mesh - 三维网格曲面

基本语法

mesh(X, Y, Z)
mesh(Z)
mesh(..., C)
mesh(..., 'PropertyName', PropertyValue)

使用场景

  • 显示函数的三维网格结构
  • 分析数据的网格分布
  • 查看曲面的网格细节
  • 适合观察曲面的拓扑结构

基础示例

% 基本网格曲面
[X, Y] = meshgrid(-3:0.25:3, -3:0.25:3);
Z = peaks(X, Y);
mesh(X, Y, Z);
xlabel('X'); ylabel('Y'); zlabel('Z');
title('Peaks函数的网格曲面');

运行结果:
在这里插入图片描述

进阶示例

自定义网格密度和颜色

% 不同网格密度对比
figure;

% 粗网格
subplot(2,2,1);
[X1, Y1] = meshgrid(-2:0.5:2, -2:0.5:2);
Z1 = X1.^2 + Y1.^2;
mesh(X1, Y1, Z1);
title('粗网格 (步长0.5)');
xlabel('X'); ylabel('Y'); zlabel('Z');

% 细网格
subplot(2,2,2);
[X2, Y2] = meshgrid(-2:0.1:2, -2:0.1:2);
Z2 = X2.^2 + Y2.^2;
mesh(X2, Y2, Z2);
title('细网格 (步长0.1)');
xlabel('X'); ylabel('Y'); zlabel('Z');

% 自定义颜色映射
subplot(2,2,3);
mesh(X2, Y2, Z2);
colormap(hot);
colorbar;
title('热色图配色');
xlabel('X'); ylabel('Y'); zlabel('Z');

% 单色网格
subplot(2,2,4);
mesh(X2, Y2, Z2, 'EdgeColor', 'blue', 'FaceColor', 'none');
title('蓝色单色网格');
xlabel('X'); ylabel('Y'); zlabel('Z');

运行结果:
在这里插入图片描述

复杂数学函数的网格可视化

% 多个数学函数的网格展示
figure;

% 波浪函数
subplot(2,3,1);
[X, Y] = meshgrid(-2*pi:0.2:2*pi, -2*pi:0.2:2*pi);
Z = sin(sqrt(X.^2 + Y.^2));
mesh(X, Y, Z);
title('波浪函数: sin(√(x²+y²))');

% 鞍面函数
subplot(2,3,2);
Z = X.^2 - Y.^2;
mesh(X, Y, Z);
title('鞍面: x² - y²');

% 高斯函数
subplot(2,3,3);
Z = exp(-(X.^2 + Y.^2)/2);
mesh(X, Y, Z);
title('高斯函数: e^(-(x²+y²)/2)');

% 正弦波乘积
subplot(2,3,4);
Z = sin(X) .* cos(Y);
mesh(X, Y, Z);
title('正弦波乘积: sin(x)cos(y)');

% 椭圆抛物面
subplot(2,3,5);
Z = X.^2/4 + Y.^2;
mesh(X, Y, Z);
title('椭圆抛物面: x²/4 + y²');

% 双曲抛物面
subplot(2,3,6);
Z = X.*Y;
mesh(X, Y, Z);
title('双曲抛物面: xy');

运行结果:
在这里插入图片描述

动态网格动画

% 动态波动网格
figure;
[X, Y] = meshgrid(-3:0.2:3, -3:0.2:3);

for t = 0:0.1:4*pi
    Z = sin(sqrt(X.^2 + Y.^2) - t);
    mesh(X, Y, Z);
    axis([-3 3 -3 3 -1.5 1.5]);
    xlabel('X'); ylabel('Y'); zlabel('Z');
    title(sprintf('动态波动 (t = %.1f)', t));
    colormap(jet);
    drawnow;
    pause(0.05);
end

运行结果:

动态绘图mesh

surf - 三维填充曲面

基本语法

surf(X, Y, Z)
surf(Z)
surf(..., C)
surf(..., 'PropertyName', PropertyValue)

使用场景

  • 显示光滑的三维曲面
  • 数据的连续性可视化
  • 地形图和热力图
  • 科学计算结果的直观展示

基础示例

% 基本填充曲面
[X, Y] = meshgrid(-3:0.1:3, -3:0.1:3);
Z = peaks(X, Y);
surf(X, Y, Z);
shading interp;  % 平滑着色
colorbar;
xlabel('X'); ylabel('Y'); zlabel('Z');
title('Peaks函数的填充曲面');

运行结果:
在这里插入图片描述

进阶示例

不同着色模式对比

% 着色模式对比
figure;
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = sin(pi*X) .* cos(pi*Y);

% faceted着色(默认)
subplot(2,2,1);
surf(X, Y, Z);
shading faceted;
title('Faceted着色');
colorbar;

% flat着色
subplot(2,2,2);
surf(X, Y, Z);
shading flat;
title('Flat着色');
colorbar;

% interp着色
subplot(2,2,3);
surf(X, Y, Z);
shading interp;
title('Interp着色');
colorbar;

% 自定义属性
subplot(2,2,4);
surf(X, Y, Z, 'EdgeColor', 'none', 'FaceAlpha', 0.8);
title('无边缘,半透明');
colorbar;

运行结果:
在这里插入图片描述

多层曲面叠加

% 多层透明曲面
figure;
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);

% 第一层曲面
Z1 = exp(-(X.^2 + Y.^2));
surf(X, Y, Z1, 'FaceAlpha', 0.5, 'EdgeColor', 'none');
hold on;

% 第二层曲面
Z2 = 0.5 * exp(-((X-1).^2 + (Y-1).^2));
surf(X, Y, Z2, 'FaceAlpha', 0.5, 'EdgeColor', 'none');

% 第三层曲面
Z3 = 0.3 * exp(-((X+1).^2 + (Y+1).^2));
surf(X, Y, Z3, 'FaceAlpha', 0.5, 'EdgeColor', 'none');

xlabel('X'); ylabel('Y'); zlabel('Z');
title('多层透明曲面叠加');
colorbar;
view(45, 30);

运行结果:
在这里插入图片描述

参数化曲面

% 各种参数化曲面
figure;

% 球面
subplot(2,3,1);
[u, v] = meshgrid(0:0.1:2*pi, 0:0.1:pi);
x = sin(v) .* cos(u);
y = sin(v) .* sin(u);
z = cos(v);
surf(x, y, z);
shading interp;
title('球面');
axis equal;

% 环面(甜甜圈)
subplot(2,3,2);
R = 3; r = 1;
[u, v] = meshgrid(0:0.2:2*pi, 0:0.2:2*pi);
x = (R + r*cos(v)) .* cos(u);
y = (R + r*cos(v)) .* sin(u);
z = r * sin(v);
surf(x, y, z);
shading interp;
title('环面');
axis equal;

% 双曲面
subplot(2,3,3);
[u, v] = meshgrid(-2:0.1:2, 0:0.2:2*pi);
x = cosh(u) .* cos(v);
y = cosh(u) .* sin(v);
z = sinh(u);
surf(x, y, z);
shading interp;
title('双曲面');

% 椭球面
subplot(2,3,4);
a = 2; b = 1; c = 0.5;
[u, v] = meshgrid(0:0.2:2*pi, 0:0.2:pi);
x = a * sin(v) .* cos(u);
y = b * sin(v) .* sin(u);
z = c * cos(v);
surf(x, y, z);
shading interp;
title('椭球面');
axis equal;

% 抛物面
subplot(2,3,5);
[u, v] = meshgrid(-2:0.1:2, -2:0.1:2);
x = u;
y = v;
z = u.^2 + v.^2;
surf(x, y, z);
shading interp;
title('抛物面');

% 螺旋面
subplot(2,3,6);
[u, v] = meshgrid(0:0.1:4*pi, -1:0.1:1);
x = u .* cos(u);
y = u .* sin(u);
z = v;
surf(x, y, z);
shading interp;
title('螺旋面');

运行结果:
在这里插入图片描述

三个命令的对比与选择

功能对比表

特性plot3meshsurf
用途三维曲线网格曲面填充曲面
数据类型向量矩阵矩阵
视觉效果线条网格框架实心曲面
适用场景轨迹、路径结构分析连续数据
计算负荷

选择建议

  1. plot3

    • 显示数据点的连接关系
    • 轨迹和路径可视化
    • 时间序列的三维展示
  2. mesh

    • 需要看到曲面的网格结构
    • 分析函数的局部特征
    • 数据点相对较少时
  3. surf

    • 需要光滑的视觉效果
    • 展示连续的数据分布
    • 制作演示用的精美图形

综合应用示例

复杂数据可视化

% 综合三种绘图方法的应用
figure;

% 生成数据
[X, Y] = meshgrid(-3:0.2:3, -3:0.2:3);
Z = peaks(X, Y);

% 绘制填充曲面作为背景
surf(X, Y, Z, 'FaceAlpha', 0.7, 'EdgeColor', 'none');
hold on;

% 添加等高线(投影到底面)
contour3(X, Y, Z, 10, 'k-', 'LineWidth', 1);

% 添加特殊路径(plot3)
t = -3:0.1:3;
x_path = t;
y_path = sin(t);
z_path = interp2(X, Y, Z, x_path, y_path, 'cubic') + 0.5;
plot3(x_path, y_path, z_path, 'r-', 'LineWidth', 3);

% 添加关键点
peak_points_x = [0, 1.3, -1.3];
peak_points_y = [0, 0, 0];
peak_points_z = [8.1, -6.5, -6.5];
plot3(peak_points_x, peak_points_y, peak_points_z, 'ro', ...
      'MarkerSize', 10, 'MarkerFaceColor', 'yellow');

xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴');
title('综合三维可视化:surf + contour3 + plot3');
colorbar;
legend('曲面', '等高线', '路径', '关键点', 'Location', 'best');
view(45, 30);

运行结果:
在这里插入图片描述

总结

这三个命令各有特色和适用场景:

  • plot3适合绘制三维曲线和轨迹
  • mesh适合显示网格结构和分析细节
  • surf适合展示光滑的连续曲面

mlx文件的下载链接:
通过网盘分享的文件:draw_3dim_1.mlx
链接: https://pan.baidu.com/s/1xOnknUL76gN-O5z5HyWWDQ?pwd=ekf6 提取码: ekf6

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB卡尔曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值