深度学习matlab绘图功能--利用matlab脚本绘制双Y轴坐标系实例

标签:
365 |
分类: matlab学习 |
暑假前刚做了一段时间实验,在这段时间里第一次接触到了matlab这个早就听过的软件,之后在进行数据处理的时候体会到了他的强大所在。最后在写报告的时候要画一些图,而我一直是使用origin软件作图的,但是发现origin的使用没有matlab方便:origin必须跟excel结合起来才能处理数据,label的标注字体都特别难看,并且坐标轴的控制功能很有限,处理出来的图像总是不能让我非常满意。而matlab数据处理功能的强大自不必提了,在作图的时候由于可以跟LaTex结合起来,matlab做出来的图形上的字体看起来都特别的漂亮,这也是促使我由origin转向matlab的最重要的原因。另外一点,为什么要使用matlab脚本来绘图呢?最大的好处就是可以做到对图形的各个细节的精确控制,这使得你可以做出任何你想要的图形,当然这是有时间代价的,毕竟写一个好的脚本花的时间比自动生成的图像花的时间要多得多,比如我从头开始写这个脚本花了1天半,(当然包括了很多学习新东西的时间);但是当有大量的图形需要生成的时候,脚本的优势就能体现出来了,他能够让你快速的批量生成优质的图像。这也是使我对matlab脚本绘图感兴趣的原因。
用脚本绘图的核心是对matlab图形句柄函数的运用,关于这个我实际上也没有理解的特别深刻,感兴趣的可以自行搜索相关的资料。
下面以一个双Y轴坐标系绘制的实例一步一步的介绍matlab的强大的绘图功能。在这个实例中基本上碰到了matlab画二维图的所有问题,比如坐标轴的控制,坐标轴刻度的编辑,线条的生成和编辑,legend图例的生成和编辑,坐标轴标签label的编辑,文本的添加的编辑,以及与LaTex的结合应用等。遇到各个单独的问题,其细节可以到网上搜索更加完整的介绍。
由于原始的数据是我的实验数据,就不公开了,大家可以自行生成两组数据按照我所列的步骤进行学习。
第一步:载入数据
load originaldata.mat;
第二步:清除当前窗口current figure 的所有信息,如果没有窗口则新建一个窗口
clf reset;
http://s9/bmiddle/002WsObHgy6M7rzGEXe38&690
第三步:设定窗口的背景颜色是白色
set(gcf,'color','w');
http://s4/mw690/002WsObHgy6M7rIeV5pe3&690
第四步:新建并设定轴框的位置和大小,为整体画面的比例,同时获取其句柄
Hf=axes('position',[0.13,0.13,0.7,0.75]);
其含义是在画面x=0.13L, y=0.13W处建立一个长为0.7L,高为0.75W的轴框,其句柄为Hf。 L和W分别为画面窗口的长和高(宽)。
http://s9/bmiddle/002WsObHgy6M7rKRNDad8&690
第五步:设定轴框内的颜色以及x y轴的颜色: 将轴框内的颜色设为无色,X轴设为黑色,Y轴设为蓝色。将轴框内的颜色设为无色很重要,特别是建立双坐标轴或者多坐标轴系统时,不然不同轴框之间会相互遮挡
set(Hf,'Color','none','Xcolor','k','Ycolor','b');
http://s9/mw690/002WsObHgy6M7s9x0Nib8&690
Lf=line('XData',Pinlet,'YData',Frequency,'LineStyle','--','Color','b','linewidth',1.5,'Marker','v','MarkerEdgeColor','b','MarkerFaceColor','b','MarkerSize',10);
http://s1/mw690/002WsObHgy6M7swfLqwf0&690
第七步: 同上,设定另外一个轴框,其位置大小的坐标取自第一个轴框,其句柄为Hm,改变坐标轴颜色,并在此轴框内绘制第二条线条
Hm=axes('position',get(Hf,'position'));
set(Hm,'Color','none','Xcolor','k','Ycolor','r');
Lm=line('XData',Pinletbar,'YData',MPinlet,'LineStyle','-','color','r','linewidth',1.5,'Marker','*','MarkerEdgeColor','r','MarkerFaceColor','r','MarkerSize',15);
我们从图中可以看出,两个轴的标注不一样,且相互重叠
http://s7/mw690/002WsObHgy6M7sh4S7cc6&690
第八步:改变第二个轴框坐标轴的位置,设定Y轴的位置在轴框的右侧,设定X轴的位置在轴框的上部
set(Hm,'Yaxislocation','right');
set(Hm,'Xaxislocation','Top');
这样显得稍微清楚明了了。可以看出两条线的X坐标范围是一样的,因此可以共用一个X轴坐标表示
http://s11/mw690/002WsObHgy6M7sAOqNQ6a&690
第九步:标注三个轴的名称并设定字体,使用Latex字体表示
set(get(Hf,'Ylabel'),'String','$Frequency(Hz)$','FontSize',18,'color','k','Interpreter','latex');
set(get(Hm,'Ylabel'),'String','$\dot{m}/P_i$','FontSize',18,'color','k','Interpreter','latex');
set(get(Hf,'Xlabel'),'String','$P_i/P_{atm}$','FontSize',18,'color','k','Interpreter','latex');
注意使用Latex进行标注时,字符串两边一定要加上$$。
http://s5/mw690/002WsObHgy6M7slQtFy74&690
第十步:设定两个坐标轴显示刻度的字体和大小。为了和label的Latex字体的斜体字保持一致,将坐标轴的刻度字体也改为斜体。
set(Hf,'Linewidth',2.0,'FontAngle','italic','FontSize',12);
set(Hm,'Linewidth',2.0,'FontAngle','italic','FontSize',12);
http://s5/mw690/002WsObHgy6M7sFN8Qk14&690
第十一步:现在的图像虽然没什么大问题,但看起来不够协调,可改变图形的大小和比例如下;
设定图的屏幕显示位置和大小尺寸,其单位是像素点
set(gcf,'position',[50,50,1200,700]);
http://s2/mw690/002WsObHgy6M7sVP53r21&690
第十二步:为了将两条线的渐近值进行比较,要将两条线的渐近线表示在同一水平线上;其次只显示一个X轴坐标
分别设定两个坐标轴的坐标范围和显示刻度
set(Hm,'Ylim',[0.2,0.5]);
set(Hf,'Ylim',[520,710]);
set(Hm,'Xlim',[1,2.8]);
set(Hf,'Xlim',[1,2.8]);
set(Hf,'Ytick',[520,550,600,650,710]);
set(Hf,'Xtick',[1.0,1.3,1.6,1.9,2.2,2.5,2.8]);
set(Hm,'Ytick',[0.20,0.25,0.30,0.35,0.40,0.45,0.50]);
set(Hm,'Xtick',[]);
http://s5/mw690/002WsObHgy6M7sLifYg74&690
第十三步:为了是图形更加美观,使坐标刻度线转向朝外
set(Hf,'TickDir','out');
set(Hm,'TickDir','out');
http://s8/mw690/002WsObHgy6M7sNVXP9d7&690
第十四步:
标注并修改legend的大小和位置,其值为所占整体画面的比例,前两项是方框左下脚点的坐标,后两项是方框的长和宽
pm=legend(Lm,'$\dot{m}/P_i$');
set(pm,'Fontsize',20,'position',[0.6,0.5,0.2,0.05],'interpreter','latex');
pf=legend(Lf,'$Frequency$');
set(pf,'Fontsize',20,'position',[0.6,0.45,0.2,0.05],'interpreter','latex');
http://s2/mw690/002WsObHgy6M7t0UNZD11&690
第十五步:上所示两个图例的大小不一样,影响美观,可用一下语句使两个图例对其
首先获取legend的子句柄,每个legend图例有三个子句柄,分别控制线条linestyle,图示Marker,和文字说明text
Ch_pm=get(pm,'children');
Tposition_pm=get(Ch_pm(3),'position'); %获取文字说明text的坐标信息
Ch_pf=get(pf,'children');
Tposition_pf=get(Ch_pf(3),'position');
然后将legend 句柄Ch_pm 图例的坐标信息赋值给Ch_pf
set(Ch_pf(1),'Xdata',get(Ch_pm(1),'Xdata'));
set(Ch_pf(2),'Xdata',get(Ch_pm(2),'Xdata'));
set(Ch_pf(3),'position',[Tposition_pm(1),Tposition_pf(2)]);
http://s3/mw690/002WsObHgy6M7t4nsRQ22&690
也可使用下述方法来绘制不同轴框的图例,并使之对齐:
这个语句的的优势就是简单明了:先产生两条在不同轴框内的线条的图例在一个方框内,然后可以对这个方框的一系列性质进行设置。但是缺点是图例的解释语言必须对齐,不能是['$Frequency$','$\dot{m}/P_i$'], 这样的话就会出错,引号内的位数一定要一致相等。效果如下图(这张是最后补的图)
http://s8/mw690/002WsObHgy6M8U3ApPpe7&690
第十六步:为了更好的解释这张图所表示的意义,我还需要在图中加入三条参考线,一条水平参考线和两条竖直参考线,方法如下:
Lh1=line([1,2.8],[690,690],'linestyle','--','Color','k','linewidth',3);
set(Lh1,'parent',Hf);
Lh2=line([1.85,1.85],[520,710],'linestyle','--','Color','r','linewidth',3);
set(Lh2,'parent',Hf);
Lh3=line([1.68,1.68],[520,710],'linestyle','--','Color','b','linewidth',3);
set(Lh3,'parent',Hf);
注意加入每个参考线后,一定要设定其所属的坐标轴框,不然会出错
第十七步:标注两条参考线,一定要设定其所属的坐标轴
Th1=text(1.87,550,'$P_{cr}^*$','Fontsize',20,'color','r','Interpreter','Latex');
set(Th1,'parent',Hf);
Th2=text(1.58,550,'$P_{cr}$','Fontsize',20,'color','b','Interpreter','Latex');
set(Th2,'parent',Hf);
http://s9/mw690/002WsObHgy6M7t83Ss028&690
第十八步:到此为止绘图已基本完成,但坐标轴的label距离坐标轴太近,为了美观起见,可适当调整一下:
修改三个label的位置,注意label的位置只能在最后修改,不然会得不到想要的效果
%这里的X Y Z坐标是以所在坐标轴坐标为参照的
Phfy=get(get(Hf,'Ylabel'),'position');
set(get(Hf,'Ylabel'),'position',[Phfy(1)-0.07,Phfy(2),Phfy(3)]);
Phmy=get(get(Hm,'Ylabel'),'position');
set(get(Hm,'Ylabel'),'position',[Phmy(1)+0.05,Phmy(2),Phmy(3)]);
Phfx=get(get(Hf,'Xlabel'),'position');
set(get(Hf,'Xlabel'),'position',[Phfx(1),Phfx(2)-7,Phfx(3)]);
http://s9/mw690/002WsObHgy6M7tdcLNu48&690
第十九步:
加入标题并修改标题位置,注意使用Latex字体时空格的表示必须加入\ 。
Ht=title('$Comparison\ between\ frequency\ response\ and\ inlet\ volume\ flowrate\ response\ to\ the\ inlet\ pressure\ variation$','fontsize',17,'Interpreter','Latex');
Pht=get(Ht,'position');
set(Ht,'position',[Pht(1),Pht(2)+0.01,Pht(3)]);
http://s4/mw690/002WsObHgy6M7tbKqBld3&690
第二十步:至此图形的绘制就全部完成了,可以输出了:使用print函数输出tiff格式图像,使用saveas函数输出fig格式图像到工作目录下。
set(gcf,'PaperPositionMode','auto');
print(gcf,'-r200','-dtiff','abc.tif');
saveas(gcf,'abc.fig','fig');
有关输出函数的介绍可以参见我的另外一篇博文
http://blog.sina.com.cn/s/blog_a0b4201d0102v11z.html
最后可以跟用origin画出来的图像进行比较,唉,不是一个档次的啊。