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

Matlab系列之二维图形(下)

作者头像
狂人V
发布2021-04-29 17:20:52
1.3K0
发布2021-04-29 17:20:52
举报
文章被收录于专栏:电子狂人电子狂人

交互式绘图

交互式绘图的意思就是可以使用鼠标对图形进行操作,具体的实现看待会的演示,首先了解几个会用到的函数:ginput、gtext和zoom,其中ginput只能用于二维图形绘制,另外两个还适用于三维图形绘制。

ginput

语法格式:[x,y]=ginout(n)

功能描述:用鼠标确定n个点的数据坐标(x,y),因此要注意,n必须是正整数。只要运行了该指令,会将所对应的图像置于首层,鼠标此时也会变成十字形,然后移动鼠标找到待取点的位置,单击将该点的坐标数据值存入[x,y],依次获得剩余n-1个待取点的坐标数据,全部获取完成后,图像窗口退出首层,状态也回到该指令执行前。

gtext

语法格式:gtext(arg)

功能描述:通过鼠标操作的方式,把arg对应的字符串或字符串元胞数组放置到对应的位置作为文字描述,运行该指令的状态和ginput的一致,单个字符串,单击一次鼠标就放置完成,多个字符串,就多次点击,直到操作完成。

zoom

zoom是用于图像缩放,跟随不同的搭配组合,可以实现不同的缩放形式,对应的指令如下表

指令格式

说明

zoom xon

可按x轴进行缩放

zoom yon

可按y轴进行缩放

zoom on

当前图形可缩放

zoom off

当前图形不可缩放

zoom

on和off的相互切换

zoom out

还原到图形的初始状态

zoom(factor)

设定具体的缩放比例,默认值为2

Note:运行缩放指令后,单击可进行图形的放大缩小,长按鼠标左键并框选放大区域,再释放左键,对应的区域放大,右键则缩小。

双坐标轴绘图

这个双坐标轴的意思就是把两个不同量纲、不同数量级的自变量对应的因变量绘制在同一张图上,且具有左右两个纵轴,和直接plot(x1,y1,x2,y2)的结果有一点区别,具体的指令是plotyy;

语法格式:plotyy(x1,y1,x2,y2)、plotyy(x1,y1,x2,y2,fun1)、plotyy(x1,y1,x2,y2,fun1,fun2)

其中fun1和fun2是指定的函数,可以为:plot, semilogx, semilogy, loglog, stem等。然后按照函数指定的形式绘图

使用方式如下:

plotyy(x1,y1,x2,y2,'loglog')%字符串的形式调用 plotyy(x1,y1,x2,y2,@loglog)%函数句柄的形式调用

以下举个实现例子:

代码语言:javascript
复制
x1=0:0.1:4;
x2=0:0.2:4;
y1=x1.*sin(x1);
y2=x2.*cos(x2);
plotyy(x1,y1,x2,y2,@stem,'plot');
text(2,-1,'\ity=x*sinx');
text(3,1,'\ity=x*cosx');

结果

两个特殊的绘图指令

在此处之前用到的plot指令,都是针对已经得到的数据,根据这些数据进行绘图,假如一个函数的自变量变化趋势是未知的,那么使用plot指令,就可能出现间隔不合理,图形也没法很好反应函数的效果,所以fplot和ezplot需要做些使用了解。

fplot

该指令会根据软件内部设置的自适应算法,动态的决定自变量的离散间隔,自变量数值之间变化快的,间隔小,变化慢间隔就大。

语法格式:

fplot(fun,limits)%fun是需要绘制的函数,limits代表自变量的取值范围[xmin,xmax],也可限制因变量和自变量的范围[xmin,xmax;ymin,ymax] fplot(fun,limits,linespec)%linespec指定图形线型、颜色、标记等属性 fplot(fun,limits,tol)%tol为允许的误差范围 fplot(fun,limits,n)%至少要绘制n+1个点

示例:

代码语言:javascript
复制
subplot(221);fplot(@sin,[0,4*pi],'-*');
subplot(222);fplot(@(x)sin(1/x),[0.01,0.1],'-*');
subplot(223);fplot(@(x)abs((exp(-j*x*(0:9)))*ones(10,1)),[0,2*pi],'-*');
subplot(224);fplot(@(x)[sin(x),cos(x),tan(x)],[-2*pi,2*pi],'-*');

结果:

结果显然很符合函数的变化规律

ezplot

ezplot就更直接了,指定一块区域,不准备数据就直接把图画出来,调用的基本格式:ezplot(f),f是代表数学函数的符号表达式(字符串),只有一个符号变量(注意看等下的示例就知道是怎样的意思了)

语法格式:

