上QQ阅读APP看书,第一时间看更新
第一篇 R语言基础绘图系统
第一章 基础绘图包之高级绘图函数
R语言有强大的绘图系统,数据可视化一直是R语言独步江湖的强大杀招。与R语言美轮美奂,妙不可言的绘图相比,其他常用的统计软件,比如SPSS和SAS,在统计绘图方面则显得相形见绌。Python作为当下非常流行的一种通用计算机编程语言,在统计绘图方面也在向R语言学习。
R语言至今已拥有超过13 000个扩展包(packages),大部分能在CRAN(comprehensive R archive network,https://cran.r-project.org/)上找到,小部分还未正式发布,托管在Github上或者RForge(https://r-forge.r-project.org/)上。在这些扩展包中,专门用作数据可视化的包不下100个,而各种形形色色的包,多少都会自带一些绘图函数,以满足自身“特异性”的数据可视化的需要,比如用于量化金融的 quantmod包,就有专门用于绘制股票走向的蜡烛图函数。
在众多绘图包中, ggplot2是当之无愧的“武林盟主”!曾有人断言, ggplot2的出现,将统计绘图提升了一个档次,到了一个全新的境界。而依托 ggplot2开发的绘图包也超过20个,且个个都能独当一面,成为各领域数据可视化的翘楚!比如香港大学余光创博士开发的 ggtree包,专门用来绘制各式各样的进化树。
随着R语言的不断发展与普及,各种优秀的绘图包如雨后春笋般不断涌现,但是,任凭风起云涌,沧海桑田,R语言基础绘图包的“江湖地位”一直不可动摇。基础绘图包并不是单独指某一个包,而是由几个R包联合起来的一个“联盟”,比如 graphics、 grDevices等。这些包在我们第一次装载R语言时就会被自动下载,因此无需手动下载,而且在初次使用的时候,也无需使用library()函数对其进行加载。曾几何时,这个联盟也是独领风骚,好不风光!时至今日,面对众多俊俏后生,基础绘图包更像是一个看惯了世事纷争,看淡了潮起潮落的老者,老成持重的守着自己的一方土地。
第一节 par()函数详解
一、par()函数简介
为什么一开始就介绍par()函数,而不是基础绘图包中的绘图函数?笔者认为基础绘图包之所以能够很好的完成绝大多数的数据可视化任务,最主要的原因就是其强大而深厚的“内功”——par()函数!
par是英文单词parameters的简写,即参数,简而言之,这是一个专门用来设置绘图参数的函数!何为参数?参数是一个函数的肉体,没有参数,函数体则没有相应的输入值,函数也就无从运算;参数同样是一个函数的灵魂,没有参数,函数会一成不变,无法做到灵活运用。我们在实际应用中,通过改变参数的传入值,得到不同的结果。更多关于参数的内容,在接下来的章节中,大家会大量的接触到,所以,其真正的含义,大家会逐渐明晰。
我们的第一步任务就是要了解和熟悉par()函数的参数,请首先打开R Gui或者Rstudio,在控制台键入:
Rstudio会弹出一个帮助窗口(如果是R Gui,则会弹出一个网页窗口),一般在电脑屏幕的右下角。par()函数参数众多,功能不一,但是笔者认为其中能经常使用到的,或者说对我们的统计图形能够起到本质改变作用的也就20个左右。若能把这20个参数熟练掌握也就可以了,其余的呢,在遇到不同的数据可视化需求时,再来现学也不迟。另外,par()函数以及接下来介绍的其他函数,只要属于基础绘图包,在开启R之后,是无需加载扩展包的,直接可以使用。
二、par()函数参数介绍
par()函数目前大概有60多个参数,但是此处只选取其中大约20个较为常用的参数进行详解。其余的参数,请读者朋友自行翻阅帮助文档。
1.adj
英文单词adjustment的简写,用于调整图中字符的相对位置,属于微调。取值:adj = c(x,y),表示字符边界矩形框的左下角相对坐标点(x,y)的位置调整。注意,此参数目的是图形微调,所以x和y的取值一般不会超过1,取值过大的话,容易导致图形元素超过图形边界,从而无法在图片上显示。
2.ask
逻辑参数,取值TRUE或FALSE。在没有事先将画布切分成若干小区域,但是又同时画了好几张图时,R默认是一张画布只显示一张图,当ask=FALSE时,所有的图都会在Rstudio的绘图窗口一闪而过,所以为了清楚的展示每一张图,请把ask设置为TRUE,这时候,R会弹出一条信息,中文大意是“第一张图看好了么?要不要切换到下一张,要的话,请按enter键”。当按下enter键后,第二张图就会显示出来。
3.bg
颜色参数,用于设置绘图区域的背景色。
4.bty
设置图形边框样式,默认绘制图形四周边框,状似一个“口”字,此外,R 提供了其他备选项:“o,l,7,c,u,]”。这些字符看似乱七八糟,但是有规律可循。请发挥你的想象力,字母o像什么?不就像“口”字吗?所以,这是默认参数,图形四个边框都显示。以此类推,字母l,就是‘L’,表示只显示下方和左边的框。注意,bty参数并不能将x轴和y轴去除,比如将bty设置成“7”,虽然数字7表示只绘制上方和右边的边框,但是此时x轴和y轴并不会消失。如果需要自定义坐标轴,则需要使用其他参数和函数,见下文。见图1-1-1。
5.cex
该参数用来设置图上的元素,比如文字或者符号的缩放倍数,接受的值是一个正数,默认为1,当设置成1.5时,则表示图形上的元素为默认的1.5倍大小。
图1-1-1 六种不同的图形边框样式
由该参数衍生出了四个参数,分别是cex.lab;cex.main;cex.sub;cex.axis。分别表示坐标轴标签、图形标题、副标题以及坐标轴刻度标签的缩放倍数。
6.col
颜色参数,设置图中元素的颜色。具体见第三章颜色详解。它也有四个衍生参数,分别是col.lab;col.main;col.sub;col.axis。意思同上文。
7.family
设置图中文本的字体参数。该参数不仅适用于英文字体的设置,同样适用于中文字体。默认取值有:‘serif’,‘sans’,‘mono’,‘symbol’,见图1-1-2。关于更多字体设置的内容,请见第四章。
图1-1-2 添加图形标题并设置标题字体
8.font
设置文本的字体样式,取值为1、2、3、4,分别表示正常、粗体、斜体、粗斜体。
9.las
该参数用于设置坐标轴刻度标签的样式,取值0、1、2、3,分别表示:总是平行于坐标轴;总是水平;总是垂直于坐标轴;总是垂直。见图1-1-3。
图1-1-3 四种不同的坐标轴标签样式
10.lty
设置线条样式,取值 0、1、2、3、4、5、6,分别表示:不划线;实线;虚线;点线;点划线;长划线;点长划线。见图1-1-4。
11.lwd
设置线条宽度,默认取值为1,用法类似于cex参数。注意一点,当在par()函数中使用lwd参数时,图形中的所有元素,比如线条、坐标轴以及图形边框的线条宽度均会改变。见图1-1-4。如果只需要图形中的线条宽度发生改变,则需要将lwd参数放到绘图函数中。
12.mar,mai
这两个参数均用来设置图形边界空白宽度,接受一个含有4个元素的数值向量,分别对应图形下,左,上,右的边界宽度。前者默认取值是 c(5,4,4,2)+ 0.1,取值单位是线条宽度(line width);后者取值单位是英寸。这两个参数用于控制绘图面积的大小。
13.mfrow,mfcol
画布切割参数,取值为 mfrow = c(nrow,mcol),表示将画布切分为n行m列。mfcol与mfrow类似。
14.mgp
设置坐标轴到画布边缘的宽度,取值为 mgp = c(x,y,z),默认为mgp=c(3,1,0),分别表示坐标轴标题、坐标轴刻度标签、坐标轴线与图形的距离。
图1-1-4 六种不同的线条样式及线条的宽度
15.pch
设置点的形状。数字1至25分别代表25种不同的点的形状,其中实心点(15~20号点型)是可以有背景色填充的。见图1-1-5。
图1-1-5 R语言中内置的25种点型
16.srt
该参数用来控制图形中字符串的旋转角度。常规取值为−360~360,也就是一个角度值,但是该参数也可以接受不在此范围内的数值,比如−720,不过这种取值没有意义。
17.tck,tcl
这两个参数都表示坐标轴刻度线的高度,前者取值是与图形宽度和高度的比例值(取值−1~1之间),后者取值是与文本行高的比例值。负值表示坐标轴刻度向外,正值表示向内。
18.usr
该参数用于限定画布的大小,取值为 usr=c(x1,x2,y1,y2),分别表示图形x轴的左、右极限,y轴的下、上极限,即一个矩形区域。如果坐标轴进行了log变换,那么usr参数的实际值就是相应参数的10次幂。具体用法详见第二章。
19.xaxt,yaxt
设置坐标轴样式,默认是“s”,即标准样式。如果不需要坐标轴,或者是需要自定义坐标轴,那么此处可以设置为“n”,即表示不绘制坐标轴的刻度和刻度标签,但是仍然会绘制一条刻度线。
20.xlog,ylog
顾名思义,坐标轴取值的log转换参数,默认是FALSE。
21.fig
该参数接受一个数值向量,取值为 fig = c(x1,x2,y1,y2),该参数往往配合new=TRUE参数使用,用于在当前图形上添加一幅新的图形。见图1-1-6。
图1-1-6 在当前图形中添加一幅新的图形
22.xpd
该参数用于设置绘图区域的大小,取值为TRUE,FALSE或者NA。当取值为FALSE时,表示将绘图区域限定在默认的绘图区域内;当取值为TRUE时,表示将绘图区域限定为默认的图形区域;当取值为NA时,表示将绘图区域限定为默认的设备区域。见图1-1-7。
图1-1-7 绘图时的三大区域
设备区域可以看成是Rstudio中的Plots窗口的面积,图形区域是指图形的“占地面积”,绘图区域是指图形中点、线、条柱等元素所占的面积,所以图形区域包括绘图区域。图形中的坐标轴或者图形标题等元素就是出现在图形区域中,而非绘图区域。xpd参数的作用就在于事先设定绘图区域的大小,这有助于我们在绘图区域外的部分添加额外的内容,比如:
图1-1-8 定义绘图区域
利用这一特性,我们就可以轻松绘制出医学科研论文中常见的“版面图”(panel plot),即一张画布上分布多张图形,而不需要再借助其他软件进行图形拼接了。
以上22个参数,都是par()函数中较为常用的。其中大部分参数可以直接在高级绘图函数中使用,效果等同于在par()中使用,而有一些参数只能在par()中使用。下面列出的参数只能在par()中设置和实现,在高级绘图函数中无法实现其功能。
此外,有一点非常值得注意,par()函数对于图形参数的改变是永久性的,这是什么意思呢?意思是说,当你打开R,直至R关闭,par()函数中的参数对你所绘制的每张图都管用。但是现实情况是,我们有时候只需要一次调用par(),而不希望它一直工作。此时,有两个方法:其一,在作图之前,将par()函数中的所有参数保存为一个实名对象,等到图形绘制完毕,将这个实名对象释放出来即可;其二,图形绘制完毕后,直接调用dev.off()函数关闭绘图框,这样就不会影响下一幅图了。方法一如代码所示:
第二节 plot()函数
在医学科研论文中,我们常见的统计图形可以概括为以下几种:散点图、直方图、条形图、线图、盒形图、饼图。这几种图形是医学统计图形的基础,更复杂的图形也是在它们的基础之上搭建的。因此,要想完成一幅精美的且包含较多信息的统计图形,必须先对最基础的几种图形有所了解。R语言的基础绘图包中,提供了针对这些基础图形的绘制函数,并且由于有par()函数的存在,我们可以自定义许多不同形式的统计图形,以满足我们的科研需要。
plot()函数本身并不是一个特型函数,而是一个泛型函数(generic method)。对于不同的数据,它可以绘制出不同的图形,比如对于连续型数据,可以绘制出散点图;对于分类数据,可以绘制出盒形图。更宽泛的,对于一些统计模型,比如生存分析模型,我们可以使用plot()绘制出相应的生存曲线。由于盒形图、直方图有专门的函数进行绘制,故在此只介绍最简单的散点图的绘制方法。
plot()函数的使用频率非常高,无论是早期的数据探索,还是最后的数据呈现,都能用到它。读者在帮助文档中查看该函数时,会发现它的参数非常少,这是因为par()的绝大部分参数在plot()中也是通用的。读者在上一节中所看到的许多图形,也是由plot()函数实现的,所以关于plot()的用法在此处不再赘述。但是,有一个参数需要介绍一下,那就是type,该参数表示所绘制散点图的类型,下面的代码展示了较为常用的6种类型,其中“p”表示绘制散点;“b”表示点连线;“l”表示绘制线图;“s”表示绘制阶梯;“o”表示绘制点连线,此处线条穿过每一个点,与“b”类型稍有不同;“n”表示不绘制任何图形元素。见图1-2-1。
图1-2-1 六种常用的图形元素样式
除此之外,与使用main参数定义图形标题类似,plot()函数也可以使用参数来自定义横轴和纵轴的标签。这对于基础绘图包的其他高级绘图函数也是通用的。
另外,可以通过设置参数axes=FALSE,使图形不显示坐标轴,从而可以进一步使用低级绘图函数axis()自定义坐标轴,详见第二章内容。xlim和ylim参数是用来限制坐标轴的取值范围的,该参数接受一个向量,即xlim = c(a,b),此处a和b分别表示坐标轴的起始和终止的坐标。有时候,我们会遇到这样的问题,即运行一段画图代码后,R抛出一个错误,“Figure margins too large”,即图形太大,换句话说就是画布太小了,这个时候一般有三种解决办法:第一种就是使用xlim和ylim参数重新设置坐标轴的取值范围,使其到一个合理的范围;第二种是放大Rstudio中的作图框;第三种是最实用、最值得推荐的方法,卖个关子,后面再说。
第三节 盒 形 图
盒形图,顾名思义,外形像个盒子,“颜值”算不上高,但是盒形图能够通过中位数和四分位数间距展示出数据分布的大致特征,也能够显示出异常值、离群点,因此,可以使用盒形图进行数据初步探索以及展示数据的集中趋势。R语言中使用boxplot()函数进行盒形图的绘制,下面我们首先认识一下boxplot()函数的参数:
上面是盒形图的一些基本参数,从R语言给出的帮助文档可以看出,盒形图有两种绘制方式,第一种:公式法(即y~x的形式);第二种:数值法。
先介绍最简单的数值法。所谓数值法,即直接传入一组数据(通常是一个连续型变量)进去绘图,这种情况很简单,无非就是为了观察一下这组数据的集中趋势和离散趋势。
公式法稍微复杂一点儿,但是用途也更加广泛,因为公式的基本形式是y~x,所以,需要传入两个变量,很明显,y是连续型变量,而x是分类变量(在R语言中分类变量通常称为因子变量,即factor)。下面结合图形的绘制,对一些重要的参数进行解释。
1.range
范围参数,即盒形图触须线的延伸范围,取值为正数。什么是触须线呢?如图1-3-1所示,蓝色矩形(box)中的黑色粗线条表示数据的中位数,矩形的上下边框表示数据的上下四分位数,随着虚线延伸出去的两条横线就是触须线,用来表示数据本体的最大值和最小值。数据本体是指去除离散值和异常值之后的数据(当然,此处离散值或异常值是由计算机自己定义的,并非人为定义的)。
图1-3-1 设置不同的触须线宽度
2.width
设置box的相对宽度。注意与boxwex参数进行区别。
3.boxwex
设置box的宽度,取值越大,盒子越宽。
4.outline
逻辑参数,是否绘制离群点,默认是TRUE,即绘制离群点。
5.notch
逻辑参数,是否使用卡槽。默认是FALSE。
6.names
盒形图中各个box的标签,注意,不是该盒形图的标题。
7.horizontal
逻辑参数,是否横向放置盒形图。默认是FALSE,即纵向放置盒形图。
8.add
逻辑参数,是否将盒形图添加到现有的图形上。
9.at
配合add参数使用,定义该盒形图的横坐标位置。
以上参数大多很简单,在下面这两幅图的绘制过程中,大家会逐一认识到它们的用法。
见图1-3-2。
见图1-3-3。
图1-3-2 不同剂量的VC补充剂下小鼠的牙齿生长长度
图1-3-3 不同剂量的两种补充剂对小鼠牙齿生长影响的比较
可以发现,图1-3-3中展示了三种不同的VC剂量,即0.5,1.0,2.0,并且展示了两种不同的VC补充剂,分别用黄色和橙色表示。图很完美,但是缺少一个很重要的元素,就是图例(legend)。
基础绘图包中的图例添加有两种方法:第一,直接在高级绘图函数中添加legend参数;第二,使用legend()函数,该函数是低级绘图函数,更加灵活,详见第二章。
有时候,当我们在绘制盒形图时,会发现需要额外突出某些组,而其他组是不需要进行突出的,比如,分析一组临床随机对照试验的数据,其中有实验组,阳性对照组以及阴性对照组,绘图时需要额外突出两个对照组的值,也就是用不同的颜色将这两组的盒子凸现出来,这时候该怎么做呢?见图1-3-4。
图1-3-4 在对照组中凸显出阳性和阴性实验组
至此我们已经画了很多张盒形图,有一个特点不知道读者有没有发现,即所有盒形图的x轴都是按照标签的首字母顺序排序的。有时候,当你需要根据其他指标进行排序,比如根据每个盒子中位数的大小,该怎么办呢?我们依旧用图1-3-4的数据进行演示。
图1-3-5中的所有box就是按照该组中位数的大小进行排序的,我们可以从此图中十分清楚的看出各组数据分布的集中趋势的不同。
图1-3-5 按照中位数大小排序的盒形图
关于盒形图的内容就介绍这么多,下面给读者简单介绍一下计算机中如何产生随机数以及随机数种子的作用。众所周知,随机数或者随机事件最大的特点就是不确定性,在随机事件发生之前,我们难以准确预测它的结果。在计算机中,随处可见随机数的应用,但是无论计算机产生的随机数看起来是多么的随机,多么的没有规律,它们也不是真正的随机数,这是因为在计算机中产生随机数依靠的是某个事先写好的算法,既然算法是不变的,那么随机数的产生也就是确定的、可以预见的,所以我们往往称计算机中的随机数为“伪随机数”。这也就是为什么设置相同的随机数种子,会产生相同的随机数的原因了。“伪随机数”虽然并不是真的随机数,但是由于存在可重复性,也给我们的工作带来了一定的方便。
第四节 条形图和误差条图
条形图在统计学中应用比较广泛,在医学科技论文中也屡见不鲜,它可以用来清晰的反映同一分类变量中不同水平的取值,或者反映不同分类变量的取值(或者计数),也可用于初期数据的探索。R语言中利用barplot()函数进行条形图的绘制,该函数的具体参数如下:
重要参数解释及基本用法:
1.height
顾名思义,该参数指定了条形的高度,这个参数接受一个数值向量或者一个数值矩阵。
图1-4-1 三种药物在不同剂量下的疗效比较
如果height接受一个向量,绘制的则是单组条形图,即一个变量仅有一个数值;图1-4-1是多组条形图,即同一个变量对应不止一个数值。绘制图形的代码很简单,重点在于大家必须要牢记barplot()函数接受的数据格式是矩阵,而非数据框,因此在绘图之前,重要的一步就是将目标数据以矩阵的形式存储,而变量名可以作为矩阵的列名传入绘图函数。为了加深印象,大家可以分别尝试一下传入数据框时的情形,也可以尝试一下将变量名作为矩阵的行名称时的情形。
同样的问题是,这个图缺少一个图例。如果你在barplot()中添加一个legend=TRUE的参数,R会自动给出一个图例,但是自动添加的图例往往不能满足我们的需求,因为legend参数不能自定义图例出现的位置,因此很多时候会导致图例与图形重叠了或者位置不协调,这个时候,你就会认识到legend()函数是多么的重要了。
2.width
设置条柱的宽度,默认是1。注意该参数应该接受一个数值向量,假如图中有3个条柱,则该参数的长度为3,分别设置每个条柱的宽度。若仅仅传入一个数值,则该参数不起作用。
3.space
设置条柱之间的间隔。
4.names.arg
设置条形图的标签,即自定义每个条带的名称。
5.horiz
逻辑参数,是否使用水平条柱。
6.plot
逻辑参数,是否画图。
7.add
逻辑参数,是否将条形图添加到现有的图形上。
下面的代码展示了上述一些参数的用法:
上述代码产生的四张条形图分别位于图1-4-2的左上、右上、左下和右下方。
在我们的印象中,条形图仅有一个光秃秃的条柱似乎不太能说明问题,因此,加上一个误差条(error bar),让普通条图变成误差条图很有必要。但是,基础绘图包中,没有专门的函数进行误差条图的绘制,必须手动操作。下面的代码展示了如何在条形图中添加误差条。
图1-4-2 四种不同样式的条形图
图1-4-3虽然添加了误差条,但是整体图形并不美观,因此在此基础之上还需要进一步修饰。
图1-4-3 在条形图中添加误差条
除此之外,我们也可以自定义一个函数,来添加误差条。见图1-4-4。
代码其实很好理解,如果看不懂,建议先参考aggregate()函数的用法,这是一个非常实用的汇总函数。
图1-4-4 使用自定义函数绘制误差条
第五节 直方图和金字塔图
一、常规直方图绘制
直方图是一种常见的统计图形,它虽然也是条柱,但是跟条形图存在一个本质区别,即直方图针对的是连续型数据,而条形图针对的是离散型的数据。我们不仅可以利用直方图展示数据的分布,也可以用直方图对数据进行初探,比如初步观测一组数据是否满足正态分布或者近似正态分布。R语言中,hist()函数用于直方图的绘制,其参数如下:
上面大多数参数在前文都介绍过,比如main,xlim等,就不再赘述了。在此仅仅介绍直方图独有的几个参数。
1.breaks
截断参数。该参数接受一个数值向量,表示直方图具体的区间范围,比如0~10作为一组,11~20作为一组;或者接受一个数值,比如10,表示将原始数据均分成十组。显然,前者更加灵活,在实际应用中也使用的更多。
2.freq
逻辑参数,表示是否显示频数,默认是TRUE。如果设置成FALSE,则生成概率密度图。
3.include.lowest
逻辑参数,表示是否包括最小值,这个参数是配合breaks参数使用的。例如0~10,是否包括左边的0。
4.right
逻辑参数,是否包括右侧值(即最大值),意思同include.lowest。
5.density
是否添加条图中的斜线(shading lines),注意不是添加密度曲线!
6.angle
shading lines的斜率,默认45度。
下面的代码展示了如何利用上述参数进行直方图的绘制(见图1-5-1):
图1-5-1 直方图与概率密度图
上图中为大家展示的五个直方图各有不同,希望大家注意其中的细微差别。
二、直方图的叠加
下面我们绘制一张叠加直方图。本小节我们使用泰坦尼克号沉船数据。泰坦尼克号沉没在冰冷的大西洋中,造就了Jack和Rose的凄美爱情,也造就了一个被广泛使用的数据集,叫做titanic,这是R的内置数据集,并非完整的数据,如果你需要完整的数据集,可先下载 effects扩展包,该包中存在一个名为TitanicSurvival的数据集。
泰坦尼克是当时的一艘巨轮,轮船上乘客的年龄分布十分广泛,生存率各有不同,我们现在想看看,随着年龄的变化,生存率有什么变化。此处我们把年龄作为连续型变量。见图1-5-2。
图1-5-2 泰坦尼克号不同年龄乘客的死亡与生存直方图
这张图很好地展示了不同年龄的生存与死亡的占比。橘黄色表示死亡,蓝色表示生存,当然,如前所述,这张图还缺少一个图例。
三、背靠背直方图
除了上面展示的叠加直方图能够同时展示多种数据信息外,我们还可以使用背靠背直方图做到同样的事情。下面的代码展示了如何绘制背靠背直方图(back to back histogram),见图1-5-3。
图1-5-3 背靠背直方图
四、金字塔图和镜面图
金字塔图较多的用来表示某个国家或地区的人口结构。在 DescTools 包中提供了一个名为PlotPyramid()的函数,该函数可以绘制另外一种更为常见的背靠背直方图,即金字塔图。注意,使用 DescTools包之前,需要事先从CRAN上下载并加载它。
PlotPyramid()函数的代码如下:
参数解释:
1.lx
接受一个数值向量或者一个矩阵;当lx为一个向量时,则该向量用来绘制左半边的条形图或者直方图;当为一个矩阵时,该矩阵的第一列数据用来绘制左半边的图,第二列用来绘制右半边的图,而其他列(假如存在其他列)则被自动忽略了。
2.rx
当lx接受一个矩阵时,该参数自动被忽略;当lx为一个数值向量时,则rx接受一个相同长度的数值向量,用来绘制右半边的图。
3.ylab
y轴的标签,接受一个字符串向量。
4.ylab.x
y轴标签的位置参数,默认为0,即标签位于x = 0的位置,也就是图的正中间。
5.col
颜色参数,接受一个含有2个颜色值的向量,分别表示左右半边图的颜色。
6.border
设置图形的边框,当不需要边框时,设置border = NA。
7.main
设置图形标题。
8.lxlab,rxlab
设置左右两张图的x轴标签。
9.gapwidth
设置左右两张图之间的间距,设置为0时,则没有任何间隙。
10.xaxt
是否绘制x轴,设置为“n”时,则不绘制x轴。
11.args.grid
用于绘制背景网格,当设置为NA时,则无网格背景。
12.cex.
用于设置坐标轴,坐标轴标签,标题字体的大小。
13.…
缺省参数。表示该函数还可以接受其他函数的一些参数,比如barplot()的space参数,用于定义每个条柱左边的空隙。
下面的代码展示了如何绘制金字塔图:
图1-5-4 不同样式的金字塔图
既然提到背靠背的直方图,与它很相似的另外一种图,也有必要提一下,那就是镜面图(mirror plot)。镜面图与前文介绍的背靠背直方图十分类似,只不过镜面图展示的是概率密度曲线或者其他曲线,而非条柱。
图1-5-5 镜面图的绘制
第六节 饼 图
饼图虽然用的不多,但是在展示分类数据的占比情况时,也是个不错的选择。R语言中使用pie()函数进行饼图的绘制。下面是pie()函数的参数。
简单看一下pie()的参数:
1.x
非负数值向量,用于绘制占比情形。
2.labels
每一个数值所对应的标签,接受字符串向量。
3.edges
饼图边缘的圆滑程度,取值越大,圆滑程度越高,这个参数一般不需改变。
4.radius
饼图的半径,视你的图形大小而定,默认是0.8。
5.clockwise
逻辑参数,用于确定数值是否采用顺时针方向绘制对应扇形,默认是FALSE。
下面的代码展示了某家医院一周内急诊入院的疾病类型(图1-6-1)。
图1-6-1 某家医院一周急诊入院诊断分布图
基础绘图包中的pie()函数能力较为有限,如果需要更多更灵活的展示,比如玫瑰图,最终还是要依赖于 ggplot2。
第七节 克利夫兰点图
克利夫兰点图,本质上也是散点图,但是其功能与条形图类似,它通过散点的位置来展示数据的大小。至于其展示形式跟普通的散点图有什么区别,马上你就知道了。R语言中使用dotchart()绘制克利夫兰点图,其参数如下:
解释一下几个重要的参数。
1.x
接受一个向量或者矩阵。
2.labels
设置标签。
3.groups
x的分组情况,如果x是一个矩阵,那么groups自动默认为该矩阵的列。
4.gdata
每个组的值,这个值通常是一个汇总值,比如均值或者中位数。
5.cex,pt.cex
这两个参数都是用来设置大小的,前者用于字符的设置,后者用于图中元素的设置,相当于plot()函数中的cex参数。
6.color,gcolor,lcolor
三者都是颜色参数,第一个用于设置图中点和标签的颜色;第二个用于设置组的标签和值的颜色;第三个用于设置图中水平线的颜色。
图1-7-1一目了然地展示了美国弗吉尼亚州1940年不同地区,不同年龄组人群的死亡率情况。
图1-7-1 利用分组数据绘制克利夫兰点图
第八节 条 件 图
coplot()是condition plot的缩写,顾名思义,该函数用于绘制条件图,简单地说,条件图是建立在某个变量的基础上,图形随着该变量的变化而变化。coplot()函数的参数如下:
参数解释:
1.formula
传入一个公式。此处的公式与R基础包中的其他函数所要求的公式格式相同。一般形式为y~x,左边是因变量,右边是自变量。那么条件绘图的条件体现在哪儿呢?把这个公式稍微改造一下,y~x|a,注意,添加了一个管道符。这个公式的意思就是在变量“a”存在的情况下,y随着x变化而变化,这就是条件的意思。此外,还有多重条件的公式,写法为:y~x|a*b,即表示在变量“a”和“b”共同作用的条件下,y随着x的变化情况。
2.data
传入一个数据框,当然,不能随便传入一个数据框,这个数据框必须包含你所写的公式中的x,y,a等变量。
3.given.values
该参数硬翻译过来的意思就是“给定的值”。但是读者可能不明白这个给定的值是什么意思,到底给定的是谁的值?具体见例子。
4.panel
面板函数参数,接受一个函数名称,注意不需要字符串,默认是points,表示在图上画散点,也可以改成hist,或者barplot等。
5.rows,columns
行列参数,接受一个数值,表示如何分割画布。
下面我们利用R语言的内置数据集quakes绘制条件图。
该数据集共有五个变量,我们选择了前三个lat,long,depth,分别表示经纬度和震源深度。此处,我们想看看在不同的震源深度下,经纬度如何分布的。代码如下:
首先我们定义given.values参数,运用的是co.intervals()函数,将震源深度分成四组,且每一组之间不存在重叠,overlap可以设置成0~1之间的任意数字,表示叠加程度。然后进行绘图。我们定义了一个panel函数,注意此处的写法。同样的,如果是用hist,写法应该是panel=function(x,y,…)hist(x,…)。三个点“…”表示缺省参数,因为hist()中有很多参数,不可能一一列出,所以,采用“…”表示。见图1-8-1。
至此,R语言基础绘图包中的几种最主要的绘图函数已经介绍完毕了。通过本章节的学习,相信大家已经认识到了R语言绘图的灵活与强大。更重要的一点是,正所谓“孤木难成林”,在本章节的图形绘制中,很多图形涉及的并非一个单一的绘图函数,而是几个高级绘图函数或者高级绘图函数配合低级绘图函数一起使用,而且,但凡涉及图形的修饰,总是离不开低级绘图函数的使用,所以,在介绍完高级绘图函数后,R语言基础绘图包中的低级绘图函数也必须要向大家着重介绍一下。只有将两者完美结合起来,才能使我们的统计图形看起来更加专业。
图1-8-1 经纬度随着震源深度改变的条件图