R语言高级绘图 — ggplot2

2017-03-24    编辑:诺禾致源

R语言有很多可自行下载的包,每个包都含有一些函数,可以实现很多不同的统计或绘图功能。而ggplot2作为绘图软件包,与大多数的图形软件包不同,它有自己的一套图形语法,不会局限于一些已经定义好的单一的统计图形,而是可以根据你的需求量身定做。微生物基因组项目结题报告里面,很多图形例如PCA 、PCoA、NMDS等的绘制都是通过ggplot2包完成的。

ggplot2的语法

一张统计图形,是从数据到几何对象的图形属性的一个映射,此外,图形中还可能包含数据的统计变换,最后绘制在某个特定的坐标系中,而分面则可以用来生成数据不同子集的图形。


数据:ggplot2使用的数据必须是一个数据框。


图形属性:图形的颜色,形状,大小等。


映射:将数据中的变量与图形属性的对应关系,比如将一列值作为x轴坐标,另一列值作为y轴坐标,可以得到散点图的映射,第三列值作为该散点的颜色比例,第四列值作为该散点的大小比例等。

ggplot2的应用

1)散点图应用

#加载ggplot2包
> library(ggplot2)
#利用包内自带的数据,mpg数据框。利用head函数查看该数据集的前六行。如下图所示
> head(mpg)

#创建一个绘图对象p,aes定义了映射方式,其中displ列为x值,hwy为y值,cyl作为因子定义了散点的颜色,由于没有添加几何对象,所以此步骤不会产生图形
> p <-ggplot(data=mpg,aes(x=displ,y=hwy,colour=factor(cyl)))
#添加几何对象-散点图,此时会出现图形,图形的显现方式为散点。横纵坐标和图例就是标度信息
> p + geom_point()

几何对象:代表着你在图中看到的图形元素,比如点、线、矩形等。


统计变换:对数据的某种汇总,比如将数据分组计数,可以创建直方图。


标度:用是将数据的取值映射到图形空间,例如可以用颜色,大小或形状来表示取值的不同。简单来说就是从图形到数据的映射关系,可以让我们从图中得出数据的信息,典型的标度是坐标轴和图例。

坐标系:我们通常使用的是笛卡尔坐标系,也有极坐标系、地图投影。

分面:将大量的数据进行拆分,分为若干个子集,用这些子集进行作图,并联合展示。

 

#再添加一个图层,此次的几何对象为平滑曲线
> p + geom_point() + geom_smooth()

#以上这个例子中用到了图层、几何对象、数据以及映射等概念。

2)PCA的作图

PCA主成分分析,可以将高维数据进行降维处理。我们的OTU表格就是典型的高维数据,可以对其进行降维处理得到主成分PC1和PC2,然后将所有样品都分解到这两个成分方向,进行散点绘图,可以直观的看出样品间的差异。首先需要一系列的统计处理,然后用ggplot2进行绘图,过程如下:

#加载需要的三个包(需要先下载,再加载)
> library(ade4)
>library(ggplot2)
>library(grid)
#读入OTU表格,设置表头为列名,第一列为行名,文件是由\t分隔的
> data <-read.table("otu_table.even.txt", head=T,row.names=1,sep="\t")
#查看data数据的前六行,会出现如下的表格,每行代表一个OTU,每列代表一个样品,表格中的数字代表该OTU在该样品中的丰度信息
> head(data)

#读入分组的表格,将样品每6个分组成为CK,TN,TP组
> groups <- read.table("group.list", head=F)
#将data数据转置
> data <-t(data)
#用dudi.pca函数对data数据进行处理,得到的结果存入pca对象中
> pca =dudi.pca(data[,1:ncol(t(data))], scannf=F, nf=5)
#查看pca的格式,它是一个13个元素的列表,我们可以根据不同的需求提取其中不同的部分进行下一步操作
> str(pca$li)
#PC1和PC2的选取就是pca列表中li这个矩阵的第一列和第二列

#坐标轴的标签格式,预先设定好,在绘图时候可以直接使用
> pc1 <-floor(pca$eig[1]*10000/sum(pca$eig))/100
> pc2 <-floor(pca$eig[2]*10000/sum(pca$eig))/100
#数据处理到此为止,下面进行绘图
#首先定义一个绘图对象P,并设定数据使用plotdata数据框,其中PC1和PC2两列作为绘图的数据
> P<-ggplot(plotdata, aes(PC1, PC2))
#添加几何对象,散点图,图形映射为组别决定颜色和形状,点的大小是4,展示如下图:
> P+geom_point(aes(colour=group,shape=group),size=4)

> PC2 = pca$li[,1]
> PC2 = pca$li[,2]
#构建一个作图用的数据框,第一列是样品名,第二,三列是PC1和PC2的值,第四列为分组信息
> plotdata <- data.frame(rownames(pca$li),PC1,PC2,groups$V2)
#将这个数据框的列名进行修改,方便理解列的意义
> colnames(plotdata) <-c("sample","PC1","PC2","group")
#查看plotdata数据框的格式,如下图所示:
> head(plotdata)

注意:绘图时,如果需要的话可以一步一步的添加几何对象,成为一个个图层,但之前的图层信息也必须添加在前面。所以显示的是类似累加的结构,绿色部分是新添加的图层。
#添加另一个几何对象,标题和坐标轴信息,用到了之前设定好的坐标轴格式,如下图所示:
> P+geom_point(aes(colour=group,shape=group),size=4)+labs(title="PCAPlot",x=paste("PC1(",pc1,"%)"),y=paste("PC2(",pc2,"%)"))

#添加两条线x=0和y=0,分别使用vline和hline函数,线性是点状线
> P+geom_point(aes(colour=group,shape=group),size=4)+labs(title="PCAPlot",x=paste("PC1(",pc1,"%)"),y=paste("PC2(",pc2,"%)"))+geom_vline(aes(xintercept=0),linetype="dotted")+geom_hline(aes(yintercept=0),linetype="dotted")

#添加分面展示,利用分组来进行分面,分两行进行展示。由于本数据集并不庞大,所以分面显示的优势并不明显,对于大数据集来说,分面显示会十分有用。如下图所示:
>P+geom_point(aes(colour=group,shape=group),size=4) +labs(title="PCAPlot",x=paste("PC1(",pc1,"%)"),y=paste("PC2(",pc2,"%)"))+geom_vline(aes(xintercept=0),linetype="dotted")+geom_hline(aes(yintercept=0),linetype="dotted")+facet_wrap(~ group, nrow=2)

以上主要介绍了ggplot2的基础和使用方法,并用散点图和PCA这两个例子展示了ggplot2的使用方法, ggplot2还可以绘制很多其他类型的图,它的图层设定可以让我们在一幅图中组合不同的图形,并且有很好的图形优化功能,可以微调很多参数来绘制自己所期望的图形。