【基础知识笔记】021 三维数据可视化
1-1 曲线图绘制
与二维绘图命令类似,在三维坐标下有三维的基本绘图命令plot3,其使用方法与plot相仿。plot3的调用格式如下。
格式一:\(plot3(x, y, z)\)
若\(x, y, z\)为相同长度的向量,则根据向量x, y, z绘制空间三维曲线。
如果\(x, y, z\)为同阶矩阵,则绘制对应列的多条曲线
格式二:\(plot3(x, y, z, 's')\)
按字符串s设置的线型、颜色、标记符号绘制三维空间曲线。字符串s的设置与\(plot()\)命令的设置相同。
>> t=0:pi/10:10*pi;
>> x=cos(t);
>> y=sin(t);
>> plot3(x,y,t,'bo-.');
>> xlabel('x=cos(t)');
>> ylabel('y=sin(t)');
>> zlabel('z');
>> title('三维螺旋线')
>>
1-2 三维网线图绘制
MATLAB提供的函数mesh用来绘制三维网线图。
该命令可以绘出在某一区间内完整的曲面,而不是单根曲线。其基本调用格式如下:
mesh(x,y,z)
根据矩阵x, y和z绘制彩色的空间三维网线图。x, y和z中对应的元素为三维空间上的点,点与点之间用线连接。其中网线的颜色随网点高度的改变而改变。
在绘制二元函数\(z=f(x, y)\)的三维网线时
首先应通过\([x,y]=meshgrid(x, y)\)语句在xy平面上建立网格坐标,然后利用x和y计算每一个网格点上z坐标的大小,该坐标就定义了曲面上的点。最后由\(mesh(z)\)命令完成三维网线图的绘制。
1-2-1 example:绘制$z=x e{-x2 - y^2} $
>> x=-2:0.2:2;
>> y=x;
>> [x,y]=meshgrid(x,y);
>> z=x.*exp(-x.^2)-y.^2;
>> mesh(x,y,z);
>> z=x.*exp(-x.^2-y.^2);
>> mesh(x,y,z);
>>
![1EdMQ.png](https://e.im5i.com/2021/08/06/1EdMQ.png)
meshz函数在mesh函数的基础上增加了绘制边界面的功能,其调用格式与mesh一样。图12.3是运行\(meshz(x, y, z)\)的结果。
>> x=-2:0.2:2;
>> y=x;
>> [x,y]=meshgrid(x,y);
>> z=x.*exp(-x.^2)-y.^2;
>> mesh(x,y,z);
>> z=x.*exp(-x.^2-y.^2);
>> meshz(x,y,z)
![1Eg5h.png](https://e.im5i.com/2021/08/06/1Eg5h.png)
1-2-1 example:绘制$z=x e{-x2 - y^2} $的等高线图
>> x=-2:0.2:2;
>> y=x;
>> [x,y]=meshgrid(x,y);
>> z=x.*exp(-x.^2)-y.^2;
>> mesh(x,y,z);
>> z=x.*exp(-x.^2-y.^2);
>> meshc(x,y,z)
![1EYsy.png](https://e.im5i.com/2021/08/06/1EYsy.png)
1-3 曲面图的绘制
在三维网线上,对网线之间的网线元进行颜色填充就成了三维曲面图。MATLAB提供的surf函数具有这样的功能。其调用格式如下:
surf(x,y,z)
最常用的曲面图调用格式,绘制由3个矩阵所指定的带色参数的网状表面图,轴的刻度决定于x、y、z的范围,或当前对轴的设定,颜色与网的高度成正比。
1-3-1 example:\(z=x^2+y^2\) 绘制曲面图
>> x=-5:5;
>> y=x;
>> [x,y]=meshgrid(x,y);
>> z=x.^2+y.^2;
>> surf(x,y,z);
>> hold on;
>> colormap(hot)
>> stem3(x,y,z,'bo-.')
![1EsRX.png](https://e.im5i.com/2021/08/06/1EsRX.png)
与mesh函数类似,与surf函数对应的也有surfl和surfc函数,surfl函数在绘制好的曲面上基于当前调色板颜色进行光照处理,surfc函数在绘制好的曲面图下加等高线。将范例12-4中的surf(x, y, z)分别替换为surfl(x, y, z)和surfc(x, y, z)后运行程序的结果如图所示。
![1Epdf.png](https://e.im5i.com/2021/08/06/1Epdf.png)
2 三维隐函数的绘制
利用MATLAB的等值面函数isosurface,并在patch函数的配合之下就可以轻松完成
2-1 isosurface 等值面函数
调用格式:
fv=isosurface(X, Y, Z, V, isovalue)。
返回某个等值面(由isovalue指定)的表面(faces)和顶点(vertices)数据,存放在结构体fv中(fv由vertices、faces两个域构成)。
X、Y和Z的取值构成立体空间的一些栅格节点,V对应的是这些栅格点上的函数值数据。
如果是画隐函数v=f(x, y,z)=0的三维图形,则等值面的数值为isovalue=0。
2-2 patch 函数
调用格式:
patch(x,y,c)
此格式以平面坐标(X, Y)为顶点,构造平面多边形,C是RGB颜色向量。
patch(x,y,z,c)
此格式以空间三维坐标(X, Y, Z)为顶点,构造空间三维曲面,C是RGB颜色向量。
patch(fv)
此格式通过包含vertices、faces两个域的结构体fv来构造三维曲面,fv可以直接由等值面函数isosurface得到,例如patch(isosurface(X, Y, Z, V,0))。
2-3 绘制隐函数步骤
- 坐标范围确定;
- 使用meshgrid函数产生网格点;
- 隐函数定义,可利用@符号获取其函数句柄,实现对函数的操作;
- 计算坐标空间范围内的格点函数值val;
- 调用p=isosurface(x, y, z, val,0)函数计算隐函数等值点的位置并返回到p;
- 调用patch函数对曲面进行修饰
2-4 example:绘制 \(f(x,y,z)=x^2+y^2+z^2-1=0\)
>> clear;
>> xlimit=[-2 2];
>> ylimit=[-2 2];
>> zlimit=[-2 2];
>> gd=[30,30,30];%设置三个坐标轴的格点数,越多绘制出来的越精细。
>> f=@(x,y,z) x.^2+y.^2+z.^2-1 %定义隐函数表达式如果不含有某个变量,那就要用0*y之类表示,
f =
@(x,y,z)x.^2+y.^2+z.^2-1
>> xlinspace(xlimit(1),xlimit(2),gd(1));%定义x变量的向量;
未定义函数或变量 'xlinspace'。
是不是想输入:
>> x=linspace(xlimit(1),xlimit(2),gd(1));%定义x变量的向量;
>> y=linspace(ylimit(1),ylimit(2),gd(2));%定义x变量的向量;
>> z=linspace(zlimit(1),zlimit(2),gd(3));%定义x变量的向量;
>> [x.y,z]=meshgrid(x,y,z);
字段赋值赋给非结构体数组对象。
>> [x,y,z]=meshgrid(x,y,z);
>> val=f(x,y,z);%根据网格点计算函数值
>> [f,v]=isosurface(x,y,z,val,0);%isosurface()利用等值点绘制曲面
>>p=patch('Faces',f,'Vertices',v,'CData',v(:,3),'facecolor','none','Edgecolor','flat')
>> grid on;
>> view(3)
>>
3 习题
- 用plot,fplot绘制函数\(y=cos(tan x)\)的图形。
- 用eplot绘制摆线:
的图形。
3. 用plot绘制阿基米德螺线\(r=aθ\)和三叶玫瑰线\(r=acos(3θ)\)
x=-0.5*pi:pi/100:0.5*pi;
y=cos(tan(x));
plot(x,y)
本文来自博客园,作者:FE-有限元鹰,转载请注明原文链接:https://www.cnblogs.com/aksoam/p/17084392.html