Matlab图形绘制技术
1.1 图形绘制
Matlab可以表达出数据的二维、三维和四维的图形。通过对图形的线型、立面、色彩、光线、视角等属性的控制,可把数据的内存特征表现得更加细腻、完善。
1.1.1 二维绘图
Matlab的二维绘图函数有plot、fplot和ezplot共三种基本函数及常用的特殊二维图形函数。
1. plot
plot有三种调基本调用格式:plot(x,y)、plot(x1,y1,x2,y2,…)、plot(x)。
第一种格式是绘制以x、y元素为横、纵坐标的连线图。若x、y是等维的矩阵,在x、y对应列元素为横、纵坐标分别绘制曲线,曲线的根数等于矩阵的行数。
第二种格式是绘制多根曲线的,每个二元对x-y的作用与plot(x,y)相同。 第三种格式根据包含在x中的数据类型,绘制不同的图形。如果x是一个复数向量,plot(x)可以理解为plot(real(x),imag(x));如果x是实数矩阵,则可解释为plot(1:length(x),x),即画出对其下标的图形;当x是一个矩阵,则以x元素值为纵坐标,以相应元素的下标为横坐标,绘制连线图。
在plot中加表1-1所示的附加参量,可以指定图形的颜色和线型
表1-1 基本线型和颜色 符号 颜色 符号 线型 符号 线型 y 黄色 . 点 s 方型 m 紫色 o 圆圈 d 菱形 c 青色 x 叉号 ^ 下向三角形 r 红色 + 加号 v 上向三角形 g 绿色 * 星号 < 左向三角形 b 蓝色 - 实线 > 右向三角形 w 白色 : 点线 p 五角形 k 黑色 -. 点画线 h 六角形 -- 虚线 2. fplot
fplot调用格式为:
fplot(Fcn,limits,tol,n,linspec,p1,p2,…)
式中,Fcn为绘制函数的名称(可以是内部函数,也可以是自定义函数);limits定义x轴(自变量)的取值范围,可以为[xmin xmax ymin ymax]; tol为相对误差容忍值(默认值为2e-3);n确定绘制的点数(n+1点);linspec为绘图的线型、点标和颜色;p1,p2,…,为向函数传递参数值。tol,n,linspec,p1,p2,…,参数均可以缺省。
【例】定义函数
function y1=Fun1(x)
y1=x.^2+2*x+1;
在命令窗调用fplot: fplot(@Fun1,[-4 2])
3. ezplot函数
ezplot函数也可以用以绘制函数在某一变量区域内的图形,其基本格式为: ezplot(fcn,[xmin xmax ymin ymax]) fcn可以为单变量、双变量函数
ezplot(x,y,[tmin tmax]) 绘制参数方程组x=x(t),y=y(t)在[tmin tmax]内的图形。
【例】定义函数:
function z = myfun(x,y,k) z = x.^k - y.^k - 1; 在命令窗调用
ezplot(@(x,y)myfun(x,y,2))
【例】ezplot('3*cos(t)','2*sin(t)',[0 2*pi]),绘制椭圆。
4. 二维特殊图形函数
常用的二维特殊图形函数如表1-2所示,这些函数的使用方法可以查阅MATLAB的在线帮助。下面程序是表示梯度场向量的绘制方法。 [x,y]=meshgrid([-2:0.1:2]); z=3.*x.*y.*exp(-x.^2-y.^2)-1; [u,v]=gradient(z,0.2,0.2); quiver(x,y,u,v,2); 函数名 说明 函数名 说明 函数名 说明 area bar barh comet errorbar 面积图 条形图 水平条形图 彗星图 误差带图 fill gplot compass hist pareto 多边形填充图 拓扑图 矢量图 柱状图 Pareto图 ribbon scatter sterm stairs rose 三维图的二维条状显示 散射图 离散系列火柴杆状图 阶梯图 极坐标下的柱状图 向量场 极坐标图 饼状图 ezpolar pie quiver 矢量图 分散矩阵图 feather plotmatrix 1.1.2 三维绘图
常用的三维绘图是通过绘制三维曲线图、三维网格图和三维曲面图3种基本类型函数及特殊的三维图形函数完成。
1. plot3
plot3 函数格式除了包括三维信息之外,与二维函数相同: plot3(x1,y1,z1,s1,x2,y2,z2,s2,…)
式中,xn、yn、zn是向量或矩阵;sn是可选的字符串,用来指定颜色、标记符号或线形。
【例】用plot3来绘制曲线 x=[-18:0.5:18]; y=[-18:0.5:18]; r=sqrt(x.^2+y.^2); z=sin(r)./(r+eps); plot3(x,y,z)
比较下列程序的不同点 x=[-18:0.5:18]; y=[-18:0.5:18]'; u=ones(size(y))*x; v=y*ones(size(x)); r=sqrt(u.^2+v.^2); z=sin(r)./(r+eps); mesh(z)
【例】空间曲线图
t = 0:pi/50:10*pi;
plot3(sin(t),cos(t),t) grid on
axis square
2. mesh
函数mesh(z)或mesh(x,y,z)分别以z矩阵元素值及其下标或x、y、z为网格数据点绘制网格图。mesh有两个同类函数:srufc和surfl,前者可画出具有基本等高线图,而后者用来画出一个用亮度的曲面图。
【例】
x=[-18:0.5:18]; y=[-18:0.5:18]'; u=ones(size(y))*x; v=y*ones(size(x)); r=sqrt(u.^2+v.^2); z=sin(r)./(r+eps); surf(z);
%mesh(z) %与surf并没用本质不同
%surfc(z); %surfl(z);
5. 特殊三维图形函数
特殊三维图形函数如下表,使用方法与对应二维绘图函数类似。 函数名 说明 函数名 说明 函数名 说明 bar3 三维条形图 trisurf 三角形曲面图 sphere 球面图 comet3 三维彗星图 trimesh 三角形网格图 conuter3 三维等高图 函数控制三三维离散数ezgraph3 waterfall 瀑布图 sterm3 维图 据图 pie3 三维饼状图 cyclinder 柱面图 scatter3 三维散射图 quiver3 向量场 1.1.3 特殊坐标轴的图形函数 1.ploar
polar的调用格式为:ploar(theta,rho)
用极角theta和极径rho绘制极坐标图形。 2. pol2cart
pol2cart函数用于将极坐标和柱坐标的值转换为直角坐标系的坐标值,然后使用plot3、mesh等函数绘图。
pol2cart函数的调用格式为:
[x,y]=pol2cart(theta,rho) 极坐标转换
[x,y,z]=pol2cart(theta,rho,z) 柱坐标转换
cart2pol 函数则将直角坐标系的值转换为极坐标和柱坐标系中的值。
3. sph2cart 函数
sph2cart 函数用于将球坐标值转换为直角坐标系的坐标值,然后使用plot3、mesh等函数绘图。
cart2sph 函数则是将直角坐标转换成球坐标系中的值。
1.1.4 绘图工具界面
Matalab版本不断提高,并且朝着简单、方便的方向发展,其最大的表现形在于对许多功能开发了图形界面,图形绘制功能也不例外。
在Matlab工作空间输入 t=0:pi/50:10*pi; x=sin(t);y=cos(t);
输入打开绘图窗口的命令: plottools
【例】标注图形
t=linspace(0,2*pi,50); y=sin(t)-2;
text(t,y,'d','fontname','webdings'); hold on
h1=plot(t,sin(t),'+ -');
h2=plot(t,3.*sin(4.*t+pi/3),'o-'); h3=plot(t,cos(t));
text(2,2,'\\leftarrow\\ity=3sin(4t+\\pi/3');
legend('\\itsint','\\ity=3sin(4t+\\pi/3)','\\itsin(t-2)','\\rmcost',-1);
set(h1,'color','r');
xlabel('\\rmt=0\\sim2\\pi');
【例】用不同的视角表示图形
t=0:pi/50:10*pi; subplot(221); grid on;
plot3(sin(t),cos(t),t); axis square
xlabel('x'),ylabel('y'),zlabel('z');
title (sprintf('默认的三维视角:\\naz = -37.5^{o},el=30^{o}')); view(-37.5,30); subplot(222); grid on;
plot3(sin(t),cos(t),t),axis square;
xlabel('x'),ylabel('y'),zlabel('z');title('az=90^{o},el=0^{o}'); view(90,0); subplot(223); grid on;
plot3(sin(t),cos(t),t),axis square xlabel('x'),ylabel('y'),zlabel('z'); title('az=90^{o},el=60^{o}'); view(90,60); subplot(224); grid on;
plot3(sin(t),cos(t),t),axis square xlabel('x'),ylabel('y'),zlabel('z'); title('az=0^{o},el=90^{o}'); view(0,90);
【例】标注对象
x=-2*pi:pi/12:2*pi;
y1=x.^3;y2=sin(x);y3=x.^4; subplot(2,2,1:2);plot(x,y1);
h1=annotation('arrow',[0.6 0.7],[0.8,0.8]'); %箭头标注 set(h1,'color','r');set(h1,'Headstyle','rose'); h2=annotation('textbox',[0.55 0.8,0.05,0.07]); set(h2,'string','\\itf(x)=x^3'); h3=subplot(223);plot(x,y2); h4=subplot(224);plot(x,y3); t1=get(h3,'tightinset');
p1=get(h3,'pos'); %包围坐标系和标题的标注矩形的位置与大小 t2=get(h4,'tightinset'); p2=get(h4,'pos');
x1=p1(1)-t1(1);yy1=p1(2)-t1(2);x2=p2(1)-t2(1);yy2=p2(2)-t2(2);
w=x2-x1+t1(1)+p2(3)+t2(3);h=p2(4)+t2(2)+t2(4); h5=annotation('rectangle',[x1,yy1,w,h]);
set(h5,'FaceAlpha',0.2,'FaceColor','red','EdgeColor','red');
【例】创建一个边旋转、边缩放、边平移的球体。 clear
[x y z]=sphere(8); %创建球体
h=mesh(x,y,z);
set(gca,'xlim',[-2 2],'ylim',[-2,2],'zlim',[-2 2]); t=hgtransform;
set(h,'Parent',t); %设置Hgtransform对象
tx1=makehgtform('translate',[-1 0 0 ]); %设置平移位置 for r=1:0.1:2*pi
rz=makehgtform('zrotate',r); %绕z轴旋转 sxy=makehgtform('scale',r/6); %缩放 set(t,'matrix',rz*sxy*tx1); %平移 drawnow; pause(2); end
set(t,'matrix',eye(4)); %图形回归原位