近日需要用Matlab绘制一些三维曲面图,并对其进行标注。于是这些天花了些功夫重新梳理了一遍关于Matlab
三维曲面作图的一些注意事项,在此记录备案,便于以后使用查找。
<>任务要求:已知函数形式,绘制三维曲面
此次以下函数为例,介绍Matlab三维曲面的绘制方式
z = 1 − x 2 + ( y − 1 ) 2 z = 1-\sqrt{x^{2}+(y-1)^{2}} z=1−x2+(y−1)2
* 成品效果图如下:
<>绘图讲解:
<>1. 绘制三维图像
* [X,Y] = meshgrid(x,y);:将x和y网格化,得到网格化的后的变量X和Y
所谓的网格化即将原本的一维的坐标轴x和y组合,成为一个二维的平面X和Y。可能有些人会觉得不太好理解,我也不太能用语言描述清楚。不过在工作区点开X和Y
查看其内部的具体值之后即可理解。
* Fig = mesh(X,Y,Z);:以X,Y和Z为数据绘制三维曲面,并将此曲面赋值给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); %绘制三维曲面图
由此我们能得到一个非常简陋的三维曲面,而这样的曲面距离我们的要求还有一段距离。
<>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');
现在图片变成了这样:
这里可以体会以下LaTeX公式字体和普通字体的区别,加上坐标轴后看起来稍微好些,但是还有待改进。接下来我们设置图片的颜色和色条。
<>3. 曲面颜色和色条
* colormap winter;:设置曲面颜色为winter格式
winter为matlab自带的一种曲面颜色格式,还有其他可选格式可以通过help colormap查看
* colorbar;:在曲面旁边增设colorbar
colorbar的位置可以通过colorbar('Position',Location);进行调整,其中Location为其相对于图片比例的坐标(非图上坐标)
增加代码为:
%此处将上述的坐标轴文字格式给统一了 colormap winter; %设置colormap的格式 colorbar; %加上色条
此时图片情况变成了:
看上去图片基本成型,但是还不好看,我们可以通过旋转,设置坐标轴的范围等效果,对图片进行优化。
<>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_x和Start_y分别代表图像在屏幕的起始位置(可任意设置)
Length和Width分别代表图像的长度和宽度的具体值(根据自己的需要设置)
于是在后续增加如下代码:
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]); %设置图片大小
最新的图片如下,就有点那种味道了
注:如何确定旋转时az和el的值?
* 在完成绘图后点击如下所示的旋转图标,可实现图像的旋转
* 将图片旋转到心仪位置时,记录下其az,el值
<>5. 图片的保存
图片绘制完成之后,可以保存为各种格式,原本我都是通过手动点击的方式对图片进行保存。不过后来体会到一次编写代码保存的快乐过后,就再也懒得动手保存。在此分享
Matlab中保存图像的代码:
* saveas(Fig,'Example.png');:将图片Fig(就是在mesh时返回的值),保存为Example.png文件
同时还可以保存为eps,pdf等Matlab能保存的文件格式
注:如果出现保存为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');