Matlab知识之2:绘图与可视化

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-28 11:20   350   0

一、什么是图形对象与图形句柄

图形窗口、线条、曲面和注释等都被看作是MATLAB中的图形对象,所有这些图形对象都可以通过一个被称为“句柄值”的东西加以控制,例如可以通过一个线条的句柄值来修改线条的颜色、宽度和线型等属性。这里所谓的“句柄值”其实就是一个数值,每个图形对象都对应一个唯一的句柄值,它就像一个指针,与图形对象一一对应。例如可以通过命令h = figure返回一个图形窗口的句柄值。

二、二维绘图

1、基本二维绘图函数

MATLAB 中提供了plotloglogsemilogxsemilogypolarplotyy 6个非常实用的基本二维绘图函数,下面重点介绍plot函数的用法。

1)plot函数

plot(Y)

plot(X,Y)

plot(X1,Y1, X2,Y2,...)

plot(X1,Y1,LineSpec,...)

plot(...,'PropertyName',PropertyValue,...)

plot(axes_handle,...)

h = plot(...)

hlines = plot('v6',...)

2)loglog函数:双对数坐标绘图

>> x = logspace(-1,2);
>> loglog(x,exp(x),'-s')
>> grid on
% 为X轴,Y轴加标签
>> xlabel('X');  ylabel('Y');    

3)semilogxsemilogy函数:半对数坐标绘图

>> x = 0 : 0.1 : 10;
>> semilogy(x, 10.^x)
>> xlabel('X');  ylabel('Y');

4)polar函数:极坐标绘图

>> t = 0 : 0.01 : 2*pi;
>> polar(t, sin(2*t).*cos(2*t),'--r')

5)plotyy函数:双纵坐标绘图

>> x = 0:0.01:20;    
>> y1 = 200*exp(-0.05*x).*sin(x);  
>> y2 = 0.8*exp(-0.5*x).*sin(10*x);  
>> ax = plotyy(x,y1,x,y2,'plot');  xlabel('X');
>> set(get(ax(1),'Ylabel'),'string','Left  Y');    
>> set(get(ax(2),'Ylabel'),'string','Right  Y');   

2、二维图形修饰和添加注释

hold 函数:开启和关闭图形窗口的图形保持功能
axis 函数:设置坐标系的刻度和显示方式
grid 函数:为当前坐标系添加网格
title 函数:为当前坐标系添加标题
xlabel ylabel 函数:为当前坐标轴添加标签
text 函数:在当前坐标系中添加文本对象( text 对象)
gtext 函数:在当前坐标系中交互式添加文本对象
legend 函数:在当前坐标系中添加 line 对象和 patch 对象的图形标注框
annotation 函数:在当前图形窗口建立注释对象( annotation 对象)
示例:

】绘制曲线并添加曲线方程。

>> a = [-19.6749   22.2118    5.0905];
>> fun = @(a,x)[a(1)+a(2)/2*(x-0.17).^2+a(3)/4*(x-0.17).^4];
>> x = 0:0.01:1;
>> y = fun(a, x); 
>> plot(x,y);    
>> xlabel('X');  ylabel('Y = f(X)'); 
>> text('Interpreter','latex',...
     'String',['$$-19.6749+\frac{22.2118}{2}(x-0.17)^2'...
        '+\frac{5.0905}{4}(x-0.17)^4$$'],'Position',[0.05, -12],...
     'FontSize',12);

3、常用统计绘图函数

示例:

