- R语言与医学统计图形
- 张铁军 陈兴栋 刘振球主编
- 3982字
- 2020-08-28 23:25:14
第二章 基础绘图包之低级绘图函数
第一节 低级绘图函数简介
如果说,高级绘图函数是武林高手的话,那么低级绘图函数就是他们的兵器,而且,一个显而易见的问题是,“武功再高,也怕菜刀!”没有兵器的帮助,再深厚的功力也难以发挥出来,而有一件趁手的兵器,往往问题解决起来,就会简单很多。R语言基础绘图包的武器库中,兵器琳琅满目,倘若你不会用,就算是倚天剑屠龙刀,那也不过是废铁一块。表2-1-1列出了R语言基础绘图包中的常见的低级绘图函数。
表2-1-1 低级绘图函数
低级绘图函数的叫法是相对于上一章介绍的高级绘图函数,之所以这么说,是因为这些函数本身并不具备图形绘制的能力。只有在使用高级绘图函数进行图形绘制以后,这些低级绘图函数才会起作用,而其所起作用的范围也仅限于当前绘制出的这一幅图形。举个例子,我们需要使用text()函数在图上添加文本,如果此时在R语言的绘图环境中不存在一张图,那么这个文本也就无从添加,就如同没有画布,何谈作画。
关于这些低级绘图函数的参数,请大家自行查阅相应的帮助文档。其中有部分函数在上一章中已经做了初步介绍。本章将注重于这些函数的用法,目的是让大家形成“抱团”的意识,即善于将高级绘图函数和低级绘图函数或者多个低级绘图函数搭配使用。因此,不再是单纯的介绍每一个独立的低级绘图函数,而是在不同的图形的绘制过程中,向大家讲解它们的用法。
第二节 坐标轴自定义及文本绘制
在上一章中,坐标轴并不是我们关注的重点,在默认情况下,R语言的高级绘图函数能够绘制出比例适宜的坐标轴,并且能够添加合适的坐标轴标签、刻度等元素。但是很多情况下,默认绘制的坐标轴难以满足我们的需求,所以,就需要利用低级绘图函数axis()对坐标轴进行自定义。下面的代码展示了axis()函数的使用。
图2-2-1 图形坐标轴的自定义
图2-2-1告诉我们如何将两张图叠加在一张图上,并且看起来不那么别扭。细心的读者肯定发现了,上图中两条曲线的纵坐标是一致的,只是坐标轴位置不同而已。如果我们需要不同的纵坐标该怎么办?下面介绍一下如何进一步自定义坐标轴。
图2-2-2 多种低级绘图函数的组合使用
图2-2-2中展示了多个低级绘图函数的用法,但是这张图并不美观。此处笔者将它们组合在一起的目的,纯粹是为了展示它们的用途和用法,如果从美观的角度来讲,需要修饰的地方还有很多,至少,x轴和y轴不能以不同的颜色显示。
第三节 图 例
在医学科技论文中,我们展示的数据往往不止一组,或者不止一个水平,比如同一种药物不同剂量组的疗效,男女在某个指标上的差异,不同年龄组在某个指标上的差异等。那么,为了更好地进行横向比较,往往将这些组的数据展示在同一张图上,就比如在上一章中出现的很多图形。在这种情况下,为了使读者能够更加清楚的了解图形所传达的统计信息,一个合适的图例显得极其重要。本小节将主要给读者介绍如何在R语言中利用低级绘图函数legend()绘制一个比例恰当、位置合适的图例。同样的,legend()函数的参数在此不再展示,请大家自行查阅帮助文档。关于legend()函数的用法将在以下图形的绘制中向大家展示。
见图2-3-1。
在上面的代码中,向大家展示了legend()函数的大部分参数的用法,还有两个参数未能展示出来,但是必须要跟大家交代一下,其一是x.intersp,其二是y.intersp。这两个参数十分相似,取值为数值,主要功能就是设置图例中不同图标间的间距,前者用于调整水平位置的间距,后者用于调整竖直位置的间距,数值越大,则间距越大。当图形中图例非常多时,为了使图形显得更加协调,这两个参数往往十分管用。
图2-3-1 图例的添加
第四节 添加文本
统计图形是以点线面为主体的,文本通常只会出现在坐标轴或者图形标题的位置,但是有些时候,我们同样需要在图形中添加文本,以对图形的结果进行进一步的解释,或者展示出图形无法反映出的信息,比如,在图中添加一个p值,以此反映两组数据之间的差异是否显著。这种情况下,就需要在图中合适的位置添加文本。
R语言中文本的添加依靠的是低级绘图函数text()和mtext()。前者可以在绘图区域内的任意位置添加文本,而后者只能在图形四周添加文本,该函数中的m代表的就是marginal(边缘)的意思。
下面的代码展示了如何在图中添加文本,与此同时,也顺带介绍了一下其他个别低级绘图函数的用法。
见图2-4-1。
图2-4-1 矩形切割与文本添加
在上图中,我们初次使用了text()这个低级绘图函数,见识到了它的灵活性,其实,text()的应用远不止于此。
text()前两个参数是位置参数,可接受向量,此处我们有20个条柱,所以,有20个坐标值,barcenter已经把每个条柱的中心横坐标存储了,我们把纵坐标定义为−2,虽然这里只是一个−2,但是根据向量匹配的原则,−2在这里自动被重复20次。所以,这里就说明我们将每一个文本的横坐标设置成条柱的中心,纵坐标设置成−2。注意一点,我们在绘制条形图时,限定了y轴的范围,即−5~100,这是为了给text留下空间,如果不限定,那么y轴将从0开始,我们设置的text就不会显示出来,因为−2在0下面,也就是超过了这块画布的边缘。
再来看下面这张图(图2-4-2)。
图2-4-2 在散点上添加文本
如果说上图是一张气泡图,读者们可能还不太服气,毕竟“颜值”太低呀。下一节中将介绍真正的气泡图如何绘制。
第五节 气 泡 图
气泡图其本质也是散点图,只不过我们将某些信息传达到散点上,让散点的大小或者颜色承载不同的统计信息。比如我们绘制一张我国各省份的人口散点图,河南省和上海市人口差异很大,如果用相同大小的散点表示,则显得很不专业,因此这时候就可以使用气泡图,以气泡的大小表示人口数的多少。
本小节要介绍的函数与气泡图有关,但是该函数又不仅仅可以绘制气泡图,它就是symbols()函数。
symbols()本身属于高级绘图函数,但是由于使用频率不高,所以我们将其放在此处进行讲解。其主要功能是用于在图上添加标记,可选的标记形状有: circles, squares, rectangles, stars, thermometers,以及 boxplots。默认标记是圆圈,因此我们可以借此来绘制气泡图。
该函数前两个参数分别是x,y,代表点的横纵坐标的位置,如果选择绘制圆圈,那么circles参数接受的就是圆圈的半径,可以接受一个向量,用于绘制不同大小的圆圈。inches参数比较重要,如果选择TRUE或者1(此两者等同),那么最大的圆环的半径将是1英寸,如果inches=2,则为2英寸。这种情况下,圆环通常会变得很大。为了协调,我们一般设置inches=FALSE,这样就能保证圆环的大小与坐标轴呈现和谐的状态了。见图2-5-1。
图2-5-1 利用symbols函数绘制气泡图
这张图看起来更像是气泡图了,但是还有一个问题,就是图中有很多点重叠了,如果能加上一点透明色就好了。既然能想到问题,那么解决问题自然也就不是难事了。在 DescTools包中,有个函数叫做PlotBubble(),专门用作气泡图的绘制。( DescTools包注重于描述性统计,因此该包中也有不少作图函数,有兴趣的读者可以自学一下)。见图2-5-2。
图2-5-2 为气泡图添加透明度
第六节 一页多图
在前面我们已经介绍过par()函数中的mfrow以及mfcol参数,它们专门用于切分画布,但是这两个参数只能用于等距离切割,也就是说,比如切成2×2田字形画布,每一块小画布都是同样大小的。现实中,有时候我们需要强调一些图,而弱化另外一些图,并同时将这些图放在一张画布中,这就需要layout()函数将画布进行不等面积切分了。
注意一下layout()函数的写法,第一个参数接受一个矩阵,如上代码所示,matrix(c(1,1,2,3),2,2),表示将画布切分为四个部分,2 行 2 列,第一块占据第一行,因为矩阵中1出现两次了。2,3 分别占据下面的一行的左半边和右半边。注意,函数的参数widths和heights,分别表示每一列的宽度,和每一行的高度,接受一个向量,比如,widths=c(3,1),表示第一列的宽度是第二列的3倍。这是一个相对的宽度和高度,也可以传入绝对的高度和宽度,比如widths = lcm(5),表示宽度为5cm。layout.show()函数用来展示画布切分的效果。
此处仅仅是一个画布切分后的展示,画布中并无任何图形,下面将展示如何把不同的统计图形填充到这个切分后的画布中去。
此处绘制了三幅图,其布局就是按照之前设计的画布进行排列的。见图2-6-1。
图2-6-1 使用不同的图形非等距填充画布
除了layout()能进行画布切分外,还有一个函数可以做相同的事情,它就是split.screen(),这个函数顾名思义,是用来切分屏幕的,由于跟layout()比较类似,在此就不再演示了,有兴趣的话,读者可以自己动手实践一下。
第七节 背景网格
接触过 ggplot2的人都知道,在默认情况下, ggplot2绘制出来的统计图形都有一个灰色的网格背景,在基础绘图包中,可以通过grid()函数实现网格背景的添加。grid()函数的参数如下:
参数解释:
1.nx,ny
表示横轴和纵轴方向,分别切分为n个均匀大小的格子。
2.col
设置网格线的颜色。
3.lty
设置网格线的样式,默认是点线。
4.lwd
设置网格线的粗细。
5.equilogs
逻辑参数,表示当坐标轴进行log变换,是否将网格线与坐标轴刻度对齐。
图2-7-1 在图形背景中添加网格
第八节 添加线条和散点
在一张图上展示多种线条和散点是我们在科研论文中最常见的一种形式。基础绘图包通常一次只能绘制一根线条(曲线或者直线),反映一种信息,显然这种做法无法满足我们的需要。那么,此时我们就可以借助基础绘图包中的lines()低级绘图函数来进行线条的添加,见图2-8-1。
图2-8-1 在图形中添加线条
在添加了一根线条外,我们依然可以使用相同的方法添加多根线条。除了添加线条外,在图上添加散点也是统计图形中常见的一种形式。points()函数专门用来添加不同样式的散点。图未展示。
第九节 数学表达式的添加
在医学科研论文中,数学表达式虽然不常见,但是有时候也会出现在论文插图中。与前文介绍的文本添加类似,数学表达式的添加也是利用text()函数完成,只不过我们需要用特殊的函数对数学表达式的内容进行处理,使其满足标准数学表达式的要求。下面的代码展示了如何在图中添加数学表达式,见图2-9-1。
图2-9-1 图形中添加数学表达式
上面的代码看似比较复杂,其实不然,比如hat()函数,它就是用来表示某个变量的预测值,bar()函数则是用来表示某个变量的平均值,这与我们所接触的数学表达习惯完全一致。
至此,R语言基础绘图包中的几种常见的低级绘图函数已经介绍完毕,大家记住一点,即低级绘图函数本身并不具备独立绘图功能,它们必须建立在已有的图形的基础上,才能发挥绘图的功能。