原文地址:双纵坐标绘图-Plotyy 作者:原点


这篇文章由浅入深详细介绍双纵坐标绘图函数plotyy()的用法。

Plotyy()

很多时候,我们需要将两组或者多组数据量级相差很大的数据绘制在同一张图中以便观察,但往往数据较小的曲线会被较大的曲线淹没。例如下面的代码:


x=-1:.01:20; x=x';y1=sin(x);z1=100*cos(x);plot(x,y1,x,z1);



现实中,如果我们把利率、M1、M2等绘制在一张图内的时候也会出现这种情形。解决这类问题的办法是用双纵坐标绘图,使得大小不同的数据分别属于不同的纵坐标。

纵坐标绘图的函数plotyy基本用法是: plotyy(x1,y1,x2,y2),即可将(x1,y1)绘制在左侧纵坐标轴中,将(x2,y2)图以右侧的纵坐标为纵轴。例如上面这个例子,我们就可以用纵坐标绘图如下:


plotyy(x,y1,x,z1);



注意,蓝色的曲线和蓝色的纵坐标(左侧)相对应,绿色曲线和绿色纵坐标(右侧)相对应。这样不同量级的数据间的关系就很清楚了。一般只要掌握到这里就够了,不过我们还是继续深入下去:

多条曲线

刚才的代码适用于两条曲线,如果要多条曲线,我们需要将这些曲线分成两组,一组绘制在左侧纵坐标轴上,一组绘制在右侧纵坐标轴上。(注意,下面的语句要求各曲线的数据都是列向量)


y2=sin(x+.5); z2=exp(x/4); z3=x.^2;plotyy(x,[y1,y2],x,[z1,z2,z3]);



图画出来了,但我们也搞不清哪条曲线是什么了。此时可以借助图例:


legend({'sin(x)','sin(x+.5)','100cos(x)','exp(x/4)','x^2'});



注:legend中的次序与plotyy中绘图数据的排列次序相同。

调整坐标轴区间和label

我们用xlim, ylim,调整坐标轴的显示区间,用xlabel和ylabel设定显示名称,用axis设定坐标轴的比例,用grid设定网格。月度下面内容前,请确保你对这些命令在单一图形中的操作都已经很熟练了。

我们先绘图:


AX=plotyy(x,[y1,y2],x,[z1,z2,z3]);



有人肯定要问那个AX是什么。这就涉及到图形句柄(graphic handle)的知识。 由于这个课程定位初级学院,所以没有详细讲述讲述句柄知识。这里也不详细说,只是告诉大家,Matlab中所有的图形元素,包括图形窗口(figure),坐标系(axis),曲线(plots)都有一个唯一的编号,这些编号被称作图形句柄。此处我们用plotyy()函数绘制了一个双纵坐标图形,绘制完毕后该函数就将两纵坐标轴对应的两个坐标系的编号(句柄)保存在AX中。故,AX内有两个数值,分别是左纵坐标系,右纵坐标系的编号。

有了这些编号,我们就可以对指定的坐标轴 作设置。逐句运行下面的代码可以清晰地看到效果。


axis(AX(1),'square');axis(AX(2),'square');xlim(AX(1),[-2,23]);xlim(AX(2),[-2,23]);ylim(AX(1),[-2,2]);ylabel(AX(2),'右侧纵坐标');



指定曲线图形样式

对于新手,我推荐使用plottools中点击、选择、修改指定曲线的图形样式,对于老手,则可以用图形句柄的方式做。使用代码


[AX,H1,H2]=plotyy(x,[y1,y2],x,[z1,z2,z3]);



中的H1和H2分别对应左侧纵坐标和右侧纵坐标下属的曲线的句柄值。看下面的例子。


set(H1,'linestyle','-.');set(H2,'lineWidth',2);