【MATLAB】MATLAB三维曲面绘制【详细教程】

近日需要用Matlab绘制一些三维曲面图,并对其进行标注。于是这些天花了些功夫重新梳理了一遍关于Matlab三维曲面作图的一些注意事项,在此记录备案,便于以后使用查找。

任务要求:已知函数形式,绘制三维曲面

此次以下函数为例,介绍Matlab三维曲面的绘制方式
z = 1 − x 2 + ( y − 1 ) 2 z = 1-\sqrt{x^{2}+(y-1)^{2}} z=1x2+(y1)2

  • 成品效果图如下:

Example

绘图讲解:

1. 绘制三维图像

  • [X,Y] = meshgrid(x,y);:将xy网格化,得到网格化的后的变量XY

所谓的网格化即将原本的一维的坐标轴xy组合,成为一个二维的平面XY。可能有些人会觉得不太好理解,我也不太能用语言描述清楚。不过在工作区点开XY查看其内部的具体值之后即可理解。

  • Fig = mesh(X,Y,Z);:以XYZ为数据绘制三维曲面,并将此曲面赋值给Fig

在最开始的时候我都是用mesh(X,Y,Z)而不用其返回值,后来发现使用返回值调整参数更加容易(这个具体后续细说)

在掌握这两段代码后,能够绘制一个最基本的三维曲面,代码如下:

clear;clc; %清除前置数据

%数据预处理
x = linspace(0,1,50); %设置x轴的范围
y = x; %设置y轴范围
[X,Y] = meshgrid(x,y); %将其x,y轴网格化
Z = 1-sqrt((X).^2+(Y-1).^2); %直接计算

%绘制曲面
Fig = mesh(X,Y,Z); %绘制三维曲面图

由此我们能得到一个非常简陋的三维曲面,而这样的曲面距离我们的要求还有一段距离。

Example 1

2. 坐标轴的设置

上图最明显的感觉就是太空了,因此我们需要为其加上坐标轴:

  • xlabel('x');:设置x轴的变量为x
  • ylabel('$y$','interpreter','latex');:将y轴的变量设置为LaTeX格式的y(这里的代码和LaTeX公式代码完全一致)
  • zlabel('$z$','interpreter','latex','FontSize',18);:除上述功能外,设置z轴变量的字体大小为18pt
  • title('$z = 1-\sqrt{x^{2}+(y-1)^{2}}$','interpreter','latex','FontWeight','bold');:命名标题且加粗

坐标轴的设置还有很多功能,比如说替换字体这种,可以通过帮助文档(在命令行输入help text查看)

注:这里help的是text,这样才有足够详细的可选项说明

我们通过以下代码设置坐标轴的格式:(这里的L(i)同上述Fig可以去掉)

L(1) = xlabel('x');
L(2) = ylabel('$y$','interpreter','latex');
L(3) = zlabel('$z$','interpreter','latex','FontSize',18);
L(4) = title('$z = 1-\sqrt{x^{2}+(y-1)^{2}}$','interpreter','latex','FontWeight','bold');

现在图片变成了这样:
Example 2

这里可以体会以下LaTeX公式字体和普通字体的区别,加上坐标轴后看起来稍微好些,但是还有待改进。接下来我们设置图片的颜色和色条。

3. 曲面颜色和色条

  • colormap winter;:设置曲面颜色为winter格式

wintermatlab自带的一种曲面颜色格式,还有其他可选格式可以通过help colormap查看

  • colorbar;:在曲面旁边增设colorbar

colorbar的位置可以通过colorbar('Position',Location);进行调整,其中Location为其相对于图片比例的坐标(非图上坐标)

增加代码为:

%此处将上述的坐标轴文字格式给统一了
colormap winter; %设置colormap的格式
colorbar; %加上色条

此时图片情况变成了:

Example 3

看上去图片基本成型,但是还不好看,我们可以通过旋转,设置坐标轴的范围等效果,对图片进行优化。

4. 图片的旋转和缩放

  • view(az,el);:设置观看的视角为(az,el)
  • axis([xmin xmax ymin ymax zmin zmax]);:设置坐标轴的范围
  • set(gcf,'Units','centimeters','Position',[Start_x Start_y Length Width]);:设置图片的位置

其中Start_xStart_y分别代表图像在屏幕的起始位置(可任意设置)

LengthWidth分别代表图像的长度和宽度的具体值(根据自己的需要设置)

于是在后续增加如下代码:

view([50,20]); %设置观察角度
axis([min(x) max(x) min(y) max(y)... %设置坐标范围
        min(min(Z)) max(max(Z))]); %这里由于Z是二维需要用两层最值函数
set(gcf,'Units','centimeters','Position',[6 6 20 15]); %设置图片大小

最新的图片如下,就有点那种味道了

Example 4

注:如何确定旋转时azel的值?

  1. 在完成绘图后点击如下所示的旋转图标,可实现图像的旋转

旋转图标

  1. 将图片旋转到心仪位置时,记录下其azel
    Az 和 El

