使用Matlab绘制简单的二维与三维图形

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【10月更文挑战第3天】本文详细介绍了如何在 Matlab 中绘制简单的二维和三维图形,包括曲线图、柱状图、散点图、网格图、表面图、等高线图、多边形填充图、切片图及矢量场等。文章提供了丰富的代码示例,如使用 `plot`、`bar`、`scatter`、`plot3`、`mesh`、`surf`、`contour` 等函数绘制不同类型图形的方法,并介绍了 `rotate3d`、`comet3` 和 `movie` 等工具实现图形的交互和动画效果。通过这些示例,读者可以轻松掌握 Matlab 的绘图技巧,并应用于数据可视化和分析中。

Matlab 是一种强大的科学计算工具,它不仅支持矩阵运算、数据分析,还可以用于绘制各种图形。本文将详细介绍如何在 Matlab 中绘制简单的二维和三维图形,并附带代码示例以帮助理解。

二维图形绘制

二维图形通常用于展示函数的关系、数据分布和趋势分析。Matlab 提供了多种函数用于绘制不同类型的二维图形,最常见的有 plotbarscatter 等。

1. 使用 plot 函数绘制简单曲线

plot 是 Matlab 中最常用的函数之一,用于绘制二维曲线图。

示例代码:

% 定义 x 轴的范围
x = 0:0.1:10;

% 定义 y = sin(x) 的函数
y = sin(x);

% 使用 plot 绘制曲线
plot(x, y);

% 设置图形的标题、轴标签和网格
title('y = sin(x) 的二维曲线');
xlabel('x 轴');
ylabel('y 轴');
grid on;

代码解析:

  • x = 0:0.1:10; 定义了 x 轴从 0 到 10,步长为 0.1 的数组。
  • y = sin(x); 计算 y = sin(x) 的值。
  • plot(x, y); 绘制曲线图。
  • title, xlabel, ylabelgrid on 用于设置标题、标签和网格。

2. 使用 bar 函数绘制柱状图

bar 函数可以用来绘制柱状图,常用于展示离散数据的对比。

示例代码:

% 定义分类数据
categories = {'A', 'B', 'C', 'D'};
values = [10, 15, 8, 12];

% 使用 bar 绘制柱状图
bar(values);

% 设置 x 轴的分类标签
set(gca, 'XTickLabel', categories);

% 设置标题和标签
title('简单柱状图');
xlabel('类别');
ylabel('值');

代码解析:

  • categories 定义了分类数据。
  • values 是每个分类对应的数值。
  • bar(values); 用于绘制柱状图。
  • set(gca, 'XTickLabel', categories); 设置 x 轴的分类标签。

3. 使用 scatter 函数绘制散点图

scatter 函数适合用于展示数据点的分布。

示例代码:

% 随机生成 50 个数据点
x = randn(1, 50);
y = randn(1, 50);

% 使用 scatter 绘制散点图
scatter(x, y, 'filled');

% 设置标题和标签
title('随机散点图');
xlabel('x 轴');
ylabel('y 轴');

代码解析:

  • randn(1, 50) 生成 50 个随机数据点。
  • scatter(x, y, 'filled'); 绘制散点图,并使用 filled 参数填充点的颜色。

三维图形绘制

三维图形通常用于表示更复杂的数据关系,如表面、空间中的点分布等。Matlab 提供了 plot3meshsurf 等常用函数来生成三维图形。

1. 使用 plot3 绘制三维曲线

plot3 函数用于在三维空间中绘制曲线。

示例代码:

% 定义三维空间中的参数 t
t = 0:0.1:10;

% 定义三维曲线的 x, y, z 坐标
x = sin(t);
y = cos(t);
z = t;

% 使用 plot3 绘制三维曲线
plot3(x, y, z);

% 设置图形的标题和轴标签
title('三维螺旋线');
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');
grid on;

代码解析:

  • plot3(x, y, z); 用于绘制三维曲线,其中 x, y, z 是三维空间中的坐标。
  • grid on 显示网格,方便观察曲线。

2. 使用 mesh 函数绘制网格图

mesh 函数用于绘制三维网格图,适合用来展示表面。

示例代码:

% 定义 x 和 y 的范围
[x, y] = meshgrid(-5:0.5:5, -5:0.5:5);

% 计算 z = sin(sqrt(x^2 + y^2))
z = sin(sqrt(x.^2 + y.^2));

% 使用 mesh 绘制三维网格图
mesh(x, y, z);

% 设置标题和轴标签
title('三维网格图');
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');

代码解析:

  • meshgrid 用于生成二维网格点的矩阵。
  • mesh(x, y, z); 用于绘制三维网格图。

