MATLAB三维绘图教程:plot3/mesh/surf/contour函数详解与实例

文章目录

在科学计算、工程仿真和数据可视化领域,MATLAB凭借强大的绘图功能成为从业者的首选工具之一。三维绘图能够直观展现数据在三维空间中的分布规律和几何特征,而 plot3()mesh()surf()contour()是MATLAB中最核心的三维绘图函数,分别适用于三维线图、网格图、曲面图和等高线图的绘制。

一、三维绘图前期准备:数据生成与基础工具

1.MATLAB下载安装教程

MATLAB下载安装教程(附安装包): https://blog.csdn.net/tyatyatya/article/details/147879353

2.MATLAB三维绘图函

在使用三维绘图函数前,首先需要生成三维空间的坐标数据。MATLAB中常用linspace()生成等间距向量,用meshgrid()将一维向量转换为二维网格矩阵,这是绘制三维图形的基础步骤。

  • linspace(a, b, n):在区间[a,b]生成n个等间距的数值;
  • meshgrid(x, y):将一维向量xy转换为二维网格矩阵XY,其中X的每行都是xY的每列都是y

示例代码:

matlab 复制代码
% 生成x轴和y轴的等间距向量
x = linspace(-2*pi, 2*pi, 100);
y = linspace(-pi, pi, 100);
% 转换为二维网格矩阵
[X, Y] = meshgrid(x, y);

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

plot3()是MATLAB中绘制三维折线/曲线的基础函数,适用于展示三维空间中数据点的连续变化趋势,比如运动轨迹、时间序列的三维关联等。

1. 基本语法

matlab 复制代码
plot3(X, Y, Z)
plot3(X, Y, Z, LineSpec)
plot3(X, Y, Z, 'PropertyName', PropertyValue)
  • XYZ:可以是长度相同的一维向量(绘制单条曲线),也可以是同维度的矩阵(绘制多条曲线);
  • LineSpec:可选参数,用于指定线条样式、标记符号和颜色,如'r--o'表示红色虚线+圆形标记;
  • PropertyName:可选属性,如LineWidth(线宽)、MarkerSize(标记大小)等。

2. 实战实例:绘制三维螺旋线

三维螺旋线是典型的三维曲线案例,其数学表达式为x=cos(t)y=sin(t)z=t,具体实现代码如下:

matlab 复制代码
% 生成参数t的取值
t = 0:0.1:10*pi;
% 计算三维坐标
x = cos(t);
y = sin(t);
z = t;
% 绘制三维螺旋线
plot3(x, y, z, 'b-', 'LineWidth', 2);
% 添加坐标轴标签和标题
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
title('三维螺旋线');
% 显示网格
grid on;
% 开启坐标轴等比例
axis equal;

代码说明:

  • grid on:显示网格线,增强图形的空间感;
  • axis equal:设置三个坐标轴的刻度比例一致,避免图形变形;
  • xlabel/ylabel/zlabel:为坐标轴添加标签,提升图形可读性。

运行后将得到沿Z轴上升的螺旋曲线,清晰展现三维空间中曲线的连续变化。

三、mesh():绘制三维网格图

mesh()函数用于绘制三维网格图,通过线条的交叉构成网格面,侧重展示三维曲面的拓扑结构,适合观察数据的整体分布趋势,而不强调曲面的填充效果。

1. 基本语法

matlab 复制代码
mesh(X, Y, Z)
mesh(X, Y, Z, C)
mesh(..., 'PropertyName', PropertyValue)
  • XYZ:必须是同维度的二维矩阵,Z表示网格点的高度值;
  • C:可选参数,用于指定网格的颜色映射,默认与Z的数值关联;
  • 常用属性:EdgeColor(网格线颜色)、FaceAlpha(透明度,仅对后续版本有效)等。

2. mesh与plot3的区别

  • plot3()绘制的是线,数据维度为一维向量或按列/行的矩阵;
  • mesh()绘制的是网格面,数据必须是二维矩阵,展现的是整个曲面的轮廓。

3. 实战实例:绘制peaks函数网格图

MATLAB内置的peaks()函数是一个经典的三维测试函数,其表达式包含多个高斯分布的叠加,适合用于三维绘图演示。

matlab 复制代码
% 生成网格数据
[x, y] = meshgrid(-3:0.1:3, -3:0.1:3);
% 计算peaks函数的z值
z = peaks(x, y);
% 绘制三维网格图
mesh(x, y, z);
% 添加标签和标题
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
title('peaks函数三维网格图');
% 开启颜色条
colorbar;

代码说明:colorbar会显示颜色与Z值的对应关系,帮助直观判断曲面的高度变化。

四、surf():绘制三维曲面图

