Matlab系列之绘图基础

前言

这篇的东西相对比较细节和基础,花了比较多的时间来记录,望君好好看下去~

介绍下本篇文章将要介绍的东西吧,之所以把本篇称为图形基础,是因为本篇的内容更多的是对图形句柄、图形对象等等之类的相关知识进行说明,对于图形的绘制会在之后的篇章中再详细弄下,比如二维的图怎么画,三维的又该如何绘制;虽然本篇内容趋于基础性的知识,但这也只是相对于之后的图形绘制,是基础的东西。实际上,对于很多没有仔细学过MATLAB的人来说,对本篇将记录的内容其实都不曾注意,甚至不曾耳闻,所以本篇的重要性也是显然的,慢慢看吧~

图形句柄与对象

在介绍MATLAB函数的时候,有篇文章就讲到了函数句柄,不过那时候只是介绍了下函数句柄的使用,对句柄没做太深的了解,这个图形句柄的使用其实有点类似,可以将句柄赋给某个变量,然后直接调用该变量,就相当于调用了该句柄。

此外,对图形句柄再深入了解下,要知道MATLAB的图形/图像系统都是基于图形对象建立的,而图形对象拥有一个独立的名字,这名字就是句柄,独立且唯一,因此句柄是图形对象的唯一标识符,句柄值将可能是整数、实数或浮点数,不同对象会有不同的形式,比如图形窗口的句柄值就是一个正整数。

每个图形对象都会有它的属性,我们在对图形进行一些设置的时候,就是在对属性进行更改,比如改变线条的颜色,把线条用虚线表示等等,因此反过来说就是,修改图形属性,就可以实现改变图形的样式。


那么什么又是图形对象呢?

不知道大家对“面向对象编程”这句话是否有一定的理解,不懂的也没关系,我只是突然想起了这句话罢了,hhhhh~

图形对象是由图形命令产生的,图形中的线条、坐标轴、标题等等,都是一个独立的对象,然后对象又可以分为父对象和子对象的形式,如果创建了一个子对象,则该子对象有可能会继承父对象的大多数属性,当然也可能例外。如果同级别的子对象很多,那就把它们称作兄弟对象吧~

看个图形对象层次结构的图,从官网翻到的,具体如下:

img

从层次结构上来看,最高层次的图形对象属于根对象(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矩阵,默认为空矩阵可存储与图形对象有关的数据
Visibleon或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的属性详细描述,查找的操作如下方的两个图所示

image-20210112224523290

image-20210112224542826
在此就简单表述下部分属性的作用,见下表

属性名作用
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')

运行效果

image-20210113222734003

坐标轴对象

坐标轴的对象,可以用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');%标题名

运行效果

image-20210117164751478

曲线对象

曲线对象的创建,使用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','-.');

运行效果

image-20210117212031111

文字对象

文字对象就是使用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}');%图例说明

运行效果

image-20210117220205977

曲面对象

曲面对象用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');%设置为统一色,可在此处设置断点查看未设置之前的结果,进行对比
运行效果

未运行最后一句代码

在这里插入图片描述

运行最后一句

image-20210117222527306

结束

历时N天,左写写右写写,终于写完了这篇,真不容易,当然还是比较懒了点,不然应该较早些就能发出来了,内容总的来说,还是值得认真学习,不过关于属性的部分,并没有进行展开介绍,主要这玩意官方的解释很官方了,没必要花太多功夫讲,而且有些属性,很多时候基本上都没用上,所以根据自己需要进行对应的属性设置,不懂的doc就好了,help就直接help对应函数,也会有部分解释,接下来的绘图篇章,估计又要点时间了。。。


更多精彩,等你发现~


  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值