3. 使用 surf 函数绘制三维表面图

surf 函数绘制的是光滑的三维表面,与 mesh 不同,它会用颜色来区分表面的高度。

示例代码:

% 定义 x 和 y 的范围
[x, y] = meshgrid(-5:0.5:5, -5:0.5:5);

% 计算 z = sin(sqrt(x^2 + y^2))
z = sin(sqrt(x.^2 + y.^2));

% 使用 surf 绘制三维表面图
surf(x, y, z);

% 设置标题和轴标签
title('三维表面图');
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');

代码解析:

  • surf(x, y, z); 用于绘制三维表面图,颜色随高度变化。

4. 使用 contour 函数绘制等高线图

在二维图形中,等高线图(contour)用于显示三维曲面在某一平面上的投影,特别适合展示三维数据在二维平面上的变化。

示例代码:

% 定义 x 和 y 的范围
[x, y] = meshgrid(-5:0.5:5, -5:0.5:5);

% 计算 z = sin(sqrt(x^2 + y^2))
z = sin(sqrt(x.^2 + y.^2));

% 使用 contour 绘制等高线图
contour(x, y, z);

% 设置标题和轴标签
title('二维等高线图');
xlabel('x 轴');
ylabel('y 轴');

代码解析:

  • contour(x, y, z); 用于绘制二维平面上的等高线图。
  • 通过改变等高线的数量和颜色可以进一步定制图形。

5. 使用 contour3 绘制三维等高线图

与二维等高线图不同,contour3 函数绘制的是三维空间中的等高线图,它可以直观展示不同高度的等高线。

示例代码:

% 定义 x 和 y 的范围
[x, y] = meshgrid(-5:0.5:5, -5:0.5:5);

% 计算 z = sin(sqrt(x^2 + y^2))
z = sin(sqrt(x.^2 + y.^2));

% 使用 contour3 绘制三维等高线图
contour3(x, y, z);

% 设置标题和轴标签
title('三维等高线图');
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');

代码解析:

  • contour3(x, y, z); 绘制三维等高线图,显示不同高度的等高线。

6. 使用 fill 函数绘制填充多边形

fill 函数可以用来绘制并填充多边形。这个函数适用于在二维平面上创建具有特定形状和颜色的图形。

示例代码:

% 定义多边形的顶点坐标
x = [1 3 4 2];
y = [1 1 3 4];

% 使用 fill 函数填充多边形
fill(x, y, 'r');

% 设置标题和标签
title('填充多边形');
xlabel('x 轴');
ylabel('y 轴');

代码解析:

  • fill(x, y, 'r'); 用红色(r)填充由 xy 坐标定义的多边形。

三维图形的进一步操作

1. 使用 slice 函数绘制切片图

slice 函数用于在三维数据中绘制切片,能够帮助用户从不同角度分析三维数据的内部结构。

示例代码:

% 定义三维网格
[x, y, z] = meshgrid(-5:0.5:5, -5:0.5:5, -5:0.5:5);

% 计算三维空间中的数据值
v = sqrt(x.^2 + y.^2 + z.^2);

% 使用 slice 函数绘制三维数据的切片图
slice(x, y, z, v, [0], [0], [0]);

% 设置标题和轴标签
title('三维切片图');
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');

代码解析:

  • slice(x, y, z, v, [0], [0], [0]); 在三维数据的 x=0、y=0、z=0 的位置绘制切片。
  • 这个函数特别适用于处理体数据(例如在科学计算中遇到的三维场数据)。

2. 使用 quiver3 函数绘制三维矢量场

矢量场通常用于表示物理量(如速度、力)的方向和大小。quiver3 函数用于在三维空间中绘制矢量场。

示例代码:

% 定义三维空间中的网格
[x, y, z] = meshgrid(-2:0.5:2, -2:0.5:2, -2:0.5:2);

% 定义三维空间中的矢量分量
u = y;
v = -x;
w = z;

% 使用 quiver3 绘制三维矢量场
quiver3(x, y, z, u, v, w);

% 设置标题和轴标签
title('三维矢量场');
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');

代码解析:

  • quiver3(x, y, z, u, v, w); 在三维空间中绘制矢量场,u, v, w 表示 x、y、z 方向的分量。

动态三维图形

1. 使用 rotate3d 实现三维图形的交互

Matlab 提供了交互式旋转功能,允许用户通过鼠标自由旋转三维图形。可以通过 rotate3d 命令开启这一功能。

示例代码:

% 定义 x 和 y 的范围
[x, y] = meshgrid(-5:0.5:5, -5:0.5:5);