surf()函数与mesh()语法类似,但它会对网格之间的区域进行颜色填充,更适合展示三维曲面的细节和连续的颜色渐变,视觉效果比网格图更丰富。

1. 基本语法

matlab 复制代码
surf(X, Y, Z)
surf(X, Y, Z, C)
surf(..., 'PropertyName', PropertyValue)

参数含义与mesh()一致,核心区别在于surf()会填充网格的面,而mesh()仅绘制网格线。

2. surf与mesh的区别

  • mesh():仅显示网格线,无面填充,突出曲面的框架结构;
  • surf():填充网格面,颜色可随高度或自定义参数变化,更适合展示曲面的连续特征。

3. 实战实例:绘制peaks函数彩色曲面图

surf()中可通过shading函数调整颜色渲染方式,shading interp表示插值着色,使颜色过渡更平滑。

matlab 复制代码
% 生成网格数据
[x, y] = meshgrid(-3:0.1:3, -3:0.1:3);
% 计算peaks函数的z值
z = peaks(x, y);
% 绘制三维曲面图
surf(x, y, z);
% 设置插值着色
shading interp;
% 添加标签、标题和颜色条
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
title('peaks函数三维曲面图');
colorbar;
% 设置视角(方位角30°,仰角45°)
view(30, 45);

代码说明:view(az, el)用于调整图形的观察视角,az是方位角(绕Z轴的旋转角度),el是仰角(与XY平面的夹角)。

五、contour():绘制等高线图

contour()函数用于绘制二维等高线图,而contour3()可绘制三维等高线图,二者均通过等高线的疏密和数值,反映三维曲面在XY平面上的高度分布特征,广泛应用于地形分析、气压分布等场景。

1. 基本语法

(1)二维等高线contour()
matlab 复制代码
contour(X, Y, Z)
contour(X, Y, Z, n)
contour(X, Y, Z, v)
  • n:指定等高线的条数;
  • v:一维向量,指定等高线的高度值,如v=[-2, 0, 2]仅绘制高度为-2、0、2的等高线。
(2)三维等高线contour3()
matlab 复制代码
contour3(X, Y, Z, n)

参数与contour()一致,只是将等高线绘制在三维空间中对应的高度位置。

2. 实战实例:peaks函数等高线图

分别绘制二维和三维等高线,对比展示高度分布:

matlab 复制代码
% 生成网格数据
[x, y] = meshgrid(-3:0.1:3, -3:0.1:3);
z = peaks(x, y);

% 绘制二维等高线图(子图1)
subplot(1,2,1);
contour(x, y, z, 15); % 绘制15条等高线
xlabel('X轴');
ylabel('Y轴');
title('peaks函数二维等高线');
colorbar;
grid on;

% 绘制三维等高线图(子图2)
subplot(1,2,2);
contour3(x, y, z, 15);
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
title('peaks函数三维等高线');
colorbar;
grid on;

代码说明:subplot(m,n,p)用于将绘图窗口分为mn列,并在第p个位置绘制图形,方便对比不同绘图效果。

六、三维绘图进阶技巧

  1. 视角调整 :除了view(az, el),还可以使用rotate3d on开启交互式视角旋转,用鼠标拖动即可调整观察角度;
  2. 颜色映射 :通过colormap函数设置颜色方案,如colormap jet(彩虹色)、colormap gray(灰度)、colormap cool(冷色调);
  3. 透明度设置 :对surf()绘制的曲面,可通过alpha(0.5)设置透明度(0为完全透明,1为不透明);
  4. 图形标注 :使用text(x, y, z, '标注内容')在三维空间指定位置添加文本标注,用legend()添加图例。
相关推荐
白昼流星!2 小时前
C++内存四区与new操作符详解
开发语言·c++
十五年专注C++开发2 小时前
标准C++操作文件方法总结
开发语言·c++·文件操作·ifstream
浔川python社2 小时前
《C++ 小程序编写系列》(第四部):实战:简易图书管理系统(类与对象篇)
java·开发语言·apache
浔川python社2 小时前
《C++ 小程序编写系列》(第五部):实战:多角色图书管理系统(继承与多态篇)
开发语言·c++
CC.GG2 小时前
【Qt】信号和槽
开发语言·数据库·qt
是席木木啊2 小时前
基于MinIO Java SDK实现ZIP文件上传的方案与实践
java·开发语言
一起养小猫2 小时前
《Java数据结构与算法》第四篇(四):二叉树的高级操作查找与删除实现详解
java·开发语言·数据结构·算法
ALex_zry2 小时前
C++20/23标准对进程间共享信息的优化:从传统IPC到现代C++的演进
开发语言·c++·c++20
IMPYLH3 小时前
Lua 的 OS(操作系统) 模块
开发语言·笔记·后端·游戏引擎·lua