一. ggplot2的特点及其基本概念
1. ggplot2特点
在介绍ggplot2之前,首先来介绍一下作者Hadley Wickham。Hadley (Rice University Department of Statistics : Faculty)从统计学名校Iowa State University拿到了自己的Ph. D,其博士论文Practical tools for exploring data and models 就是关于数据可视化和探索性数据分析的,现任Rice University的Adjunct Assistant Professor 和R的著名IDE RStudio的首席科学家。Hadley在R语言用户中具有极高的声望。ggplot2基于Leland Wilkinson在Grammar of Graphics(图形的语法)中提出的理论,取首字母缩写再加上plot,于是得名ggplot。Hadley开发一个package的时候会先开发一个版本,如果他觉得不够好又升级了,就会发一个新版本,名字变成旧名字后面加上数字2。所以我们就有了reshape2和ggplot2。按照《图形的语法》一书中的观点,一张统计图形就是从数据到点、线或方块等几何对象的颜色、形状或大小等图形属性的一个映射,其中还可能包含对数据进行统计变换(如求均值或方差),最后将这个映射绘制在一定的坐标系中就得到了我们需要的图形。图中可能还有分面,就是生成关于数据的不同子集的图形。使用ggplot2绘图的过程就是选择合适的几何对象、图形属性和统计变换来充分暴露数据中所含有的信息的过程。ggplot2需要一定的时间去入门学习,但是当你掌握了ggplot2中图形的语法的时候,我相信你会感受到这套语法的优雅。(作者:顾志耐; 来源:知乎; 链接:https://www.zhihu.com/question/24779017/answer/28942972)
2. ggplot2基本概念
2.1 映射(共性映射与个性映射)
aes参数用来指定要映射的变量,可以是多个变量,
data参数表示指定数据源,必须是data.frame格式,只能指定一个x轴和y轴,多个x列或y列不能使用调整图例。
以下命令可将数据中的变量映射至图形中的属性:
FPKM <- read.table("FPKM.xls", # 读入数据(链接:https://pan.baidu.com/s/1TxjEAWlzP3p9GwPKWUiJuQ 提取码:evbx )
header=TRUE,
row.names=1) # row.names=1,表示用该数据框的第1列来作为行名。
install.packages (“gglpot2”) #Hello R World ! - 01中介绍的安装包的命令,若已安装则无需重复安装。
library(ggplot2) #Hello R World ! - 01中介绍的载入包的命令。
p <- ggplot(data=FPKM, mapping=aes(x=treat1, y=control1, colour=categroy, size=length))
FPKM.xls的数据内容如下图所示:
在使用上述代码框内命令进行映射之后,实际将数据中的指定列进行了图形属性的定义,即:
ggplot()内有data、mapping两个参数具有全局优先级,可以被之后的所有geom_xxx对象或stat_xxx()所继承(前提是geom或stat未指定相关参数);
而后续即将介绍的geom_xxx()或stat_xxx()内的参数属于局部参数,仅仅作用于内部。为了避免混乱,通常将共性映射的参数指定在ggplot(aes())aes内部,将个性映射的参数指定在geom_xxx(aes())或stat_xxx(aes())内部。
2.2 几何对象(Geometric)
几何对象执行着图层的实际渲染, 控制着生成的图像类型。例如:在2.1小节中我们设定好了数据变量和图形属性之间的映射关系;在此基础上只需要增加一个图层,使用几何对象geom_point()告诉ggplot要绘制散点图:
p=ggplot(data=FPKM, mapping=aes(x=treat1, y=control1, colour=categroy, size=length))
+geom_point()
即可将导入的数据和设定好的映射关系绘制成图:
常用的几何对象有:
几何对象示例:
2.3 统计变换(Statistics)
统计变换即对数据进行统计变化, 通常以某种方式对数据信息进行汇总, 例如通过stat_smooth()添加光滑曲线。
p = ggplot(data=FPKM,
aes(x=log(treat1+1,10),
y=log(control1+1, 10),
colour=categroy))
# 直接画出散点
p + geom_point()
# 用stat_smooth对数据进行拟合
p + geom_point() + stat_smooth(se=FALSE)
2.4 几何对象与统计变换
几何对象geom_xxx(stat = ) 内有统计变换参数stat,统计变换stat_xxx(geom = )内也有几何对象参数geom。两种方法结果相同,几何对象更专注于结果,统计变换更专注于变换过程。
2.5 标度(Scale)
画图就是在做映射,不管是映射到不同的几何对象上,还是映射各种图形属性。在对图形属性进行映射之后,使用scale可以控制这些属性的显示方式,比如坐标刻度、颜色属性,也可通过标度,将坐标进行对数变换。
用scale修改坐标轴:
p = ggplot(data=FPKM,
aes(x=treat1+1,
y=control1+1,
colour=categroy))
# 不做任何变换
p + geom_point() +
stat_smooth(se=FALSE)
# scale_x_log10 和 scale_y_log10函数来对坐标轴取对数
p + geom_point() +
stat_smooth(se=FALSE) +
scale_x_log10() + # 用scale修改坐标轴
scale_y_log10() # 用scale修改坐标轴
用scale修改图例的颜色:
p = ggplot(data=FPKM,
aes(x=log(treat1+1,10),
y=log(control1+1,10),
colour=categroy))
# 不做颜色修改的:
p + geom_point() +
stat_smooth(se=FALSE)
# scale_colour_manual函数修改点的颜色
p + geom_point() +
stat_smooth(se=FALSE) +
scale_colour_manual(values = c("red", "purple", "green"))
2.6 分面(Facet)
分面,即在一个页面上自动摆放多幅图形, 这一过程先将数据划分为多个子集, 然后将每个子集依次绘制到页面的不同面板中。
p = ggplot(data=FPKM,
aes(x=log(treat1+1,10),
y=log(control1+1,10),
colour=categroy))
p + geom_point() + stat_smooth(se=FALSE) +
facet_wrap(~ categroy, nrow=3)
# facet_wrap函数,并按照categroy变量进行分面,
# nrow:定义分面之后的图形排列有几行
ggplot2提供两种分面类型:网格型(facet_grid)和封面型(facet_wrap)。用例子让你理解两者的区别: https://blog.csdn.net/sinat_36709248/article/details/72626278
2.7 坐标系统(Coordinate)
通过coord_flip,可以实现坐标轴转换;通过coord_polar,可以实现极坐标转换。
p = ggplot(data=FPKM)
# 画出一个条形图
p + geom_bar(aes(x=categroy,
fill=categroy),
width=0.7)
# 坐标轴翻转
p + geom_bar(aes(x=categroy,
fill=categroy),
width=0.7) +
coord_flip() # coord_flap:坐标轴翻转
# 转换成极坐标可以由coord_polar()实现:
# https://zh.wikipedia.org/wiki/%E6%9E%81%E5%9D%90%E6%A0%87%E7%B3%BB
p + geom_bar(aes(x=factor(1),
fill=categroy)) +
coord_polar(theta="y")
# 还可以画”靶心图“,theta参数的改变
p + geom_bar(aes(x=factor(1),
fill=categroy)) +
coord_polar(theta="x")
2.8 图层(Layer)
在上文中通过对数据和映射的讲解中, 我们已经采用过”+”来添加图层,
可以这样理解ggplot2中的图层:每个图层可以代表一个图形组件, 这些组件以图层的方式叠加在一起构成一个绘图的整体,
在每个图层中的图形组件又可以分别设定数据、映射或其他相关参数, 因此组件之间又是具有相对独立性的。
ggplot2中图层的设定是十分成功的, 因为这一过程是如此实用、方便而富有逻辑性。
3. ggplot2绘图流程和语法框架
在了解了基本概念之后,我们便可将上述概念学以致用,根据ggplot2的绘图语法,体会其全局的绘图流程。相信细心的你已经逐渐体会到了ggplot2的基本语法,我们将其总结如下:了解ggplot2的基本概念和绘图流程之后,参考前辈整理的语法框架图可以帮助我们全面理解ggplot2。
4.ggplot2绘图实例
4.1
在前面部分的学习中,我们体验过在读入示例文件中的FPKM矩阵之后,仅仅需要使用一句简洁明了的命令便可以使ggplot2为我们将图形绘制出来。
#设定工作目录并读入示例数据:
setwd("D:/novogene_training_R/") #复习一下Hello R World ! - 01中介绍的setwd命令。
FPKM <- read.table("./data/FPKM.xls",
header=T,
row.names=1)
#绘图代码:
p <- ggplot(FPKM[1:200,], aes(x=log(treat1+1,10), y=log(control1+1,10))) + geom_point(aes(
color=categroy,
shape=categroy,
size=length))
在上述示例的基础上我们将之前介绍过的概念应用于绘图细节的调整和设置,便可以绘制出同数据但展示方式和风格截然不同的图片。
#绘图代码:
p <- ggplot(FPKM[1:200,],
aes(x=log(treat1+1,10),
y=log(control1+1,10))) + geom_point(aes(
colour=categroy,
size=length)) +
stat_smooth(aes(
colour=categroy)) +
scale_colour_manual(values =
c("red", "purple", "green")) +
facet_wrap(~ categroy, ncol=1) +
theme(legend.key =
element_rect(colour = "black")) +
theme(panel.background = element_rect(fill="transparent",colour ="grey"))
4.2
批量绘图的需求在我们处理生物学数据时是非常常见的。例如下图由ggplot2绘制:
但若我们有100对这样材料的数据都需要绘制上图,显然一张一张在R console绘制是不现实的。此时我们便可将ggplot2的绘图命令写入R脚本中,循环使用,实现批量绘制图片。
R作为广受欢迎的统计绘图编程语言,我们将在后续的Hello R World ! 系列文章中一一为大家介绍在生物学家的日常工作中R语言所能帮我们高效完成的事务。