黑洞视界分享 http://blog.sciencenet.cn/u/odyssey 清华大学天体物理中心副研究员

博文

Matlab画图(一):生成高质量的供发表和展示用的图

已有 24229 次阅读 2014-2-9 17:37 |个人分类:Matlab画图|系统分类:科研笔记

       参加学术活动,偶尔会遇到这样的情况:报告人口若悬河,滔滔不绝地讲着他的PPT “..... 上面所说的情况可以用这张图来说明......”,观众在下面瞪大了眼睛,想极力辨认图中的细节,却什么都看不清。此时,报告人多半也意识到出现了问题,向观众说声抱歉,并解释说:“这个图在电脑屏幕上看效果很好,不知为什么在投影仪上显示不清楚.....”。

      我第一次作课程试讲时,一位有经验的老教师就指出课件中的一些文字有点小,前排的学生可以看清楚,但后排的学生辨认起来会比较吃力。以前还听同事讲过一位华裔诺贝尔奖获得者的轶事:那位先生让学生讲工作报告时,会坐在带轮子的扶手椅上,沿着过道滑到会议室的最后,如果在那里看不清楚PPT上的内容,就当场把学生轰下去。

       不管怎么说,图表是论文、报告、课件等文档的重要内容之一。高质量的图表给读者以视觉上的享受,并帮助他们理解相关的知识。虽说现在有很多软件可以自动生成各种图表,但如果我们对图表的质量有很高要求的话,那么这些傻瓜式的工具可能就不再适用了。我们需要从底层了解图表生成的细节。

       每种画图软件都有其特点,在较短的篇幅内全面、详细介绍这些软件不太现实,结合一款软件把画图过程的核心内容说清楚就可以了。在这里我选用用户群比较广泛的Matlab。


一、屏幕(纸)坐标系和世界坐标系

       对于Matlab来说,我们的目标是用图的方式把一批数据给表现出来。数据有大有小,可以相差好几个数量级,然而纸张或屏幕的大小是限定的,因此我们需要用两种坐标系统来表示位置。一种是屏幕(纸)坐标,通常用(m,n)来表示。以像素为单位,(m,n)表示屏幕上第m行,第n列个像素的位置。另一种是世界坐标,一般用(x,y)来表示,它表明的是一个点在数据空间的位置。

       给定世界坐标原点在屏幕坐标的位置,以及相应的比例尺,同样一个点在世界坐标和屏幕坐标中的坐标值是可以相互转换的。在这里,我们不去关心转换的细节。

       Matlab中图(Figure)的位置(如图1所示)可以用四个数字来描述,这四个数字为[left bottom width height],left为图的左下角与屏幕左边缘的距离,bottom为图的左下角与屏幕底边的距离,width和height分别为图的宽度和高度,这四个数字的单位都为像素(px)。类似的,当Matlab向打印机或文件输出图形时,图的位置也有类似的定义,只不过会采用英寸、厘米、毫米等单位。

图1:图(Figure)在屏幕中的位置示意图。


       在数学中,点是没有大小的,线是没有宽度的,而在一张实际的图像中,点需要有一定的大小,线需要有一定的宽度。Matlab画图时,图中的元素(例如文字、图标等等)的参考位置总是用世界坐标来表示,不需要赋予单位,而元素的大小则有单位,输出到屏幕时,通常以像素为单位,输出到纸张时,通常用英寸、厘米、毫米等长度单位。在图2的例子中,通过编程(参考示例程序example11.m)可以找出本图的标题(title)的中心位置为(4.99,1.03),是用世界坐标表示的;标题区域为[4.30, 1.01, 1.33, 0.08],其中前两个数为X和Y方向的起始坐标,后两个数分别为在X和Y方向的宽度,同样也用世界坐标;标题的文字大小为10个像素,用了具体的长度单位。

图2:示例图1,为1Hz的正弦信号的波形图。


二、美化图形

       在绘制图2所示的例图时,我们使用了Matlab默认的参数,然后在菜单栏用‘另存为’功能将图保存为PNG格式的图片,相当于对屏幕进行硬拷贝。这张图的质量比较差,具体体现在:一、图像的分辨率很低,只有560x420像素;二、文字太小,看不清楚,Matlab默认的文字大小为10px;三、坐标轴和曲线比较细,整个图看上去相当单薄。

      好在Matlab提供了灵活、简便的方法,可修改图中各种参数的数值。图3是经过改进后的一个示例图。在这张图中,我们作了如下改进:

  1. 通过set(gca, 'fontsize', 14);,将坐标轴标签的字符大小从8px增加到14px;

  2. 通过set(gca, 'XMinorTick', 'on');等,设置X和Y轴的副标记(MinorTick);

  3. 通过set(gca, 'XGrid', 'on');等,显示坐标网格;

  4. 通过set(gca, 'LineWidth', 1.5);,将坐标轴的线宽由0.5px增加到1.5px;

  5. 通过设置'FontSize',将标题的字符大小由10px增加到20px;X、Y轴标签的字符大小由10px增加到16px;

  6. plot时,通过设置’LineWidth‘,将线宽由0.5px增加到1.5px。

