Matlab系列之绘图基础
前言
这篇的东西相对比较细节和基础,花了比较多的时间来记录,望君好好看下去~
介绍下本篇文章将要介绍的东西吧,之所以把本篇称为图形基础,是因为本篇的内容更多的是对图形句柄、图形对象等等之类的相关知识进行说明,对于图形的绘制会在之后的篇章中再详细弄下,比如二维的图怎么画,三维的又该如何绘制;虽然本篇内容趋于基础性的知识,但这也只是相对于之后的图形绘制,是基础的东西。实际上,对于很多没有仔细学过MATLAB的人来说,对本篇将记录的内容其实都不曾注意,甚至不曾耳闻,所以本篇的重要性也是显然的,慢慢看吧~
图形句柄与对象
在介绍MATLAB函数的时候,有篇文章就讲到了函数句柄,不过那时候只是介绍了下函数句柄的使用,对句柄没做太深的了解,这个图形句柄的使用其实有点类似,可以将句柄赋给某个变量,然后直接调用该变量,就相当于调用了该句柄。
此外,对图形句柄再深入了解下,要知道MATLAB的图形/图像系统都是基于图形对象建立的,而图形对象拥有一个独立的名字,这名字就是句柄,独立且唯一,因此句柄是图形对象的唯一标识符,句柄值将可能是整数、实数或浮点数,不同对象会有不同的形式,比如图形窗口的句柄值就是一个正整数。
每个图形对象都会有它的属性,我们在对图形进行一些设置的时候,就是在对属性进行更改,比如改变线条的颜色,把线条用虚线表示等等,因此反过来说就是,修改图形属性,就可以实现改变图形的样式。
那么什么又是图形对象呢?
不知道大家对“面向对象编程”这句话是否有一定的理解,不懂的也没关系,我只是突然想起了这句话罢了,hhhhh~
图形对象是由图形命令产生的,图形中的线条、坐标轴、标题等等,都是一个独立的对象,然后对象又可以分为父对象和子对象的形式,如果创建了一个子对象,则该子对象有可能会继承父对象的大多数属性,当然也可能例外。如果同级别的子对象很多,那就把它们称作兄弟对象吧~
看个图形对象层次结构的图,从官网翻到的,具体如下:
从层次结构上来看,最高层次的图形对象属于根对象(Root),由于是系统自动创建的,所以句柄值为0,然后通过它实现屏幕的控制,即可以创建出一个图形窗口(Figure),要说明一点,在启动MATLAB时,根对象也伴随着创建完成,所以只有当MATLAB关闭了,根对象才会关闭。与根对象相关的属性是应用于所有MATLAB窗口的默认属性~
图形窗口(Figure)虽然在上图中只画了一个,但并不是说只能创建一个图形窗口,理论上可以无限~,实际上也可以有很多,多个图形窗口之间也是各自独立的,与之相关的属性有颜色、大小、排列等等。
再依次往下就是窗口内的对象了,功能基本上看它名字就知道了,比如Axes,这就是个坐标对象,UI Object就是一个创建用户图形界面的对象,其他的我就不一一详细介绍了。
举个例子把层次结构再表述下,例:使用 plot
函数创建线图。坐标区对象(坐标区是表示 x、y 和 z 坐标区标度、刻度线、刻度标签、坐标区标签等对象的单个对象)定义了表示数据的线条的参考框架。图窗是显示图形的窗口。图窗包含坐标区,坐标区包含线条、文本、图例以及其他用于表示图形的对象。
介绍完了图形句柄和图形对象,再了解几个MATLAB的函数,可用于获取已有图形、坐标轴以及其他对象的句柄,具体的使用,后面进行实例操作的时候直接看效果就好了,知道有这么个东西先。分别是gcf,gca和gco,各自的功能描述如下表:
函数名 | 功能 |
---|---|
gcf | 获取当前图形窗口的句柄 |
gca | 获取当前坐标轴的句柄 |
gco | 获取最近被点击的图形对象的句柄 |
对象属性
属性其实很好理解,可以当作是对象的特征,每个属性都有一个属性名和属性值,比如以曲线为对象,属性名为LineStyle,属性值则是属性名的取值,LineStyle的取值为点线、虚线或实线,即“-、:、-.、–”,此外还可以是“none”,这样就相当于不做显示了,这些取值将决定曲线的线型以何种形式组成;在属性名的写法中,不区分字母大小写,且可不必写全,并且要用单引号包起来进行表示,比如LineStyle,它就可以用 ‘lines’ 代替。
理解完属性名和属性值,接着就是要知道如何使用属性名以及属性值,当创建对象的时候,需要给对象赋予属性以及对应的属性值,如果没有设置,则使用默认值,如果创建完成后,需要重新设置属性,可使用set函数,调用格式如下:
set(图形句柄,属性名1,属性值1,属性名2,属性值2,....)
如果需要获知句柄的属性名以及属性值,可使用get函数,若未指定要获取的属性名,则会显示句柄的所有允许属性以及其属性值,调用格式如下:
get(图形句柄,属性名)
注:在使用的时候,属性名和属性值都记得用单引号包起来~
虽然不同的对象会有其特有的属性,但是也存在着共同的属性,即公共属性,常用的公共属性有:Children、Parent、Tag、Type、UseData、Visible、ButtonDownFcn、CreateFcn、DeleteFcn,相应的表述,见下表
属性名 | 属性值 | 描述 |
---|---|---|
Children | 向量 | 属性对象的子对象句柄所组成的一个向量 |
Parent | 句柄值 | 属性对象的父对象的句柄 |
Tag | 字符串 | 给对象定义一个标识符,使用findobj函数,则可以获取标识符所对应图形对象的句柄 |
Type | 不可变 | 表示对象的类型 |
UseData | 矩阵,默认为空矩阵 | 可存储与图形对象有关的数据 |
Visible | on或off,默认on | 决定图形窗口是否可见,不可与是否存在混淆 |
ButtonDownFcn | 字符串 | 一般是某个M文件的名字或是一段程序,定义一块作用区域,单击后,MATLAB则会自动执行对应程序 |
CreateFcn | 字符串 | 一般是某个M文件的名字或是一段程序,创建该对象时,MATLAB会自动执行对应程序 |
DeleteFcn | 字符串 | 一般是某个M文件的名字或是一段程序,取消对象的适合,MATLAB会自动执行对应程序 |
应用实例
%功能 在同一个坐标中绘制两条曲线,曲线颜色分别为蓝色和绿色,获取绿色曲线的句柄,并对其进行线型设置
close all
clear
clc
x=0:pi/100:2*pi;%产生坐标横轴
y=sin(x);%第一条曲线的取值
z=cos(5*x);%第二条曲线的取值
plot(x,y,'b',x,z,'g');%同时绘制蓝绿两条曲线
hf=get(gca,'Children');%获取两条曲线的句柄
for k=1:size(hf)%进行循环搜索
if get(hf(k),'Color')==[0 1 0]%[R,G,B] [0 1 0]则代表绿色
hfg=hf(k);%获取绿色曲线句柄
end
end
set(hfg,'LineStyle','-.');%设置绿曲线的线型
运行结果
图形句柄的创建
除去根对象是系统自动创建的,其他的所有图形对象都可以由与之同名的底层函数创建,所创建的对象会置于合适的父对象中,假若无父对象,MATLAB则会自动创建它;
例如用line函数画一条线,在画线之前,没有坐标轴和图形窗口,MATLAB则会创建这些对象,然后再画线,如果已经有这些对象了,就直接在当前窗口的坐标轴上画线,不影响其他已有的对象。
需要注意,底层函数和高层函数是完全不同,底层函数可以控制图形的每一个部分,而高层函数是直接对整个图形进行操作,属性都按缺省的进行设置,显然可以看出各自的好处,一个开发图形界面方便,一个实用性高。
创建对象的低层函数调用格式类似,重点在于要知道对象句柄的属性及其取值,在上面已经介绍了对象的公共属性,接下来将介绍一些常用图形句柄的创建方法及其特有的属性。
图形窗口对象
直接使用figure函数,就可以创建图形窗口对象,调用格式也很简单:
figure(属性名1,属性值1,属性名2,属性值2,...)
使用可以有以下的方式:
figure或句柄变量=figure
如果要关闭图形窗口,就使用close函数,格式:close(窗口句柄),如果要关闭全部就使用close all;如果只是要清除掉窗口中的内容,则可以使用clf命令。
图形窗口对象许多属性与其属性值控制着,除去前面讲到的公共属性外,还有Menubar、Name、NumberTitle、Resize、Position、Units、Color、Pointer、KeyPressFcn、WindowButtonDownFcn、WindowButtonMotionFcn、WindowButtonUpFcn等,这些属性就不具体进行描述了,都比较容易理解,想再详细了解其表述,可以在命令窗口输入命令:“doc Figure Properties”,双引号省略,然后在出现的界面进入第一个文档,即为figure的属性详细描述,查找的操作如下方的两个图所示
在此就简单表述下部分属性的作用,见下表
属性名 | 作用 |
---|---|
Menubar | 图形菜单栏显示 |
Name | 图形的窗口标题 |
NumberTitle | 窗口标题编号 |
Resize | 窗口调整大小模式 |
Position | 图形绘制区域的位置和大小 |
Units | 测量单位 |
Color | 窗口背景色 |
Pointer | 指针符号 |
KeyPressFcn | 用户按下按键时执行的回调函数 |
WindowButtonDownFcn | 鼠标按下回调功能 |
WindowButtonMotionFcn | 鼠标移动回调功能 |
WindowButtonUpFcn | 鼠标释放回调函数 |
实例程序
close all
clear
hf=figure('numbertitle','off','name','DZKR的图形窗口','position',[500,500,666,666]);%position:[left bottom width height]
get(hf,'position')
运行效果
坐标轴对象
坐标轴的对象,可以用axes函数实现创建,调用格式和使用方法与figure的一样,
句柄变量=axes(属性名1,属性值1,属性名2,属性值2,....)
使用axes函数用指定的属性在当前图形窗口创建坐标轴,并将其句柄赋给句柄变量,直接axes,则按MATLAB默认的属性值在当前图形窗口创建坐标轴。
关于axes的属性,可在MATLAB命令行窗口输入:“doc Axes Properties”,然后进入出现的界面的第一个文档,就是该函数可用属性的描述了。依旧只讲部分个人觉得常用的几种,其余的就根据自己需要进行了解使用,部分表述见下表:
属性名 | 作用 |
---|---|
XAxis、YAxis、ZAxis | 控制X、Y和Z轴的特征和行为 |
XTick、YTick、ZTick | 刻度值 |
XTickLabel、YTickLabel、ZTickLabel | 刻度标签 |
XLabel、YLabel、ZLabel | 坐标轴标签的文本对象 |
Title | 坐标轴标题的文本对象 |
实例程序
close all
clear
clc
x=1:30;
plot(x,sin(x));%自动创建了axes对象
set(gca,'ytick',[-1 -0.5 0 0.5 1]);%只显示对应y值的刻度
set(gca,'yticklabel',{'low' -0.5 'zero' 0.5 'high'});%给刻度做标签名
set(get(gca,'xlabel'),'String','x轴');%坐标轴名
%set(get(gca,'ylabel'),'string','y轴');
ylabel('y轴');%也可直接使用函数
title('dzkr axes test');%标题名
运行效果
曲线对象
曲线对象的创建,使用line函数即可,调用格式:
句柄变量=line(x,y,z,属性名1,属性值1,属性名2,属性值2,...)
直接line也可以实现曲线对象创建,其中x,y,z就是对应的维度,只使用x、y则是二维图,三者则为三维图,其他的也没啥好解释的,直接看下属性的查看方式,其内部的属性就不多做表述了,接下来的两个对象也是如此。
doc Primitive Line Properties
实例程序
close all
clear
clc
x=[-3:0.01:3]*pi;
y=sin(x);
Handle_y=line(x,y);
set(Handle_y,'color',[0.5 0.5 0],'linewidth',3,'linestyle','-.');
运行效果
文字对象
文字对象就是使用text函数,在指定的位置和属性值添加文字说明,在坐标轴对象那一部分的时候,其中一段代码:
set(get(gca,'xlabel'),'String','x轴');%坐标轴名
string就是text中的一个属性,也就是文字说明的字符串了,使用标准的ASCII字符,属性查询方式:
doc Text Properties
实例程序
close all
clear
clc
t=0:0.1:3*pi;
alpha=0:0.1:3*pi;
plot(t,sin(t),'r-');%绘制图1
hold on%保持图1的显示,否则会被替换为图2
plot(alpha,3*exp(-0.5*alpha),'b*');%绘制图2
xlabel('t');
ylabel('Mag');
title('\it{sine wave and {\itAe}^{-\alpha{\itt}} wave from 0 to 3\pi}');%\it为斜体 Interpreter 属性
text(7,sin(7),['\fontname {times} Value=',num2str(sin(6)),' at {\itt}=6\rightarrow\bullet'],'HorizontalAlignment','right');%在(7,sin(7)的位置定点,并用右箭头指出,从右到左的顺序
text(2,3*exp(-0.5*2),['\bullet\leftarrow\fontname {times} The{\it3e}^{-0.5\alpha} at {\alpha}=2'],'HorizontalAlignment','left');%在alpha=2的位置定点,并用左箭头指出,从左到右的顺序
legend('sin(t)','{\itAe}^{-\alphat}');%图例说明
运行效果
曲面对象
曲面对象用surface函数创建,调用格式:
句柄变量=surface(x,y,z,属性名1,属性值1,属性名2,属性值2...);
mesh和surf函数可直接创建曲面图形,自动创建了曲面对象,曲面属性的查询方式
doc Primitive Surface Properties
实例程序
%绘制三维曲面z=sin(x)cos(y),并进行设置
close all
clear
clc
x=0:0.1:3*pi;
[x,y]=meshgrid(x);%生成矩阵坐标
z=sin(x).*cos(y);
axes('view',[-33,35]);%方位角和俯视角
hd=surface(x,y,z,'facecolor','w','edgecolor','flat');%绘图以及赋色
grid on%显示网格
xlabel('x axis');ylabel('y axis');zlabel('z axis');
title('mesh - surf');
set(hd,'facecolor','flat');%设置为统一色,可在此处设置断点查看未设置之前的结果,进行对比
运行效果
未运行最后一句代码
运行最后一句
结束
历时N天,左写写右写写,终于写完了这篇,真不容易,当然还是比较懒了点,不然应该较早些就能发出来了,内容总的来说,还是值得认真学习,不过关于属性的部分,并没有进行展开介绍,主要这玩意官方的解释很官方了,没必要花太多功夫讲,而且有些属性,很多时候基本上都没用上,所以根据自己需要进行对应的属性设置,不懂的doc就好了,help就直接help对应函数,也会有部分解释,接下来的绘图篇章,估计又要点时间了。。。