代码语言:javascript
复制
ezplot(f,[min,max])%设置x的自变量范围[min,max],y方向默认
ezplot(f,[xmin,xmax,ymin,ymax])%x方向的变量范围[xmin,xmax],y方向的变量范围[ymin,ymax]
ezplot(x,y)%(-2*pi到2*pi)默认范围绘制x和y
ezplot(x,y,[min,max])%[min,max]范围内绘制x,y

示例

代码语言:javascript
复制
ezplot('x+y=3',[-5 5 -1 3])
axis square

结果

特殊绘图指令

刚刚在双坐标轴绘图的地方,有写到几个特殊的对数指令,这边也当作特殊指令一起介绍下。

1)对数坐标轴指令

代码语言:javascript
复制
semilogx(...)%在x轴上采用常用对数进行标定,使用格式和plot相同,以下两个也一样
semilogy(...)%在y轴上采用常用对数进行标定
loglog(...)%x和y都采用常用对数进行标定

示例1

代码语言:javascript
复制
x=0.001:0.001:20;
y=5+log(x)+x;
semilogx(x,y,'b');
hold on
semilogx(x,x+3,'g');

结果1(仔细看图的x坐标)

示例2

代码语言:javascript
复制
%y=x^3函数图
x=[1:100];
subplot(311);
plot(x,x.^3);
title('plot y=x^3')

%y=x^3对数坐标图
subplot(312)
loglog(x,x.^3);
title('loglog logy=logx^3')

%y=x^3半对数坐标图
subplot(313)
semilogy(x,x.^3);
title('semilogy logy=x^3')

结果2

2)极坐标函数ploar

语法格式

代码语言:javascript
复制
polar(theta,rho)%theta:夹角 rho:极径
polar(theta,rho,s)%s指定极坐标图形的样式和颜色

示例

代码语言:javascript
复制
theta=0:0.01:2*pi;
rho=sin(2*theta).*cos(2*theta);
polar(theta,rho,'.r');

结果

特殊图形

从matlab的界面,菜单中的绘图选项,就可以看到除了最常见的plot所得的曲线图以外,还有柱状图、饼状图、直方图等等相对特殊的图形,该部分将介绍几种特殊的图形,如果还有更特殊的图形要求,可以在绘图菜单中,图片右边那个下三角点开找找对应的绘制函数。

关于各图形函数的用处就不扯多了,直接介绍下这些特殊图形函数的简单使用吧。

柱状图

顾名思义,就是柱状的图……

代码语言:javascript
复制
调用:bar(x,y,width,param);
说明:x,y分别为横纵坐标向量,x在默认状态下取值为y的向量长度,假设其值分别为m和n,则构成m x n的矩阵,所得的图形即:m组柱状图,每组有n条;width为竖条的宽度,默认是0.8,若值超过1,则会竖条之间会发生重叠;param为参数,有分组式(grouped)和累加式(stacked),默认是分组式;
备注:bar是二维的直柱状图,还有bar3(三维垂直柱状图,参数多了给分离式【detached】),barh(水平柱状图),bar3h(三位水平柱状图)

演示

代码语言:javascript
复制
Y=round(rand(5,3)*10);%产生5*3的随机矩阵数据
subplot(221);
bar(Y,'grouped');%分组式
title 'Group'
subplot(222);
bar(Y,'stacked');%累加式
title 'Stack'
subplot(223);
barh(Y,'stacked');%水平柱状图,累加式
title 'Stack'
subplot(224);
bar(Y,1.5);%1.5的宽度,发生图形叠加
title 'Width=1.5'

结果

面积图

也有叫区域图,这个就只适用于二维了,具体往下看

代码语言:javascript
复制
调用:area(x,y)
说明:绘制 Y 对 X 的图,并填充 0 和 Y 之间的区域。X 的值可以是数值、日期时间、持续时间或分类值。
          如果 Y 是向量,则将 X 指定为由递增值组成的向量,其长度等于 Y。如果 X 的值不增加,则 area 将在绘制之前对值进行排序。
          如果 Y 是矩阵,则将 X 指定为由递增值组成的向量,其长度等于 Y 的行数。area 将 Y 的列绘制为填充区域。对于每个 X,最终结果是 Y 行的相应值的和。还可以将 X 指定为大小等于 Y 的矩阵。为了避免 X 为矩阵时出现意外输出,一般将 X 的列指定为重复列。

演示

代码语言:javascript
复制
Y = [1, 5, 3;
     3, 2, 7;
     1, 5, 3;
     2, 6, 1];%构建矩阵
figure
area(Y)
set(gca,'layer','top');
title 'Area'
结果

实心图

实心就很好理解了,一个图,然后起点和终点连接成多边形,再填充颜色,所以函数就是===>【fill】