% 计算 z = sin(sqrt(x^2 + y^2))
z = sin(sqrt(x.^2 + y.^2));

% 绘制三维表面图
surf(x, y, z);

% 启用交互式旋转
rotate3d on;

% 设置标题和轴标签
title('交互式三维图形');
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');

代码解析:

  • rotate3d on; 开启三维图形的交互式旋转功能,用户可以通过鼠标旋转图形,观察其不同视角。

进一步扩展与高级应用

1. 使用 meshgridsurf 进行复杂曲面绘制

除了简单的曲线和表面图,meshgridsurf 函数可以用于绘制复杂的三维曲面,例如双曲抛物面、椭圆等。这种绘制方式常用于物理、工程、和数学建模中的复杂曲面可视化。

示例代码:绘制双曲抛物面

% 定义 x 和 y 的范围
[x, y] = meshgrid(-2:0.2:2, -2:0.2:2);

% 计算 z = x^2 - y^2 (双曲抛物面)
z = x.^2 - y.^2;

% 使用 surf 函数绘制三维曲面图
surf(x, y, z);

% 设置颜色映射与阴影效果
colormap('jet');
shading interp;

% 设置标题和轴标签
title('双曲抛物面');
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');

代码解析:

  • z = x.^2 - y.^2; 定义了双曲抛物面的公式。
  • colormap('jet'); 改变颜色映射,使表面颜色更加丰富。
  • shading interp; 通过插值使表面图更平滑。

2. 使用 patch 函数绘制自定义三维多面体

patch 函数可以用于绘制任意形状的多面体,特别是在需要自定义三维物体的形状时很有用。

示例代码:绘制四面体

% 定义四面体的顶点坐标
vertices = [0 0 0; 1 0 0; 0.5 sqrt(3)/2 0; 0.5 sqrt(3)/6 sqrt(6)/3];

% 定义四面体的面
faces = [1 2 3; 1 2 4; 2 3 4; 1 3 4];

% 使用 patch 函数绘制四面体
patch('Vertices', vertices, 'Faces', faces, 'FaceColor', 'cyan');

% 设置视角和轴标签
view(3);
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');
title('自定义三维四面体');
axis equal;

代码解析:

  • vertices 定义了四面体的顶点坐标,faces 定义了多面体的面。
  • patch 函数通过顶点和面的定义绘制多面体,并可以自定义颜色。

3. 使用 isosurface 函数绘制等值面

isosurface 函数能够在三维体数据中提取等值面(例如在医学影像中的等值密度面)。这类技术在三维数据可视化领域非常常用。

示例代码:绘制球形等值面

% 定义三维网格
[x, y, z] = meshgrid(-1:0.1:1, -1:0.1:1, -1:0.1:1);

% 计算球的方程 x^2 + y^2 + z^2 = 1
v = x.^2 + y.^2 + z.^2;

% 使用 isosurface 提取等值面
p = patch(isosurface(x, y, z, v, 1));

% 设置颜色和光照
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
camlight;
lighting gouraud;

% 设置标题和轴标签
title('球形等值面');
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');
axis equal;

代码解析:

  • isosurface(x, y, z, v, 1); 提取等值为 1 的面,这里表示球的表面。
  • camlightlighting gouraud 用于增加光照效果,使图形更加立体。

高级图形操作:图形交互与动画

1. 使用 plot3comet3 制作三维轨迹动画

comet3 函数可以用于绘制三维轨迹动画,显示数据随时间的动态变化,非常适合用于演示三维空间中物体的运动轨迹。

示例代码:绘制三维螺旋线的动画

% 定义 t 的范围
t = 0:0.01:10;

% 计算螺旋线的坐标
x = sin(t);
y = cos(t);
z = t;

% 使用 comet3 绘制三维螺旋线动画
comet3(x, y, z);

% 设置标题和轴标签
title('三维螺旋线动画');
xlabel('x 轴');
ylabel('y 轴');
zlabel('z 轴');

代码解析:

  • comet3(x, y, z); 函数创建了三维动画,展示一个点沿着螺旋线轨迹移动。
  • 适合用于演示物理、机械等领域中的动态现象。

2. 使用 movie 函数制作动画序列

movie 函数可以将一系列图形帧转换为动画,尤其适用于展示时间序列或多步仿真结果。

示例代码:绘制动态正弦波

% 初始化图形窗口
figure;

% 初始化动画帧存储器
F(length(0:0.1:2*pi)) = struct('cdata',[],'colormap',[]);

