交互式绘图的意思就是可以使用鼠标对图形进行操作,具体的实现看待会的演示,首先了解几个会用到的函数:ginput、gtext和zoom,其中ginput只能用于二维图形绘制,另外两个还适用于三维图形绘制。
语法格式:[x,y]=ginout(n)
功能描述:用鼠标确定n个点的数据坐标(x,y),因此要注意,n必须是正整数。只要运行了该指令,会将所对应的图像置于首层,鼠标此时也会变成十字形,然后移动鼠标找到待取点的位置,单击将该点的坐标数据值存入[x,y],依次获得剩余n-1个待取点的坐标数据,全部获取完成后,图像窗口退出首层,状态也回到该指令执行前。
语法格式:gtext(arg)
功能描述:通过鼠标操作的方式,把arg对应的字符串或字符串元胞数组放置到对应的位置作为文字描述,运行该指令的状态和ginput的一致,单个字符串,单击一次鼠标就放置完成,多个字符串,就多次点击,直到操作完成。
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(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(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
结果
刚刚在双坐标轴绘图的地方,有写到几个特殊的对数指令,这边也当作特殊指令一起介绍下。
semilogx(...)%在x轴上采用常用对数进行标定,使用格式和plot相同,以下两个也一样
semilogy(...)%在y轴上采用常用对数进行标定
loglog(...)%x和y都采用常用对数进行标定
x=0.001:0.001:20;
y=5+log(x)+x;
semilogx(x,y,'b');
hold on
semilogx(x,x+3,'g');
%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')
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分别代表复数向量的实部和虚部
%创建一个由随机矩阵的特征值构成的罗盘图。
rng(0,'twister') %初始化随机数生成
M = randn(20,20);
Z = eig(M);
figure
compass(Z)
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)
弄占比的统计时,就很常见了,使用如下
调用: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获取)进行学习了,毕竟官方提供的文档更加齐全,函数的各种用法都有加以解释,只是解释可能会相对比较抽象一些,所以掌握了一定的基础,再去折腾会容易很多。
由于写的时间断断续续的,内容上容易出现一定的不足,所以有问题,欢迎指出~