加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2014-09-17 22:02:07)
标签:

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 LW分别为画面窗口的长和高(宽)。



http://s9/bmiddle/002WsObHgy6M7rKRNDad8&690

第五步:设定轴框内的颜色以及x y轴的颜色: 将轴框内的颜色设为无色,X轴设为黑色,Y轴设为蓝色。将轴框内的颜色设为无色很重要,特别是建立双坐标轴或者多坐标轴系统时,不然不同轴框之间会相互遮挡

set(Hf,'Color','none','Xcolor','k','Ycolor','b');

http://s9/mw690/002WsObHgy6M7s9x0Nib8&690

第六步:绘制第一条线条并设定线条特性。X坐标数据为PinletY坐标数据为Frequency,设定连线为虚线,蓝色,线宽1.5,标记为下三角,标记边线为蓝色,标记填充为蓝色,标记大小为10.

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

第十步:设定两个坐标轴显示刻度的字体和大小。为了和labelLatex字体的斜体字保持一致,将坐标轴的刻度字体也改为斜体。

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

也可使用下述方法来绘制不同轴框的图例,并使之对齐:

Hll=legend([Lf;Lm],['$Frequency\ $';'$\dot{m}/P_i$'])
       set(Hll,'position',[  0.6    0.5   0.18    0.1],'fontsize',18,'Interpreter','Latex')

这个语句的的优势就是简单明了:先产生两条在不同轴框内的线条的图例在一个方框内,然后可以对这个方框的一系列性质进行设置。但是缺点是图例的解释语言必须对齐,不能是['$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);

注意加入每个参考线后,一定要设定其所属的坐标轴框,不然会出错

 http://s6/mw690/002WsObHgy6M7t6nVOZ05&690


 

第十七步:标注两条参考线,一定要设定其所属的坐标轴

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');  %在工作目录下输出tiff格式图像

saveas(gcf,'abc.fig','fig');

 

有关输出函数的介绍可以参见我的另外一篇博文

http://blog.sina.com.cn/s/blog_a0b4201d0102v11z.html

 

最后可以跟用origin画出来的图像进行比较,唉,不是一个档次的啊。

http://s11/mw690/002WsObHgy6M7uIgKAWea&690

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有