% 循环生成动态正弦波的每一帧
for k = 1:length(0:0.1:2*pi)
    x = 0:0.1:10;
    y = sin(x + k/10);

    % 绘制正弦波
    plot(x, y);
    axis([0 10 -1 1]);

    % 保存当前帧
    F(k) = getframe;
end

% 播放动画
movie(F, 1, 10);

代码解析:

  • getframe; 用于捕获当前图形窗口的内容,并存储为帧。
  • movie(F, 1, 10); 播放动画,重复 1 次,每秒播放 10 帧。

总结与扩展

本文介绍了 Matlab 中绘制二维与三维图形的基本方法,包括曲线图、柱状图、散点图、网格图、表面图、等高线图、多边形填充图、切片图以及矢量场的绘制。通过这些函数,用户可以轻松生成各种图形并进行数据可视化。

通过使用 rotate3d 等工具,用户还可以创建交互式图形,使数据分析更加直观。在实际应用中,用户可以根据需求进一步定制图形,例如添加颜色映射、调整视角、添加注释等。希望这些示例能帮助您更好地理解 Matlab 绘图,并将其应用到日常的数据分析工作中。

相关文章
|
9月前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
9月前
Matlab绘制图形
Matlab绘制图形
72 0
|
2月前
|
算法 图形学
三维球体空间中光线反射模拟与三维点云提取matlab仿真
本项目使用MATLAB2022A模拟三维椭球体内光线反射并提取三维点云。通过设置椭球模型作为墙壁,根据几何光学原理计算光线在曲面上的反射路径,记录每次反射点坐标,生成三维点云图。核心代码实现多次反射的循环计算与绘图,并展示反射点的位置变化及其平滑处理结果。最终,通过光线追踪技术模拟真实场景中的光线行为,生成精确的三维点云数据,适用于计算机图形学和光学仿真领域。
110 27
|
7月前
|
算法
基于kalman滤波的UAV三维轨迹跟踪算法matlab仿真
本文介绍了一种使用卡尔曼滤波(Kalman Filter)对无人飞行器(UAV)在三维空间中的运动轨迹进行预测和估计的方法。该方法通过状态预测和观测更新两个关键步骤,实时估计UAV的位置和速度,进而生成三维轨迹。在MATLAB 2022a环境下验证了算法的有效性(参见附图)。核心程序实现了状态估计和误差协方差矩阵的更新,并通过调整参数优化滤波效果。该算法有助于提高轨迹跟踪精度和稳定性,适用于多种应用场景,例如航拍和物流运输等领域。
446 12
|
9月前
|
算法 数据安全/隐私保护 C++
基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真
该内容是关于一个图像水印算法的描述。在MATLAB2022a中运行,算法包括水印的嵌入和提取。首先,RGB图像转换为YUV格式,然后水印通过特定规则嵌入到Y分量中,并经过Arnold置乱增强安全性。水印提取时,经过逆过程恢复,使用了二维CS-SCHT变换和噪声对比度(NC)计算来评估水印的鲁棒性。代码中展示了从RGB到YUV的转换、水印嵌入、JPEG压缩攻击模拟以及水印提取的步骤。
|
9月前
|
算法 计算机视觉
基于表面法线法的二维人脸图构建三维人脸模型matlab仿真
该内容概述了一个使用MATLAB2022a的二维人脸图像三维重建算法。首先,通过人脸检测和对齐,然后运用深度信息估计技术(如Shape from Shading)获取表面法线。接着,结合预训练的三维人脸模型库和二维关键点,通过迭代优化和全局优化构建三维模型。核心程序涉及图像处理、光源方向转换、反射率和表面法线计算,最终重构高度图并显示结果。该方法依赖多视角图像,单幅图像重建可能存在挑战。
|
9月前
|
算法 索引
【数学建模竞赛】超详细Matlab二维三维图形绘制
【数学建模竞赛】超详细Matlab二维三维图形绘制
163 1
|
9月前
|
算法
基于Harris角点的室内三维全景图拼接算法matlab仿真
本文介绍了使用Harris角点检测算法构建室内三维全景图的过程。在matlab2022a环境下,通过检测、匹配特征点并进行图像拼接,实现全景图的创建。算法涉及图像梯度计算、协方差矩阵、响应函数及非极大值抑制。示例代码展示了读取图像、调整大小并应用角点检测函数进行图像混合的步骤。最后,通过图像子区显示验证了拼接效果。
|
9月前
|
存储 算法 机器人
基于包围盒算法的三维点云数据压缩和曲面重建matlab仿真
基于包围盒算法的三维点云数据压缩和曲面重建matlab仿真
|
6月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
266 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码