飞道的博客

Matlab系列之二维图形(下)

441人阅读  评论(0)

续上篇Matlab系列篇的二维图形,本篇将完成剩下二维图形部分篇章…
Matlab系列之二维图形(上)

交互式绘图

交互式绘图的意思就是可以使用鼠标对图形进行操作,具体的实现看待会的演示,首先了解几个会用到的函数: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)%函数句柄的形式调用

以下举个实现例子:

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个点

示例:

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是代表数学函数的符号表达式(字符串),只有一个符号变量(注意看等下的示例就知道是怎样的意思了)

语法格式:

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

示例

ezplot('x+y=3',[-5 5 -1 3])
axis square

结果

特殊绘图指令

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

1)对数坐标轴指令

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

示例1

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

%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

语法格式

polar(theta,rho)%theta:夹角 rho:极径
polar(theta,rho,s)%s指定极坐标图形的样式和颜色

示例

theta=0:0.01:2*pi;
rho=sin(2*theta).*cos(2*theta);
polar(theta,rho,'.r');

结果

特殊图形

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

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

柱状图

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

调用: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(三位水平柱状图)

演示

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'

结果

面积图

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

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

演示

Y = [1, 5, 3;
     3, 2, 7;
     1, 5, 3;
     2, 6, 1];%构建矩阵
figure
area(Y)
set(gca,'layer','top');
title 'Area'

结果

实心图

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

调用: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,...) %指定多个二维填充区。

演示

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

结果

向量图

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

调用:compass(z)或compass(u,v);feather(z)或feather(u,v)
说明:z代表复数向量,u和v分别代表复数向量的实部和虚部

演示1

%创建一个由随机矩阵的特征值构成的罗盘图。
rng(0,'twister') %初始化随机数生成
M = randn(20,20);
Z = eig(M);
figure
compass(Z)

结果1

演示2


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

饼状图

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

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

演示

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

结果

直方图

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

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

演示

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获取)进行学习了,毕竟官方提供的文档更加齐全,函数的各种用法都有加以解释,只是解释可能会相对比较抽象一些,所以掌握了一定的基础,再去折腾会容易很多。

由于写的时间断断续续的,可能存在一定的不足,所以有问题,欢迎指出~


更多精彩,等你发现~



转载:https://blog.csdn.net/Smart_Devil/article/details/116561765
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场