5. 图片的保存

图片绘制完成之后,可以保存为各种格式,原本我都是通过手动点击的方式对图片进行保存。不过后来体会到一次编写代码保存的快乐过后,就再也懒得动手保存。在此分享Matlab中保存图像的代码:

  • saveas(Fig,'Example.png');:将图片Fig(就是在mesh时返回的值),保存为Example.png文件

同时还可以保存为epspdfMatlab能保存的文件格式

注:如果出现保存为eps格式图片失去颜色的状况,可使用代码saveas(Fig,'Example.eps','psc2');

完整代码:完成此图的完整代码

% 调用函数文件
% % function [ Z ] = Func_Sur( X, Y )
% % %需要绘制的曲面函数
% % Z = 1-sqrt((X).^2+(Y-1).^2);
% % end

clear;clc; %清除前置数据

%数据预处理
x = linspace(0,1,50); %设置x轴的范围
y = x; %设置y轴范围
[X,Y] = meshgrid(x,y); %将其x,y轴网格化
Z = 1-sqrt((X).^2+(Y-1).^2); %直接计算
%Z = Func_Sur(X,Y); %计算对应的Z坐标 建议函数形式调用

%相关参数
FontS = 16; %大小为12pt
FontW = 'bold';  %粗细为加粗 [不加粗用normal或缺省]
az = 50; el = 20; %旋转的角度设置
Length = 20; Width = 15; %设置图片长宽
Start_x = 6; Start_y = 6; %设置图片起始位置

%图像绘制
figure(1) %定义所绘图像为Figure的第一个
Fig = mesh(X,Y,Z); %绘制三维曲面图
colormap winter; %设置colormap的格式
colorbar; %加上色条

%图像调整
view([az,el]); %设置观察角度
axis([min(x) max(x) min(y) max(y)... %设置坐标范围
        min(min(Z)) max(max(Z))]) %这里由于Z是二维需要用两层最值函数
set(gcf,'Units','centimeters','Position',[Start_x Start_y Length Width]); %设置图片大小

%坐标调整(设置为LaTeX文字格式)
L(1) = xlabel('$x$','interpreter','latex','FontSize',FontS,'FontWeight',FontW);
L(2) = ylabel('$y$','interpreter','latex','FontSize',FontS,'FontWeight',FontW);
L(3) = zlabel('$z$','interpreter','latex','FontSize',FontS,'FontWeight',FontW);
L(4) = title('$z = 1-\sqrt{x^{2}+(y-1)^{2}}$','interpreter','latex','FontSize',FontS,'FontWeight',FontW);

%图像保存
saveas(Fig,'Example.png'); %保存为.png格式
%eps格式保存:需增加'psc2'不然图像为黑白
%saveas(Fig,'Example.eps','psc2');
### 将表格数据转换为适合入到Origin的三维数据格式 为了将表格数据转换成适合入到Origin的三维数据格式,可以采用MATLAB脚本来处理原始数据并将其重新排列或计算以适应所需的输入形式。具体来说,如果目标是在Origin中创建诸如曲面图、等高线图或其他类型的三维可视化图表,则通常需要准备X、Y坐标以及对应的Z值矩阵。 对于给定的任务,假设有一个包含三列的数据集——前两列为自变量(即X和Y),第三列为因变量(即Z)。下面是一个简单的例子来说明如何利用MATLAB读取CSV文件中的这些数据,并生成一个可以直接被Origin识别的ASCII文本文件: #### MATLAB 脚本示例 ```matlab % 读入 CSV 文件作为表对象 data = readtable('input_data.csv'); % 提取出 X 和 Y 坐标的唯一值向量 unique_x = unique(data.X); unique_y = unique(data.Y); % 初始化 Z 矩阵 (维度由唯一的 X 和 Y 数目决定) z_matrix = NaN(length(unique_y), length(unique_x)); for i = 1:length(unique_y) for j = 1:length(unique_x) % 找到对应位置上的 z 值 idx = ismember(data.X, unique_x(j)) & ... ismember(data.Y, unique_y(i)); if any(idx) z_matrix(i,j) = data.Z(idx); %#ok<AGROW> end end end % 创建一个新的表结构体存储 XYZ 数据以便出 xyz_table = array2table([meshgrid(unique_x', unique_y')(:), z_matrix(:)],... 'VariableNames',{'X','Y','Z'}); % 出至 ASCII 文本文件供 Origin 使用 writetable(xyz_table,'output_for_origin.txt',... 'Delimiter','\t',... 'WriteVariableNames',true,... 'QuoteStrings',false); ``` 这段代码首先加载了一个名为`input_data.csv`的CSV文件,其中包含了三个字段:“X”,“Y”和“Z”。接着它构建了一个新的二维数组`z_matrix`,其行列分别代表不同的X和Y坐标的组合;最后再把所有的XYZ配对写回到一个制表符分隔的纯文本文件里去,这个文件就可以很容易地在Origin里面打开并且绘制成为各种各样的图形了[^1]。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值