前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matlab系列之绘图基础

Matlab系列之绘图基础

作者头像
狂人V
发布2021-01-22 09:57:08
1.1K0
发布2021-01-22 09:57:08
举报
文章被收录于专栏:电子狂人电子狂人

前言

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

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

~Show Time~

图形句柄与对象

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

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

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

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

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

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

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

从层次结构上来看,最高层次的图形对象属于根对象(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函数,调用格式如下:

代码语言:javascript
复制
set(图形句柄,属性名1,属性值1,属性名2,属性值2,....)

如果需要获知句柄的属性名以及属性值,可使用get函数,若未指定要获取的属性名,则会显示句柄的所有允许属性以及其属性值,调用格式如下:

代码语言:javascript
复制
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会自动执行对应程序

应用实例

代码语言:javascript
复制
%功能 在同一个坐标中绘制两条曲线,曲线颜色分别为蓝色和绿色,获取绿色曲线的句柄,并对其进行线型设置
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函数,就可以创建图形窗口对象,调用格式也很简单:

代码语言:javascript
复制
figure(属性名1,属性值1,属性名2,属性值2,...)

使用可以有以下的方式:

代码语言:javascript
复制
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

鼠标释放回调函数

实例程序

代码语言:javascript
复制
close all
clear
hf=figure('numbertitle','off','name','DZKR的图形窗口','position',[500,500,666,666]);%position:[left bottom width height] 
get(hf,'position')

运行效果

坐标轴对象

坐标轴的对象,可以用axes函数实现创建,调用格式和使用方法与figure的一样,

代码语言:javascript
复制
句柄变量=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

坐标轴标题的文本对象

实例程序

代码语言:javascript
复制
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函数即可,调用格式:

代码语言:javascript
复制
句柄变量=line(x,y,z,属性名1,属性值1,属性名2,属性值2,...)

直接line也可以实现曲线对象创建,其中x,y,z就是对应的维度,只使用x、y则是二维图,三者则为三维图,其他的也没啥好解释的,直接看下属性的查看方式,其内部的属性就不多做表述了,接下来的两个对象也是如此

代码语言:javascript
复制
doc Primitive Line Properties

实例程序

代码语言:javascript
复制
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函数,在指定的位置和属性值添加文字说明,在坐标轴对象那一部分的时候,其中一段代码:

代码语言:javascript
复制
set(get(gca,'xlabel'),'String','x轴');%坐标轴名

string就是text中的一个属性,也就是文字说明的字符串了,使用标准的ASCII字符,属性查询方式:

代码语言:javascript
复制
doc Text Properties

实例程序

代码语言:javascript
复制
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函数创建,调用格式:

代码语言:javascript
复制
句柄变量=surface(x,y,z,属性名1,属性值1,属性名2,属性值2...);

mesh和surf函数可直接创建曲面图形,自动创建了曲面对象,曲面属性的查询方式

代码语言:javascript
复制
doc Primitive Surface Properties
实例程序
代码语言:javascript
复制
%绘制三维曲面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对应函数,也会有部分解释,接下来的绘图篇章,估计又要点时间了。。。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子狂人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 应用实例
      • 运行结果
        • 实例程序
        • 运行效果
        • 实例程序
        • 运行效果
        • 实例程序
        • 运行效果
        • 实例程序
        • 运行效果
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档