1785 阅读 2020-07-25 09:40:03 上传
以下文章来源于 奈提柯斯先生
R语言
Recap
散点图的绘制是在ggplot( )函数的基础上,加上geom_point( )函数即可。
通过使用shpae、size、color等参数可以让R自动针对分组进行颜色和形状的区分。
使用scale_x_reverse( )和scale_y_reverse( )函数可以将坐标轴进行位置调换。
R: The R Project for Statistical Computing
https://www.r-project.org/
IDE:
https://rstudio.com/
注:本文参考R Graphics Cookbook一书第四章与Discovering Statistics Using R第四章第九节
R Project
Linguistics
1
折线图概述
回忆一下中学生活在做一个个函数的时候,折线图(或曲线图)是我们最常见的函数图像,它可以生动地反映随x数据的增长y数据的变化。在ggplot( )函数中,我们可以添加geom_line( )从而实现折线图的绘制。同样的,我们先使用R语言内置的数据进行基础折线图的绘制。这次我们使用BOD数据,可以看到这个数据组只有两列数据,那么我们可以直接以Time为x轴,demand为y轴,作出如下图的折线图。
基本折线图
仔细观察我们做出来的折线图,不难发现它的y轴根据我们数据的最小值和最大值进行了变更。有时候我们需要一个“完整”的y轴,想自己对它的最小值和最大值进行设定,那么我们可以采用xlim( )和ylim( )对坐标轴的数值范围进行更改。比如,我们让y轴的最小值变为0,最大值变为25,那么我们使用ylim(0, 25)就可以进行更改了。
更改坐标轴范围
有人会想说,我想要数据点展示在这个折线上,是不是采用geom_point( )就可以了?没错!回想一下我们R绘制图表介绍中所讲的,它其实是一个个图层的叠加,因此我们直接添加这个geom_point( )叠加上去即可。而我们的geom_line( )函数是依据数据x轴从左到右的大小顺序进行连线,因此不用担心它会连错位置。但是有的研究可能就需要“乱连”,比如某语言的接触过程,在使用ggplot2包中的地图进行路径绘制的时候,肯定不全是从左往右的顺序依次连接,很有可能会路径乱跳,这时候我们就需要其他函数,如geom_path( ),这个我们之后再谈。
带数据点的折线图
既然一个图里可以画一个折线,那么肯定也可以画多个折线,这个在我们之前ggplot2图包讲解示例中曾经介绍过,与散点图一样,直接使用size、color等来区分不同的数据即可。为了实验,我们可以借助plyr包中的ToothGrowth数据进行分析。因为ToothGrowth中的数据并不是线性关系,因此我们需要进行数据整理,这里我们直接食用plyr包中的ddply( )函数,它可以一次性地完成对数据框的拆分、函数运算、重新整合的步骤。我们首先观察下ToothGrowth中的数据。
ToothGrowth数据
我们对这个数据框中的supp和dose的每行数据都使用summarise( )函数,对len数据使用mean( )函数,这样我们就可以得到一个新的数据框。然后,根据我们散点图的经验,我以supp为不同的分组,我可以使用linetype来区分,也可以使用color来区分,从而描绘dose和len的折线图,得到的结果正如我们所想。
颜色分组的折线图
至此,我们就完成了对折线图中最基本对数据操作,同样的,折线图还有很多内容我们尚未开发,这留待以后学到统计方面的内容后进行统一解释。下面我们以声调为例,来尝试作出双字调的声调图。
R Project
Linguistics
2
声调曲线示例
我们在之前的图像初阶的介绍中,曾经使用散点图画出了语调的趋势,现在我们回顾一下做法。首先,我们的声调、语调等基频数据,因为采集点的原因,都是属于wide format的数据,因此为了方便进行绘图制作,我们需要把它们转变为long format,可以使用以前我们介绍的reshape2包,然后将其中的字符串们变为factor,这样R就会自动帮我们分门别类,如,让它了解到我们的数据中有少个男性,多少个女性,或者多少个targets。
wide format数据
整理好数据后,我们就可以画图了。既然我们这次变为折线图,带数据点,那么我们就可以直接在原来的基础上加上geom_line( )函数就行,这就是我们之前画的语调的图。
图形初阶中介绍的图
那么我们可以如法炮制出声调曲线图。为了方便,我这次使用的声调数据依旧是半音值数据,而没有转换为五度值或z-score (LZ)。那么顺序一样,我们首先加载数据,对数据进行整理,设定好需要的因子。比如我考察了不同性别读四种双音节词的声调情况,那么我需要把性别和四类双音节词变为factor,好让R进行汇总,然后我们就可以画出对应的图了。
带数据点的折线图
画出来后我们发现,好像和我们想象的有点不一样。我们的双字组声调,应当是分开的,怎么把我两个字的都连在一起了呢?其实这和我们数据读取有关,我们返回去看一看read.table( )函数的设定。
read.table( )函数
仔细观察我们可以看到,在该函数中,有一个blank.lines.skip参数,它的意思是读取时是否要跳过空白行,默认是TRUE,也就是说默认跳过空白行。很显然,我们的声调数据中,空白行的作用就像是分开不同的词,因此,我们必须要保留,那么我们就需要在读取的时候设定好blank.lines.skip=FALSE就好了,然后我们来继续重新走一遍程序,看能不能实现两个字分开的声调曲线图。
设定blank.lines.skip=FALSE
奇怪的事情发生了:我们明明设置好不要跳过空白行,为什么最后画出来的图还是没有空隙呢?代码并没有报错,说明不是代码的问题。这时候我们返回查验数据,我们可以看到,我们一般在设置的时候,并不会给空白列设置一个列名称。而对于程序语言来说,只有告诉了它名字,它才会知道这是在做什么。因此,我们需要按顺序把空白行也设置好名字,这样在画图的时候,说起来是跳过了这个空白段,其实是让ggplot( )函数按照顺序“画”了空白段,而在观感上就像是跳过一样。
给空白列按顺序标签
这下我们再跑一次程序,可以看到声调图被完美地画了出来。同样的,我们可以画出类似的语调图。保存我们写好的脚本,在这之后你的研究中,肯定会遇到这些因素下的声调、语调作图情况,直接运行脚本,让电脑为你完成一切,你会感觉到做科研原来是这么有趣。
声调曲线图