>> subplot(3, 3, 1);
>> f = @(x)200*sin(x)./x;
>> fplot(f, [-20 20]);
>> title('y = 200*sin(x)/x');  
>> subplot(3, 3, 2);
>> ezplot('x^2 + y^2 = 1', [-1.1 1.1]);   
>> axis equal;    
>> title('单位圆');
>> subplot(3, 3, 3);
>> ezpolar('1+cos(t)'); 
>> title('心形图');
>> subplot(3, 3, 4);
>> x = [10  10  20  25  35]; 
>> name = {'赵', '钱', '孙', '李', '谢'};    
>> explode = [0 0 0 0 1]; 
>> pie(x, explode, name) 
>> title('饼图');
>> subplot(3, 3, 5);
>> stairs(-2*pi:0.5:2*pi,sin(-2*pi:0.5:2*pi)); 
>> title('楼梯图');
>> subplot(3, 3, 6);
>> stem(-2*pi:0.5:2*pi,sin(-2*pi:0.5:2*pi)); 
>> title('火柴杆图');
>> subplot(3, 3, 7);
>> Z = eig(randn(20,20));    
>> compass(Z); 
>> title('罗盘图');
>> subplot(3, 3, 8);
>> theta = (-90:10:90)*pi/180; 
>> r = 2*ones(size(theta)); 
>> [u,v] = pol2cart(theta,r);    
>> feather(u,v); 
>> title('羽毛图');
>> subplot(3, 3, 9);
>> t = (1/16:1/8:1)'*2*pi;
>> fill(sin(t), cos(t),'r');    
>> axis square;   title('八边形');

三、三维绘图

1、常用三维绘图函数

示例1:plot3函数绘制三维螺旋线。

>> t = linspace(0, 10*pi, 300);    
>> plot3(20*sin(t), 20*cos(t), t, 'r', 'linewidth', 2);    
>> hold on    %图形保持
>> quiver3(0,0,0,1,0,0,25,'k','filled','LineWidth',2); 
>> quiver3(0,0,0,0,1,0,25,'k','filled','LineWidth',2); 
>> quiver3(0,0,0,0,0,1,40,'k','filled','LineWidth',2); 
>> grid on
>> xlabel('X'); ylabel('Y'); zlabel('Z');    
>> axis([-25 25 -25 25 0 40]);    
>> view(-210,30);    

示例2:绘制三维曲面 的等高线图和梯度场。

>> [X,Y] = meshgrid(-2:.2:2);        
>> Z = X.*exp(-X.^2 - Y.^2);         
>> [DX,DY] = gradient(Z,0.2,0.2);    
>> contour(X,Y,Z) ;                  
>> hold on ;                         
>> quiver(X,Y,DX,DY) ;               
>> h = get(gca,'Children');          
>> set(h, 'Color','k');   

示例3:绘制三维饼图、三维柱状图、三维火柴杆图、三维填充图、三维向量场图和立体切片图(四维图).

% 饼图
>> subplot(2,3,1); 
>> pie3([2347,1827,2043,3025]); 
>> title('三维饼图');               

% 柱状图
>> subplot(2,3,2); 
>> bar3(magic(4));
>> title('三维柱状图');  

% 火柴杆图
>> subplot(2,3,3); 
>> y=2*sin(0:pi/10:2*pi); 
>> stem3(y);                       
>> title('三维火柴杆图'); 

% 填充图
>> subplot(2,3,4); 
>> fill3(rand(3,5),rand(3,5),rand(3,5), 'y' );    
>> title('三维填充图'); 

% 三维向量场图
>> subplot(2,3,5); 
>> [X,Y] = meshgrid(0:0.25:4,-2:0.25:2);  
>> Z = sin(X).*cos(Y); 
>> [Nx,Ny,Nz] = surfnorm(X,Y,Z); 
>> surf(X,Y,Z); 
>> hold on; 
>> quiver3(X,Y,Z,Nx,Ny,Nz,0.5); 
>> title('三维向量场图'); 
>> axis([0 4 -2 2 -1 1]); 

% 立体切片图(四维图)
>> subplot(2,3,6); 
>> t = linspace(-2,2,20); 
>> [X,Y,Z] = meshgrid(t,t,t); 
>> V = X.*exp(-X.^2-Y.^2-Z.^2);    
>> xslice = [-1.2,.8,2]; 
>> yslice = 2; 
>> zslice = [-2,0]; 
>> slice(X,Y,Z,V,xslice,yslice,zslice); 
>> title('立体切片图(四维图)'); 

2、三维图形的修饰和添加注释

1)绘图色彩

MATLAB中提供了colormap函数,可以根据颜色映像矩阵对图形对象的色彩进行调整。所谓的颜色映像矩阵就是一个 k*3 的矩阵,k行表示有k种颜色,每行3个元素分别代表红、绿、蓝三元色的灰度值,取值均在[01]之间。

