以下所有函数可以由Name-Value设置的属性均需参考官方文档,不同函数间不一定通用
一.绘制3维图像
1.绘制3维线图:
[<p>] = plot3([<ax>,]<X1>,<Y1>,<Z1>[,"<LineSpec1>"..."<Name>",<Value>]):绘制3维线图
#参数说明:其他参数同plot()
X,Y,Z:指定数据点的x,y,z坐标;为array/matrix
要绘制1个Line对象,X/Y/Z为长度相同的array
要在同一坐标区中绘制多个Line对象,X/Y/Z中至少有1个为matrx
使用matrix的语法相当于X1,Y1,Z1,X2,Y2,Z2...替代
p: 返回1个Line对象或Line对象数组
#使用p修改该Line对象的属性
#实例:
>> t = 0:pi/50:10*pi;
>> st = sin(t);
>> ct = cos(t);
>> plot3(st,ct,t)
>> t = 0:pi/500:pi;
>> xt1 = sin(t).*cos(10*t);
>> yt1 = sin(t).*sin(10*t);
>> zt1 = cos(t);
>> xt2 = sin(t).*cos(12*t);
>> yt2 = sin(t).*sin(12*t);
>> zt2 = cos(t);
>> plot3(xt1,yt1,zt1,xt2,yt2,zt2)
>> t = 0:pi/500:pi;
>> X(1,:) = sin(t).*cos(10*t);
>> X(2,:) = sin(t).*cos(12*t);
>> X(3,:) = sin(t).*cos(20*t);
>> Y(1,:) = sin(t).*sin(10*t);
>> Y(2,:) = sin(t).*sin(12*t);
>> Y(3,:) = sin(t).*sin(20*t);
>> Z = cos(t);
>> plot3(X,Y,Z)
>> t = 0:pi/500:40*pi;
>> xt = (3 + cos(sqrt(32)*t)).*cos(t);
>> yt = sin(sqrt(32) * t);
>> zt = (3 + cos(sqrt(32)*t)).*sin(t);
>> plot3(xt,yt,zt)
>> t = 0:pi/20:10*pi;
>> xt = sin(t);
>> yt = cos(t);
>> plot3(xt,yt,t,'o')#数据点之间不被连接
2.绘制曲面图:
[<s>] = surf([<ax>,<X>,<Y>,]<Z>[,<C>,"<Name>",<Value>]):绘制曲面图
#绘制1个三维曲面,该曲面具有实色边和实色面,颜色由z坐标决定
#参数说明:其他参数同plot3()
Z:指定数据点的z坐标;为matrix
X,Y:指定数据点的x,y坐标;为matrix;默认为Z中元素的行/列索引
C:指定曲面颜色
s:返回1个图曲面对象
#使用s修改曲面对象的属性
#实例:
>> [X,Y] = meshgrid(1:0.5:10,1:20);
>> Z = sin(X) + cos(Y);
>> C = X.*Y;
>> surf(X,Y,Z,C)
colorbar
>> [X,Y,Z] = peaks(25);
>> CO(:,:,1) = zeros(25);#red的灰度值
>> CO(:,:,2) = ones(25).*linspace(0.5,0.6,25);#green的灰度值
>> CO(:,:,3) = ones(25).*linspace(0,1,25);#blue的灰度值
>> surf(X,Y,Z,CO)
#########################################################
[<s>] = mesh([<ax>,<X>,<Y>,]<Z>[,<C>,"<Name>",<Value>]):绘制网格曲面图
#创建1个网格曲面图;该图有实色边,颜色由z坐标决定,无实色面
#参数说明:同surf()
#实例:
>> [X,Y] = meshgrid(-8:.5:8);
>> R = sqrt(X.^2 + Y.^2) + eps;
>> Z = sin(R)./R;
>> mesh(X,Y,Z)
#########################################################
[<s>] = surface([<ax>,<X>,<Y>,]<Z>[,<C>,"<Name>",<Value>]):绘制基本曲面图
#功能和surf()基本相同,区别在于surface()在绘制前不调用newplot,也不使用图窗/坐标区的NextPlot属性值
#也就是说,surface()会向当前坐标区添加曲面图,而不删除其他图形对象或重置坐标区属性
#参数说明:同surf
#实例:
>> [X,Y] = meshgrid(1:0.5:10,1:20);
>> Z = sin(X) + cos(Y);
>> surface(X,Y,Z)
#默认情况下,surface()使用2维视图显示,可view(3)将视图设置为3维视图
>> view(3)
二.绘制等高线图
1.绘制曲面图的等高线图:
[<sc>] = surfc([<ax>,<X>,<Y>,]<Z>[,<C>,"<Name>",<Value>]):绘制曲面图即及对应的等高线图
#参数说明:其他参数同surf()
sc:返回包含图曲面对象和等高线对象的图形数组
sc(1)为曲面图对象,sc(2)为等高线图对象
#使用sc修改曲面图对象和等高线图对象
#实例:
>> [X,Y] = meshgrid(-3:.125:3);
Z = peaks(X,Y);
C = X.*Y;
surfc(X,Y,Z,C)
colorbar
2.绘制网格曲面图的等高线图:
[<sc>] = meshc([<ax>,<X>,<Y>,]<Z>[,<C>]):绘制网格曲面图及其对应的等高线图
#参数说明:同surfc()
#实例:
>> [X,Y] = meshgrid(-3:.125:3);
>> Z = peaks(X,Y);
>> meshc(X,Y,Z)
3.绘制矩阵的等高线图:
[<M>,<c>] = contour([<ax>,<X>,<Y>,]<Z>[,<levels>,"<LineSpec>,"<Name>",<Value>]):绘制矩阵的等高线图
#会自动选择要显示的等高线;默认情况下,不同层级的等高线使用不同的颜色
#参数说明:X,Y同surfc(),其他参数同plot()
Z:指定数据点的的高度值
#如果Z中某些元素为NaN,这些元素对应的位置不会绘制等高线(即等高线在此处断开)
levels:指定绘制等高线的层级(高度)
如为标量值n,在n个自动选择的层级上显示等高线
如为单调递增的向量,在该参数指定的层级绘制等高线
如为2元素行向量[k,k],在1个层级(k)绘制等高线
LineSpec:指定等高线的线型和颜色,会忽略'o'等指定标记样式的符号
#如果设置了颜色,所有等高线将使用同一种颜色
Name,Value:设置其他属性
'ShowText':是否显示等高线的标签;可为"on"/"off"(默认值)
M:返回等高线矩阵,其中包含每个层级的顶点的(x, y)坐标
c:返回等高线对象c
#使用c设置等高线对象的属性
#实例:
>> x = linspace(-2*pi,2*pi);
>> y = linspace(0,4*pi);
>> [X,Y] = meshgrid(x,y);
>> Z = sin(X)+cos(Y);
>> contour(X,Y,Z)
>> [X,Y,Z] = peaks;
>> contour(X,Y,Z,20)
>> [X,Y,Z] = peaks;
>> v = [1,1];
>> contour(X,Y,Z,v)
>> x = -2:0.2:2;
>> y = -2:0.2:3;
>> [X,Y] = meshgrid(x,y);
>> Z = X.*exp(-X.^2-Y.^2);
>> contour(X,Y,Z,'ShowText','on')
>> Z = peaks;
>> Z(:,26) = NaN;
>> contour(Z)
#########################################################
[<M>,<c>] = contourf([<ax>,<X>,<Y>,]<Z>[,<levels>,"<LineSpec>,"<Name>",<Value>]):绘制被填充的等高线图
#即在contour()的基础上,在不同层级的等高线间填充上不同颜色
#而不同层级的等高线使用相同的颜色
#参数说明:同contour()
#实例:
>> Z = peaks;
>> contourf(Z)
>> x = linspace(-2*pi,2*pi);
>> y = linspace(0,4*pi);
>> [X,Y] = meshgrid(x,y);
>> Z = sin(X) + cos(Y);
>> contourf(X,Y,Z,10)
>> [X,Y,Z] = peaks(50);
>> contourf(X,Y,Z,[2 3],'ShowText','on')
三.绘制3维图像的辅助函数
1.创建网格
[<X>,<Y>,<Z>] = meshgrid(<x>[<y>,<z>]):创建2/3维网格
#常用于绘制曲面图时的数据
#参数说明:
x:指定网格各点的x坐标;为array
y:指定网格各点的y坐标;为array;默认同x
z:指定网格各点的z坐标;为array;默认同x
X,Y,Z:每行/列是x/y/z的1个副本;为matrix
#实例:
>> x = 1:3;
>> y = 1:5;
>> [X,Y] = meshgrid(x,y)
X = 5×3
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
Y = 5×3
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
>> x = 0:2:6;
>> y = 0:1:6;
>> z = 0:3:6;
>> [X,Y,Z] = meshgrid(x,y,z);
>> F = X.^2 + Y.^2 + Z.^2;
>> gridsize = size(F)
gridsize = 1×3
7 4 3
2.调整视角:
[<caz>,<cel>] = view([<ax>,]<az>,<el>):设置照相机视线
#参数说明:
az,el:分别指定方位角和仰角
ax:指定坐标区;默认为当前坐标区
caz,cel:返回新视线的方位角和仰角
[<caz>,<cel>] = view():返回当前视线的方位角和仰角
[<caz>,<cel>] = view([<ax>,]<v>):设置照相机视线
#参数说明:
v:指定视角;为2/3元素array
如为2元素array,格式:[ax,el],分别指定方位角和仰角
如为3元素array,格式[x,y,z],分别指定从图框中心点到照相机位置所形成向量的x/y/z坐标
[<caz>,<cel>] = view([<ax>,]<dim>):使用默认视线
#参数说明:
dim:指定使用2维还是3维绘图的默认视线;可为2(2维)/3()3维
#即使维度相同,默认视线对不同类型的图也可能不同
3.创建光源:
[<h>] = light([<ax>,]"<PropertyName>",<PropertyValue>):创建光源(Light)对象
#光源仅影响补片和曲面图对象
#无法看到Light对象本身,但可以看到光源对补片和曲面图对象的影响
#也可以指定坐标区范围的环境光颜色以照亮这些对象
#但是仅当坐标区中至少存在1个Light对象且该对象可见时,环境光才可见
#参数说明:
PropertyName,PropertyValue:设置Light对象的属性;详情参加官方文档
"Position":光源位置,为[<x>,<y>,<z>],分别指定x/y/z坐标
"Color":光的颜色;值可为[<R> <G> <B>](各分量均属于[0,1])/十六进制颜色码/名称;默认为[1 1 1]
"Style":光源类型;可为"infinite"(光源在无穷远处,通过"Position"指定方向)/"local"(通过"Position指定位置")
ax:指定坐标区;默认为gca(当前坐标区)
h:返回创建的Light对象
#实例:
>> light('Position',[-1 0 0],'Style','local')
四.绘制空间多边形
[<p>] = fetch([<ax>,]<X>,<Y>[,<Z>],<C>[,"<Name>",<Value>]):绘制看见多边形
#参数说明:
X,Y,Z:指定顶点的x/y/z坐标;Z默认全部为0
#以指定顶点的顺序连接这些顶点
#如果为矩阵,每列对应1个多边形
C:指定多边形颜色
Name,Value:指定其他属性
ax:指定坐标区
p:返回包含所有多边形的数据的补片对象
#使用p查询并修改补片对象的属性
[<p>] = fetch([<ax>,]'XData',X,'YData',Y[,'ZData',Z,"<Name>",<Value>]):类似fetch(<X>,<Y>[,<Z>]),区别在于无需指定颜色
[<p>] = fetch([<ax>,]<S>[,"<Name>",<Value>]):使用结构体S创建多边形
#字段名对应于补片属性名,字段值对应于属性值
可同时创建1个或多个多边形
[<p>] = fetch([<ax>,]"Faces",<F>,"Vertices",<V>[,"<Name>",<Value>]):创建1/多个多边形
#也可以创建线条(非闭合的多边形)
#参数说明:
F:指定要连接的顶点(依次连接F中的顶点)
如为array,创建1个多边形
如为matrix,创建多个多边形(每行对应1个多边形)
#如果各个多边形顶点数不同,用NaN填充F
V:指定顶点的值
#每行指定1个顶点,从左到右依次指定x/y/z坐标,2元素时z坐标默认为0
#实例:
>> x = [0 1 1 0];
>> y = [0 0 1 1];
>> patch(x,y,'red')
>> x2 = [2 5; 2 5; 8 8];
>> y2 = [4 0; 8 2; 4 0];
>> patch(x2,y2,'green')
>> v = [0 0; 1 0; 1 1; 0 1];
>> f = [1 2 3 4];
>> patch('Faces',f,'Vertices',v,'FaceColor','red')
>> v2 = [2 4; 2 8; 8 4; 5 0; 5 2; 8 0];
>> f2 = [1 2 3;
4 5 6];
>> patch('Faces',f2,'Vertices',v2,'FaceColor','green')
>> x = [2 5; 2 5; 8 8];
>> y = [4 0; 8 2; 4 0];
>> c = [0 3; 6 4; 4 6];
>> figure
>> patch(x,y,c)
>> colorbar
#相当于:
>> v = [2 4; 2 8; 8 4; 5 0; 5 2; 8 0];
>> f = [1 2 3; 4 5 6];
>> col = [0; 6; 4; 3; 4; 6];
>> figure
>> patch('Faces',f,'Vertices',v,'FaceVertexCData',col,'FaceColor','interp');
>> colorbar
#仅有边线上色,内部无填充:
>> v = [0 0; 1 0; 1 1];
>> f = [1 2 3];
>> figure
>> patch('Faces',f,'Vertices',v,...
'EdgeColor','green','FaceColor','none','LineWidth',2);
>> clear S
>> S.Vertices = [2 4; 2 8; 8 4; 5 0; 5 2; 8 0];
>> S.Faces = [1 2 3; 4 5 6];
>> S.FaceVertexCData = [0; 1];
>> S.FaceColor = 'flat';
>> S.EdgeColor = 'red';
>> S.LineWidth = 2;
>> figure
>> patch(S)
>> v1 = [2 4; 2 8; 8 4];
>> f1 = [1 2 3];
>> figure
>> patch('Faces',f1,'Vertices',v1,'FaceColor','red','FaceAlpha',.3);
>> v2 = [2 4; 2 8; 8 8];
>> f2 = [1 2 3];
>> patch('Faces',f2,'Vertices',v2,'FaceColor','blue','FaceAlpha',.5);