图3:示例图2,为1Hz(蓝实线)和3Hz(红虚线)信号的波形图。


       相比于示例图1,示例图2有了很大的改进,不过其整体视觉效果仍然欠佳,原因是这个图是用屏幕硬拷贝的方式保存的,其分辨率只有560x420像素。要获得高质量的最终图像,我们需要用到Matlab的图像输出功能。下一部分将介绍这方面的内容。


三、输出图形

        前面已经介绍过,Matlab的绘图结果可以输出到屏幕,也可以输出(打印)到纸张上,或者保存为某种格式的图像。屏幕的分辨率有限,通过硬拷贝获得的图像质量一般,要获得高质量的图像,目前通常的做法是把绘图结果保存到图像文件中。

       可以使用Matlab的print()函数来将绘图结果输出到图像文件中。该函数的参数’-dxxx'用来指定输出图像的格式,例如要生成无损压缩的PNG格式的点阵图像,对应的设置为'-dpng'。影响图像质量最重要的参数是'-rnnn',该参数指定输出图像的分辨率,单位是“像素/英寸”。例如若图像的目标分辨率为100像素/英寸,则对应的参数设置为'-r100'

       为了便于比对图像的质量,我们将示例图二(图3)所绘制的图形分别以70像素/英寸、140像素/英寸和280像素/英寸的分辨率输出到PNG格式的点阵图像中(如图4、5、6所示)。在默认的情况下,Matlab的图像输出区域大小为8英寸X6英寸,70像素/英寸对应的输出图像的大小正好为560X420像素,与屏幕输出的图像大小一致。相应的,140像素/英寸和280像素/英寸分辨率对应的图像大小分别为1129X840像素和2258X1680像素。在图4、5、6中,为了便于比较,我们将三张图统一缩放至640X480像素大小。在Macbook Pro的Retina显示器上,图像质量的高低对比颇为明显。若显示器的分辨率比较低,可以在浏览时按‘Cntr + '+'’将页面放大后再进行比较。


图4:示例图2的PNG格式图像输出,分辨率70像素/英寸。


图5:示例图2的PNG格式图像输出,分辨率140像素/英寸。


图6:示例图2的PNG格式图像输出,分辨率280像素/英寸。


       print()函数还可以将绘图结果输出成EPS格式的矢量图。很多专业期刊要求在稿件中使用矢量图,这样的图片在进行缩放时不会降低质量,无论是在pdf文档中显示,还是印刷到纸质期刊上,效果都相当不错。因在网页中无法显示,我将EPS格式的图像放在附件中(Example12.eps),感兴趣的读者可下载查看。


后记:

       原本只是想自己在学习Matlab画图的过程中,草草做些网络笔记,不至于轻易忘记所学内容。没想到一路下来,所查看的内容还不少,且相当凌乱。遂起了念头,干脆好好整理一下,也算是自己的一个劳动成果吧。

       科研工作中涉及到的画图技巧还有很多,等积累到一定程度,再写第二篇博客文章!

-----------------------------------------------------------------------------------------------------------------------

附录:Matlab程序

example11.m

% example 1.1

% This script shows an example which shows the position

% and size of the 'title' of the figure.

% By Jianfeng Zhou, 2014/01/26

 

% Clear the enviroment

clc; clear all; close all;

 

% Plot a simple curve.

x = 0:0.01:10;

y = sin(x);

plot(x,y,'b-');

title('Example 1.1');

xlabel('Time (Second)');

ylabel('Amplitude');

 

% Find the object of title, and shows the information

% of 'Position' and 'Extent'

%h = findall(gca, 'String','Example 11');

% The above command can be replaced by

h = get(gca, 'title');

 

get(h, 'Position')

get(h, 'Extent')

get(h, 'FontSize')


example12.m

% example 1.2

% This script shows an example with improved figure.

% By Jianfeng Zhou, 2014/01/26

 

% Clear the enviroment

clc; clear all; close all;

 

% Plot a simple curve.

x = 0:0.01:10;

y = sin(x);

yy = sin(3.0.*x);

 

p1 = plot(x,y,'b-', 'Linewidth', 1.5);

hold on;

p2 = plot(x,yy,'r--', 'Linewidth', 1.5);

set(gca, 'fontsize', 14);

set(gca, 'XMinorTick', 'on');

set(gca, 'YMinorTick', 'on');

set(gca, 'XGrid', 'on');

set(gca, 'YGrid', 'on');

set(gca, 'LineWidth', 1.5);

title('Example 1.2', 'fontsize', 20);

xlabel('Time (Second)', 'fontsize', 16);

ylabel('Amplitude', 'fontsize', 16);

 

%Save the figure into files with different resolutions.

print(gcf, '-depsc2', 'Example12.eps');

print(gcf, '-dpng', '-r70', 'Example12-r70.png');

print(gcf, '-dpng', '-r140', 'Example12-r140.png');

print(gcf, '-dpng', '-r280', 'Example12-r280.png');




http://blog.sciencenet.cn/blog-3854-760545.html

上一篇:使用虚拟机
下一篇:《工物31周刊》创刊寄语

1 杨建军

该博文允许注册用户评论 请点击登录 评论 (2 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2020-9-18 22:56

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部