colormap 函数:

colormap (map) ,设置 map 为当前颜色映像矩阵
colormap ('default') ,恢复当前颜色映像矩阵为默认值
cmap = colormap,获取当前颜色映像矩阵
colormap (ax,…) ,设置当前 axes 对象的颜色映像矩阵
map 的设置有两种,可以人为指定一个元素值均在 [0 1] 之间的 的矩阵,也可以用 MATLAB 自带的 17 种颜色映像矩阵。在 MATLAB 命令窗口分别运行 autumn bone colorcube cool copper flag gray hot hsv jet lines pink prism spring summer white winter 函数,就可得到这 17 种颜色映像矩阵.

2)着色方式

shading 函数:

shading flat ,平面着色,同一个小网格面和相应的线段用同一种颜色着色。
shading faceted ,类似于 shading flat ,平面着色,只是网格线都用黑色,这是默认着色方式。
shading interp ,通过颜色插值方式着色。
shading( axes_handle ,…) ,为句柄值为 axes_handle 的坐标系内的图形对象设置着色方式。
3)透明度
利用 alpha 函数 调整透明度

调用:alpha(alpha_data)

说明:alpha_data是一个介于01之间的数,alpha_data = 0表示完全透明,alpha_data = 1表示完全不透明,alpha_data 的值越接近于0,透明度越高

通过图形对象的“ FaceAlpha 属性调整透明度

调用:set(h,'FaceAlpha',0.25);

说明:h为图形对象句柄,0.25是“FaceAlpha属性的属性值,由用户随意指定。

示例:三维图形的透视效果

>> figure; 
>> [X,Y,Z] = sphere; 
>> surf(X,Y,Z); 
>> colormap(lines); 
>> shading interp
>> hold on; 
>> mesh(2*X,2*Y,2*Z) 
>> hidden off
>> axis equal
>> axis off 
>> figure; 
>> surf(X,Y,Z,'FaceColor','r');    
>> hold on;
>> surf(2*X,2*Y,2*Z,'FaceAlpha',0.4); 
>> axis equal
>> axis off
4)光源设置与属性调整

light函数

light(' PropertyName ', propertyvalue ,…)

建立一个光源,并设置光源属性(PositionColorStyle'Position'是位置属性,设置光源位置,其属性值为三个元素的向量[x, y, z],即光源的三维坐标;'Color'是颜色属性,设置光源颜色,其属性值可以是代表颜色的字符,也可以是由红、绿、蓝三元色的灰度值组成的向量;'Style'是光源类型属性,设置光源类型,其取值为字符串 'infinite' 'local',分别表示平行光源和点光源。

handle = light(…)

建立一个光源,并获取其句柄值handle,之后可以通过get(handle)查看光源的所有属性,也可以通过set(handle, 'PropertyName',propertyvalue,…)设置光源的属性值。

5)光照模式

lighting函数

lighting flat ,产生均匀光照,选择此方法,以查看面对象,是光照模式的默认设置。
lighting gouraud ,计算顶点法线并作线性插值修改表面颜色,选择此方法,以查看曲面对象。
lighting phong ,做线性插值并计算每个像素的反射率来修改表面颜色,选择此方法,以查看曲面对象。此方法比 lighting gouraud 的效果好,但是用于渲染的时间较长。
lighting none ,关掉照明。
6)图形表面对光照反射属性设置

material函数

material shiny 使图形对象有相对较高的镜面反射,镜面光的颜色仅取决于光源颜色
material dull 使图形对象有更多的漫反射,反射光的颜色仅取决于光源颜色
material metal 使图形对象有非常高的镜面反射和非常低的环境光及漫反射,反射光的颜色取决于光源颜色和图形表面的颜色
material([ ka kd ks ])
material([ ka kd ks n])
material([ ka kd ks n sc ]) 用ka、kd和ks分别设置图形对象的环境光、漫反射和镜面反射的强度,用镜面指数n控制镜面亮点的大小,用sc设置镜面颜色的反射系数。ka、kd、ks、n和sc均为标量,sc的取值介于0和1之间。
material default 恢复ka、kd、ks、n和sc的默认值
7)视点位置

