在做毕业设计时,经常用到Matlab 中几个常见的绘图函数:plot,scatter,line,由于对这几个函数背后的原理不是很了解,在使用时经常需要利用help功能。于是在业余时间看了一些相关的资料, 有了这篇blog。
为了熟练的使用这几个函数,我们需要了解Matlab中的几个有关图形的概念。
1. 图形对象的概念
Matlab中每一个图形是由多基本对象组合叠加而成的。运行Matlab,在命令窗口输入相关的命令,可以生成一个或者多个图像窗口(figure)。Matlab中各种对象间关系如下图:
图1 Matlab中个对象关系
在Matlab绘出的图形中,一切皆对象,一般用对象句柄来区分不同的对象,句柄即一个整数值或浮点数值。在上图中:
root为根元素,根元素只有一个,在matlab启动后即存在,并且不能被删除,根元素的句柄值为0,根元素对应整个屏幕。root对象可以看成是figure对象的容器,一个root对象中可以含有多个figure对象。
figure对象是Matlab中绘图命令产生的一个个独立的显示图形的窗口。一个标题为figure的窗口就是一个figure对象。figure是axes(坐标系),ui-objects等对象的直接容器。figure的句柄值一般为整数。除去root, fiture对象,其余对象的句柄为浮点型。
axes是坐标系的意思,在一个图像窗口(figure)中,通常只有一个坐标系,但使用subplot函数时,一个figure窗口中可以有多个axes对象。axes 又是其他多种对象的容器,用来在其上显示子对象,如line,text,image等。
ui-objects:用户界面上的一些对象,可分为uicontrol,uimenu,uicontextmenu。用于设置用户界面上的一些控制对象(如pushbutton, listbox, slider等),菜单,窗口滑块等。
图2 Matlab中各种图形对象说明
uiobjects 可以分为uicontrol、uimenu、uicontextmenu三个对象,三个对象在创建GUI时比较有用。Uicontrol在当figure上某个控件被激活时,调用相应的回调函数。uimenu对象则是一些下拉菜单,出现在一个figure窗口的顶部,当用户选择一个菜单选项时,调用相应的回调函数。
axes对象在一个figure对象上定义了一个区域,并在该区域内给它的子对象配置相应的属性。一个figure窗口上可以有多个axes对象。axes的子对象可以由相应的高层函数来创建,比如Line对象可用plot,line等函数创建,Text对象可以用title,xlabel,ylabel等创建。这里不再一一详述。
2. 对象的创建
root: root在Matlab运行时就开始存在,无需自己创建
figure:figure可以用命令figure显式地来创建。当没有显式创建时,使用各种绘图命令都会自动创建figure对象。
axes: 用命令axes来创建,当没有显式创建时,使用各种绘图命令都可以创建axes.
3. 对象的属性
Matlab图形的外观及行为都由各个对象的属性来控制。属性的以 (属性名=属性值) 的形式来表示。可以用set(obj_handle)返回对象obj的所有属性及其值。
figure 对象常用属性:
color: 图像的color属性。使用:set(gcf,'color',[0.4 0.4 0.4]) 设置当前figure对象的颜色, gcf(get current figure)表示当前活动的figure对象。get(fh,'color'),句柄为fh的图像的颜色属性。
children: get(gcf,'children') 返回当前figure对象的子对象(axes),数组形式
type: figure对象的type值为 'figure'
返回一个figure对象的所有属性键值对,set(figure_handle)
axes对象的常用属性:
parent: 返回一个axes对象的父对象(figure)句柄值
color: 表示坐标系颜色
xcolor,ycolor,zcolor: 各坐标轴颜色,可以用set来设置.
children: 子对象
4. 几个重要的变量和命令
在获取和设置图像对象属性的过程中,变量gcf,gca和函数set,get经常会被经常的使用到。
gcf: 表示当前的活动的figure对象
gca:表示当前被选中的axes
set: 用来设置一个已存在的图像属性值,用法:set(object_handle,'PropertyName','NewPropertyValue')
get:查询一个已存在的图像属性值,用法:PropertyValue=get(object_handle,'PropertyName')
5. 几个绘图函数的使用
a. plot函数
plot函数绘制的line对象,当没有指定figure,axes对象时,调用plot函数会自动创建figure,axes对象。在line对象中,经常需要设置的对象有:Color, LineWidth, Marker, MarkerFaceColor, MarkerEdgeColor。绘制图2中第一个图形的代码
x=-pi:pi/10:pi;
y=sin(tan(x))-tan(sin(x)); fh=figure(1); %创建figure对象 set(fh,'color','w'); %设置figure对象颜色为白色 subplot(2,2,1); lh=plot(x,y,'-.or'); %设置线型为点画线(-.),线颜色为红色,数据点Marker为圆形,这些属性设置也可以用set单独设置
%在plot中设置这三个属性的格式为:'linestyle-MarkerType-linecolor' text(x(7),y(7),'\leftarrow sin(tan(x))-tan(sin(x))','color','k') set(gca,'color',ones(1,3).*1); %设置坐标系颜色为RGB格式 set(lh,'MarkerFaceColor','g') %设置Marker颜色为绿色(green) set(gca,'xcolor','k','ycolor','k'); %设置坐标轴颜色 box on;
对于line, scatter函数,用法基本与plot一致。
在Matlab中,将绘制出来的图形为fig格式后,当我们以后以后需要调用该图形时,仍然可以从该图形中恢复出各坐标值。对于图2中第一个图形,坐标值可采用如下方式恢复:
fh=open('blogfig.fig'); %假设图2被保存为blogfig.fig,且在当前目录中 subfig=get(fh,'children'); for i=1:length(subfig) fprintf('%s\n',get(subfig(i),'type'); end subaxes=get(subfig(7),'children'); for i=1:length(subaxes) fprintf('%s\n',get(subaxes(i),'type'); end x=get(subaxes(2),'xdata'); y=get(subaxes(2),'ydata');
结果为:
uicontrol
uicontrol
uicontrol
axes
axes
axes
axes
text
line
从结果中可以看出,图2中figure对象共有7个直接子对象,其中3个uicontrol对象,4个axes对象。为了找出图2中第一个坐标系中的数据,需判断7个子对象中哪一个为第一个坐标系对象,可以通过测试axes子对象的类型来判断,最终判断结果为子对象7与第一个坐标系相对应。子对象7的children有两个返回值,类型分别为text和line。line对象拥有子对象XData,YData,所以可以从这些子对象中提取出坐标值来。