注明:转 参加学术活动,偶尔会遇到这样的情况:报告人口若悬河,滔滔不绝地讲着他的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是经过改进后的一个示例图。在这张图中,我们作了如下改进:
图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');
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论