view函数

view(az,el),设置三维绘图的视角, az是方位角,el表示相对于xoy平面的仰角。

view([ x,y,z ]) ,设置视点的三维直角坐标 [x, y, z].
view(2) ,设置默认的二维视角, az = 0 el = 90.
view(3) ,设置默认的三维视角, az = -37.5 el = 30.
view(ax,…) ,设置句柄值为 ax 的坐标系的视角。
view(T) ,用 viewmtx函数生成的4*4的视角转换矩阵作为输入来设置视角。
[ az,el ] = view ,返回当前方向角和仰角。
T = view ,返回一个4*4 的视角转换矩阵。
示例:绘制带光照的花瓶
>> t=0:pi/20:2*pi;
>> [x,y,z]= cylinder(2+sin(t),100); 
>> surf(x,y,z); 
>> xlabel('X'); ylabel('Y'); zlabel('Z'); 
>> set(gca,'color','none'); 
>> shading interp; 
>> colormap(copper); 
>> light('Posi',[-4 -1 0]); 
>> lighting phong; 
>> material metal; 
>> hold on;
>> plot3(-4,-1,0,'p','markersize', 18); 
>> text(-4,-1,0,'光源','fontsize',14,'fontweight','bold'); 

绘制一个透明的立方体盒子,里面放红色、蓝色和黄色三个球。

>> vert = [0 0 0;0 200 0;200 200 0;200 0 0;0 0 100;0 200 100;200 200 100;200 0 100];
>> fac = [1 2 3 4;2 6 7 3;4 3 7 8;1 5 8 4;1 2 6 5;5 6 7 8]; 
>> view(3); 
>> h = patch('faces',fac,'vertices',vert,'FaceColor','g');
>> set(h,'FaceAlpha',0.25); 
>> hold on;
>> [x0,y0,z0] = sphere; 
>> x = 30 + 30*x0; y = 50 + 30*y0; z = 50 + 30*z0;
>> h1 = surf(x,y,z,'linestyle','none','FaceColor','r','EdgeColor','none');
>> x = 110 + 30*x0; y = 110 + 30*y0; z = 50 + 30*z0;
>> h2 = surf(x,y,z,'linestyle','none','FaceColor','b','EdgeColor','none');
>> x = 110 + 30*x0; y = 30 + 30*y0; z = 50 + 30*z0;
>> h3 = surf(x,y,z,'linestyle','none','FaceColor','y','EdgeColor','none');
>> lightangle(45,30); 
>> lighting phong; 
>> axis equal; 
>> xlabel('X'); ylabel('Y'); zlabel('Z'); 

四、图形打印输出

1、图形复制

1)图形窗口->编辑菜单栏“”复制选项“”->图窗复制模板->文档或演示文稿

2)Matlab命令
print 函数

调用格式:

print

print('argument1','argument2',...)

print(handle,'filename')

print argument1 argument2 ... argumentn

[pcmd,dev] = printopt

%调用print函数复制图形到剪贴板
>> h = figure; 
>> ezplot('sin(x) ',[0,2*pi]); 
>> print(h, '-dmeta') 


%调用print函数保存图形。
>> h = figure; 
>> ezplot('sin(x) ',[0,2*pi]); 
>> print(h, '-djpeg', '示例1.jpg') 

%调用print函数打印图形
>> x = 0 : 0.25 : 2*pi; 
>> y = sin(x);
>> h = plot(x, y); 
>> print; 
>> print -dmeta
>> print -djpeg heping.jpg

%【注】当MATLAB中同时打开多个图形窗口(Figure对象)时,还可利用如下命令对第 i 个图形窗口中的图形进行打印操作:
>> print -dmeta -fi

>> print -djpeg -fi filename

>> print -fi
hgexport 函数

调用格式:

hgexport ( h,filename )

把句柄值为h的图形窗口中的图形写入默认的eps格式文件。filename为字符串,用来指明文件名和保存路径,如果不指明保存路径,图形默认保存到MATLAB当前文件夹。

hgexport (h,'-clipboard')

把句柄值为h的图形窗口中的图形复制到Windows剪贴板。

