R语言 | 可视化番外篇:柱状堆积图
R语言
语言学与R语言的碰撞
Xu & Yang
PhoneticSan
学习参考
Discovering Statistics Using R
Statistics for Linguistics with R
How to Do Linguistics with R
R in Action
Analyzing Linguistic Data
R Graphics Cookbook
··· ···
Recap
条形图的绘制是在ggplot( )函数的基础上,加上geom_bar( )函数或geom_col( )函数实现的。
通过函数geom_text( )可以在条形图上添加数值,让百分比数据一目了然。
R: The R Project for Statistical Computing
https://www.r-project.org/
RStudio:
https://rstudio.com/
*本文由“汉娜努力多锻炼”撰写分享,特此感谢。
R Project
Linguistics
1
堆积图绘制
在前面的文章“条形图入门与误差线绘制”中,我们已经对基本条形图的绘制方法和相关的参数设置,进行了详细的介绍。如果你对该内容已经有所了解,那么堆积图的绘制也并不困难。
那什么是堆积条形图呢?如同基本条形图,堆积条形图上的每一个“条”包含一个组的数据;而堆积条形图的每一个“条”数据中还可以包含不同的系列。因此堆积条形图可以显示每个系列和所在组、以及整体数据的大小关系。所以说,堆积条形图能够帮助人们一目了然看出各个数据系列的大小,便于比较数据之间的差别。
堆积条形图示意图
如何绘制堆积条形图呢?实际上,我们之前在设置有关误差线的内容时,已经提到过,geom_bar( )函数中position的默认值是堆积,如果你查阅R中的帮助手册,你会发现geom_bar( )函数中给的position默认值是“stack”,这就是堆积图的设置,因此我们可以直接进行绘制。此外,position句柄可以有stack、dodge和fill,其中dodge在我们之前条形图的基本绘制中介绍过,是将柱并列排放,fill也是堆叠,不过它是按照比例来进行堆叠,所有柱的高度一致,如上图所示。
R帮助菜单中对geom_bar( )函数的解释
在开始绘制之前,我们先了解一下使用的数据(本次数据由胡瀚同学提供,文末附有下载链接,提供给大家进行演练,在此特别感谢)。如下图所示,这组数据包含方言背景(Dialect. Background),声调(Tones),每种声调的出现频次(Frequency)和每种声调的占比(Percentage)四个变量。我们绘图的目的是:用堆积图呈现每个方言背景(Beijing, Jinan, Xiamen)下,每种声调的出现频次及其百分比。
绘制堆积图所用到的数据
下面,我们可以使用geom_bar( )来绘制基本堆积条形图了。在绘制之前,我们使用attach( )函数进行数据链接,这一步完成后,我们就可以直接调用这个数据框中的变量名了,比如直接使用Tones。如果你需要解除这种链接,使用detach( )函数即可。下面我们绘制堆积图。
ggplot(pct_tones,aes(Dialect.Background,Frequency,
fill = Tones)) +
geom_bar(stat="identity")
运行后,我们就可以看到,一个堆积图出现了。其中的stat="identity"则指令条状的长度取决于频次(Frequency)的原始数据。
堆积图绘制(长度=原始数据)
可见,我们利用堆积条形图中条状的长度来反映数据各组之间以及各组内部系列之间的差异。由于肉眼对长短差异比较敏感,可以使得数据更加直观。我们不仅仅可以直观地看出每个系列的大小,还能够反映出各组的大小,尤其是当需要看某一组数据的总和以及各系列值的占比时,堆积条形图尤为直观方便。
在了解了基本堆积图如何绘制后,会有人想:这个图看起来太不好看了,有没有像第一张图那样好看的做法?有,下面我们就要进行百分比堆积图的绘制。顾名思义,百分比堆积图意在呈现不同组数据内部的每个系列在该组中的百分比。因此,各组的数据总量都统一被归为“1”,各组间的大小差异不再是呈现的重点,呈现组内各系列的比重才是百分比堆积图的重点,正如第一张示例图所示。在R中实现这图的做法也很简单,还记得我们一开始讲的position操作嘛?只需要写上position="fill"即可。
百分比堆积图绘制
R Project
Linguistics
2
其他参数设置
针对图形可操作的参数,在帮助菜单我们也可以看到很多,可以帮我们把图形美化。比如,尽管y轴的刻度是0到1,但是我们就是想把y轴的刻度转换成百分比的形式,这就需要使用scale_y_continuous( )函数。这个函数可以用来修改y轴的名称、刻度范围、刻度间隔、刻度形式等等。通过这个函数设置“刻度形式”就是我们今天要练习使用的功能。具体代码如下:
scale_y_continuous(labels = scales::percent)
这个代码的含义是,y轴数值为连续型,设置y轴标度为百分比。但如代码所示,它同时调用了一个名为scales的包,并用双冒号来调用这个包中的百分比功能。
y轴变为百分比数值
下面,我们解决下图例问题。虽然各组内的系列已通过颜色和长短来区分他们的属性和大小,但直接把百分比的数据添加到图中不是更直观吗?那么,怎样在图中添加各组数据中各系列的百分比的数值呢?这时候,我们需要再用到geom_text( )函数。具体代码如下:
geom_text(aes(label = paste0(Percentage*100, "%") ),
position = position_stack (vjust = 0.5),
size = 3 )
其中,aes(label = paste0(Percentage*100, "%")是指要添加的文字是原数据框Percentage那一列中的数值乘以100,并在乘积后添加百分号。position = position_stack (vjust = 0.5) ), size = 3是指添加的文字的方式是“堆积”,位置是横向并居中,字体大小是3。这样,我们就为每一部分添加了百分比号。
添加相关图例
最后,我们来对颜色进行更改,毕竟这个配色实在是太难看了,我们想要一个更清新的颜色,我们可以使用scale_fill_brewer("Tones")来改变数据系列的填充颜色,系统默认的是蓝色渐变效果。最终这张百分比堆积图的效果如下图所示。此外,我们还可以设置透明度,和之前讲的一样,设置alpha参数即可。因为我们的原始数据的列名称不能有空格,采用了小数点,在横坐标上出现很难看,因此使用xlab和ylab可以更改名称。
堆积图最终效果
通过这种图,我们可以清晰地看到,不同声调在方言背景中出现的频次,可以针对这个实验结果进行下一步分析。在其他语言研究中,堆积图可以帮助我们很好地发现同一组样本的不同个体所占的比重大小。善用堆积图,善用美化方式,你的论文会更加出彩。
附:文中数据下载链接
https://pan.baidu.com/s/1r6SzT9CDzr243qrJvbkrdg 密码:66xe
—END—
排版:Xu & Yang