代码语言:javascript
复制
调用:fill(X,Y,C)
说明:根据 X 和 Y 中的数据创建填充的多边形(顶点颜色由 C 指定)。C 是一个用作颜色图索引的向量或矩阵。如果 C 为行向量,length(C) 必须等于 size(X,2) 和 size(Y,2);如果 C 为列向量,length(C) 必须等于 size(X,1) 和 size(Y,1)。必要时,fill 可将最后一个顶点与第一个顶点相连以闭合多边形。X 和 Y 的值可以是数字、日期时间、持续时间或分类值。

另一个用法:fill(X1,Y1,C1,X2,Y2,C2,...) %指定多个二维填充区。

演示

代码语言:javascript
复制
t = (1/16:1/8:1)'*2*pi;
x = cos(t);
y = sin(t);
fill(x,y,'r')%创建一个红色八边形
axis square

结果

向量图

plot可以绘制复数向量图,还有compass(罗盘图)和feather(速度向量,也可以称为羽毛图,挺像羽毛的)

代码语言:javascript
复制
调用:compass(z)或compass(u,v);feather(z)或feather(u,v)
说明:z代表复数向量,u和v分别代表复数向量的实部和虚部
演示1
代码语言:javascript
复制
%创建一个由随机矩阵的特征值构成的罗盘图。
rng(0,'twister') %初始化随机数生成
M = randn(20,20);
Z = eig(M);
figure
compass(Z)
结果1

演示2

代码语言:javascript
复制
theta = -pi/2:pi/16:pi/2;%将 theta 定义为介于 −2π 和 2π 之间的值。
r = 2*ones(size(theta));%定义 r 为与 theta 同样大小的向量。
[u,v] = pol2cart(theta,r);%创建显示 theta 的方向的羽毛图。由于 feather 使用笛卡尔坐标,使用 pol2cart 将 theta 和 r 转换为笛卡尔坐标。
feather(u,v)

结果2

饼状图

弄占比的统计时,就很常见了,使用如下

代码语言:javascript
复制
调用:pie(X,explode,'label') 
说明:X 是向量。explode和x同长度的向量,决定是否从饼图中分离出对应的块,非零就表示该部分饼块要分离;label标注饼图的字符串数据 
备注:三维饼图用pie3,使用格式和pie的相同

演示

代码语言:javascript
复制
x=[1 3 0.5 2.5 3];%为方便理解,直接设置了和为10的五个数,然后按百分比就分别是:10% 30% 5% 25% 30% 
explode=[0 1 0 0 1];%将第2、5块饼图进行偏移,即将两个3分别代表的饼块从原本的饼状图分离出来 
subplot(211); 
pie(x,explode);%直接绘制 
labels={'1','2','3','4','5'};%设置五块饼对应的标注 
subplot(212); 
pie(x,explode,labels);%直接绘制+标注 
colormap prism

结果

直方图

直方图的话,做数据分布情况分析的时候应该用得上,直接还是一样,说下怎么使用吧

代码语言:javascript
复制
调用:hist(x)、hist(x,nbins) 
说明:x是一个待划入统计的元素组,nbins是指定直方图分布间隔

演示

代码语言:javascript
复制
x = randn(1000,3); %产生1000*3的随机数组合 
subplot(221) 
hist(x)%直接绘图,自动等距间隔 
subplot(222) 
hist(x,(-4:4)); 
subplot(223) 
hist(x,(-2:2)); 
subplot(224) 
hist(x,[-4 -2 -1.5 0 0.5 3]);

结果(注意看中心,以及第四幅图未按比例进行指定间距时,会标记出给定值的位置)

结语

磨磨蹭蹭的,终于写完了这篇,前段时间忙着换工作,这一个多月也就直接过去了,内容上,还是很多没能够详细记录下来,感觉过于那些过于细节了,写多了,总感觉容易把看的人带入坑,而不愿意自己再根据官方的资料(help或doc获取)进行学习了,毕竟官方提供的文档更加齐全,函数的各种用法都有加以解释,只是解释可能会相对比较抽象一些,所以掌握了一定的基础,再去折腾会容易很多。

由于写的时间断断续续的,内容上容易出现一定的不足,所以有问题,欢迎指出~

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 交互式绘图
    • ginput
      • gtext
        • zoom
        • 双坐标轴绘图
        • 两个特殊的绘图指令
          • fplot
            • ezplot
            • 特殊绘图指令
              • 1)对数坐标轴指令
                • 示例1
                • 结果1(仔细看图的x坐标)
                • 示例2
                • 结果2
              • 2)极坐标函数ploar
                • 语法格式
                • 示例
                • 结果
            • 特殊图形
              • 柱状图
                • 演示
                • 结果
              • 面积图
                • 演示
              • 实心图
                • 演示
                • 结果
              • 向量图
                • 演示2
                • 结果2
              • 饼状图
                • 演示
                • 结果
              • 直方图
                • 演示
                • 结果(注意看中心,以及第四幅图未按比例进行指定间距时,会标记出给定值的位置)
            • 结语
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档