%调用hgexport函数复制图形到剪贴板
>> h = figure; 
>> ezplot('sin(x) ',[0,2*pi]); 
>> hgexport(h, '-clipboard'); 

%调用hgexport函数保存图形
>> h = figure; 
>> ezplot('sin(x) ',[0,2*pi]); 
>> hgexport (h, '示例.eps') 
saveas 函数

调用格式:

saveas (h,' filename.ext ')

把句柄值为h的图形或句柄值为hSimulink模块图保存为文件filename.ext。文件格式取决于文件的扩展名ext

saveas ( h,'filename','format ')

把句柄值为h的图形或句柄值为hSimulink模块图按指定格式保存为文件filename。参数'format'是字符串,用来指明文件扩展名,

%调用saveas函数保存图形。
>> h = figure; 
>> ezplot('sin(x) ',[0,2*pi]); 
>> saveas (h, '示例2.jpg') 

五、质点运动轨迹动画

1、comet函数

调用格式:

comet(y)

显示质点绕着向量y的二维动画轨迹

comet( x,y )

显示质点绕着向量yx的二维动画轨迹

comet( x,y,p )

用输入参数 p 定义轨迹尾巴线的长度

comet( axes_handle ,...)

在句柄值为axes_handle的坐标系中显示动画

2、comet3函数

调用格式:

comet3(z)

显示质点绕着向量z的三维动画轨迹

comet3( x,y,z )

显示质点绕着向量x yz的三维动画轨迹

comet( x,y,z,p )

用输入参数 p 定义轨迹尾巴线的长度

comet( axes_handle ,...)

在句柄值为axes_handle的坐标系中显示动画

>> t = linspace(0, 10*pi, 1000); 
>> x = 20*sin(t);
>> y = 20*cos(t);
>> z = t;
>> comet3(x,y,z)

六、霓虹闪烁动画

1. spinmap函数

调用格式:

spinmap ,旋转颜色映像约 5 秒钟;
spinmap (t) ,旋转颜色映像约 t 秒钟,具体时间取决于硬 件;
spinmap ( t,inc ) ,旋转颜色映像约 t 秒钟,并设置增量参数 inc ,该参数用来调整闪烁频率;
spinmap (‘ inf ’) ,不限时旋转颜色映像,若需终止,请按 Ctrl+C 键。
七、 电影动画
MATLAB 中提供了 getframe 函数和 movie 函数,用来制作电影动画。其中 getframe 函数用来抓取图形对象作为电影的帧, movie函数 用来播放电影动画。
1. getframe 函数

调用格式:

getframe

返回一个电影帧,它是当前坐标系或图形窗口的快照

F = getframe

抓取当前坐标系作为一帧

F = getframe (h)

抓取句柄值为h的图形对象作为一个电影帧

F = getframe ( h,rect )

抓取句柄值为h的图形对象的指定区域作为一个电影帧,rect是形如[左边距,下边距,宽度,高度]的向量,用来设定抓取区域

2. movie函数

调用格式:

movie(M)

在当前坐标系中只播放一次由矩阵M所保存的电影

movie(M,n)

播放n次,若n为负数,则倒着循环播放,若n为向量,第一个元素为播放次数,后续元素为帧序号

movie(M,n,fps)

每秒播放fps帧,播放n次,默认每秒12

movie(h,...)

在句柄值为h的图形窗口或坐标系中播放电影

movie(h,M,n,fps,loc)

在句柄值为h的图形窗口或坐标系的指定位置播放电影。 M,n,fps的说明同上。loc4个元素的向量[x y 0 0]xy用来设定帧的左下角在图形窗口或坐标系的位置,单位为像素

%一颗跳动的红心。

>> x = linspace(-2,2,100); 
>> [X,Y,Z] = meshgrid(x,x,x); 
>> V = (X.^2+9/4*Y.^2+Z.^2-1).^3-X.^2.*Z.^3-9/80*Y.^2.*Z.^3; 
>> p = patch(isosurface(X,Y,Z,V,0)); 
>> set(p, 'FaceColor', 'red', 'EdgeColor', 'none'); 
>> view(3);  axis equal ;  axis off;
>> light('Posi',[0 -2 3]); 
>> lighting phong
>> set(gca,'nextplot','replacechildren'); 
>> XX = get(p,'XData'); YY = get(p,'YData');  ZZ = get(p,'ZData');  
>> for j = 1:20 
       bili = sin(pi*j/20); 
       set(p,'XData',bili*XX,'YData',bili*YY,'ZData',bili*ZZ)    
       F(j) = getframe; 
   end
>> movie(F,10)

八、录制AVI格式视频动画

MATLAB中提供了avifile函数,用来把getframe函数抓取的电影帧录制为AVI格式视频动画。利用MATLAB录制AVI格式视频动画的步骤依次如下:

调用 avifile 函数先创建一个空白的 avifile 文件。
绘制视频的每一个帧所对应的图形。
调用 getframe 函数抓取当前图形窗口或坐标系中的图片。
调用 addframe 函数把抓取的图片添加到 avifile 文件中。
调用 close 函数关闭 avifile 文件。
示例: 录制空间曲线 绕Z轴旋转生成旋转面的 AVI 格式视频动画。
mov = avifile('旋转面.avi');
y = 1:0.01:2;
z = 3*(y-2).^2;
x = zeros(size(y));
theta = [pi/2,pi/2:pi/20:2.5*pi];
figure;
h = plot3(x,y,z,'k','LineWidth',2);
hold on
quiver3(0,0,0,1,0,0,3,'k','filled','LineWidth',2);
quiver3(0,0,0,0,1,0,3,'k','filled','LineWidth',2);
quiver3(0,0,0,0,0,1,4,'k','filled','LineWidth',2);
text(0,-0.5,4,'Z') 
text(0,3.2,0.3,'Y')
text(3.2,0,0.3,'X')
axis equal
axis([-2,2,-2,2,0,4])
axis off
view(145,30);
title('空间曲线绕Z轴生成旋转面','fontsize',12,'fontweight','bold')
for i = 1:length(theta)-1
    [r,alpha1] = meshgrid(y,linspace(theta(i),theta(i+1),10));
    zz = repmat(z,10,1);
    xx = r.*cos(alpha1);
    yy = r.*sin(alpha1);
    surf(xx,yy,zz);
    shading interp
    set(h,'XData',xx(end,:),'YData',yy(end,:),'ZData',zz(end,:))
    drawnow;
    pause(0.05)
    F = getframe(gcf);
    mov = addframe(mov,F);
end
hold off
mov = close(mov);

九、GIF 动画

MATLAB中制作GIF动画要用到getframeframe2imrgb2indimwrite函数,getframe函数用来抓取当前图形窗口或坐标系中的图像,frame2im函数和rgb2ind函数用来将抓取的图像转为索引图像,imwrite函数用来将索引图像写入GIF格式动画。

注意:imwrite函数不能将真彩图像(RGB图像)写入GIF格式动画,必须先将真彩图像转为索引图像或灰度图像,然后才能写入。

%制作小球绕螺旋线运动的GIF格式动画。

>> filename = 'Ball.gif'; 
>> t = linspace(0, 10*pi, 100); 
>> x = [20*sin(t),zeros(1,10)]; 
>> y = [20*cos(t),20*ones(1,10)]; 
>> z = [t,linspace(10*pi,0,10)]; 
>> plot3(x, y, z, 'r', 'linewidth', 2); 
>> hold on
>> h = plot3(0,20,0, '.' , 'MarkerSize' ,40, 'EraseMode' , 'xor' );
>> xlabel('X'); ylabel('Y'); zlabel('Z');
>> axis([-25 25 -25 25 0 40]); 
>> view(-210,30); 
>> for i = 1:length(x)
    set(h, 'xdata' ,x(i), 'ydata' ,y(i), 'zdata' ,z(i));     
    drawnow; 
    pause(0.05) 
    f = getframe(gcf);
    [IM,map] = frame2im(f); 
    if isempty(map)
        [IM,map] = rgb2ind(IM,256); 
    end
    if i == 1
        imwrite(IM,map,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
    else
        imwrite(IM,map,filename,'gif','WriteMode','append','DelayTime',0.1);
    end
end

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP