假如没有clusterprofiler,怎么活?
接触生物信息是GO分析和KEGG分析开始的,那时候最常用的是David,可视化用的是excel表格。
后面接触到了Y叔的神包clusterprofiler,目前这个包的引用已经超过了1000次。如何使用可以参考三个地方:
- 1.bioconductor上详细的官方文档:http://bioconductor.org/packages/release/bioc/vignettes/clusterProfiler/inst/doc/clusterProfiler.html
- Y叔的私人公众号:biobabble
- Y叔正在写一本关于clusterprofiler的新书:https://yulab-smu.github.io/clusterProfiler-book/index.html
假如要做KEGG富集分析,操作是这样的。
首先获取示例文件
library(DOSE)
data(geneList)
这个geneList很重要,是个向量,本质上是logFC变化值,每个值都对应一个 entrizID的名字,而且整个向量是按照logFC从大到小排序的。这在后面Pathview那里很重要,同时也是GSEA的输入文件,下一期讲geneList的制作。

获取geneList的名称的前1000个,也就是entrizID,作为本次KEGG富集分析的输入文件,。
de = names(geneList)[1:1000]
加载clusterprofiler包进行KEGG分析
library(clusterProfiler)
x = enrichKEGG(gene= de,organism= 'hsa',pvalueCutoff = 1)
使用dotplot作图展示, 代码简洁,出图漂亮
dotplot(x)

我们看一下富集对象x的属性
typeof(x)
发现是个S4对象,Y 叔还定义了一个转换为数据框的语法
df = data.frame(x)

这样很好理解了,这属于清洁数据,行是观测,列是变量,其中有四列分别是Description,GeneRatio, p.adjust, Count。他们就是富集图中展示的元素。我想这个表格正好是ggplot2需要的格式,我如何自己用ggplot2来重现Y叔的操作呢?
这是ggplot2的拿手戏,应该很简单:
x 轴是GeneRatio,y轴是Description,用geom_point来画图,用Count代表点的大小,用p.adjust来代表点的颜色。
基于这个想法,去年的时候,我是尝试了的,
library(ggplot2)
library(dplyr)
df %>%
## 按照p值排序,选前10个展示
arrange(p.adjust) %>%
slice(1:10) %>%
#x 轴是GeneRatio,y轴是Description
ggplot(aes(x=GeneRatio,y=Description))+
## geom_point画出点图,用Count代表点的大小,用p.adjust来代表点的颜色
geom_point(aes(color=p.adjust, size = Count))
当时的图片是这样的:

实验设计是一个样子,实验结果是另外一个样子,这是科学研究的常态。
我想了下,我和Y叔在这张图上的差距在哪里?
-1. 纵坐标没有按照点的大小来排序
-2. 横坐标的呈现有问题
-3. 颜色不对
当时就放弃了,昨天,看到Y叔晒出了riskFactor作图的代码,我决定再来尝试一次,从头开始复制Y叔的dotplot
首先,我获取了富集对象x中的数据框,这是S4对象,用@符号来获取,有293行,是没有筛选过的数据
y =x@result

我们的横坐标有问题,是因为这里的GeneRatio是字符串,我们现在要把它变成一个数值
## 分别后去分号前面和后面的数,并变成数值
forward <- as.numeric(sub("/\\d+$", "", y$GeneRatio))
backward <- as.numeric(sub("^\\d+/", "", y$GeneRatio))
## 增加数值表示的一列GeneRatio
y$GeneRatio = forward/backward

预先设定一个筛选阈值,用于控制结果展示的数目,按照p值排序,选取前10个
showCategory =10
再设定一个字体大小,大小后期可以调整
font.size =12
纵坐标排序的问题可以用forcats包中的fct_reorder
函数来搞定,让他把Description按照Count的多少从高到低排序。
颜色用scale_color_continuous
来控制它在红色和蓝色中间转变。
所以代码,几经调试,搞定了一些细节,最终是这样的。
y %>%
## 安装p值排序,选区既定数目的行
arrange(p.adjust) %>%
slice(1:showCategory) %>%
## 开始ggplot2 作图,其中fct_reorder调整因子level的顺序
ggplot(aes(GeneRatio,forcats::fct_reorder(Description,Count)))+
## 画出点图
geom_point(aes(color=p.adjust, size = Count)) +
## 调整颜色,guide_colorbar调整色图的方向
scale_color_continuous(low="red", high="blue", guide=guide_colorbar(reverse=TRUE))+
## 调整泡泡的大小
scale_size_continuous(range=c(3, 8))+
## 如果用ylab("")或出现左侧空白
labs(y=NULL) +
## 如果没有这一句,上方会到顶
ggtitle("")+
## 设定主题
theme_bw() +
theme(axis.text.x = element_text(colour = "black",
size = font.size, vjust =1 ),
axis.text.y = element_text(colour = "black",
size = font.size, hjust =1 ),
axis.title = element_text(margin=margin(10, 5, 0, 0),
color = "black",size = font.size),
axis.title.y = element_text(angle=90))

最终是100%还原,评判的标准是使用dotplot(x)
在同一个图形设备中作图,然后上翻下翻图片,两张没有任何改变。
接着我也复现了barplot
## 设定显示的数目
showCategory =8
## 设定字体的大小
font.size =12
y %>%
## 安装p值排序,选区既定数目的行
arrange(p.adjust) %>%
slice(1:showCategory) %>%
## 开始ggplot2 作图,其中fct_reorder调整因子level的顺序
ggplot(aes(x=forcats::fct_reorder(Description,p.adjust,.desc = T),y=Count,fill=p.adjust))+
## 画出bar图
geom_bar(stat="identity")+
coord_flip()+
## 调整颜色,guide_colorbar调整色图的方向
scale_fill_continuous(low="red", high="blue", guide=guide_colorbar(reverse=TRUE))+
## 如果用ylab("")或出现左侧空白
labs(x=NULL,y=NULL) +
## 如果没有这一句,上方会到顶
ggtitle("")+
## 设定主题
theme_bw() +
theme(axis.text.x = element_text(colour = "black",
size = font.size, vjust =1 ),
axis.text.y = element_text(colour = "black",
size = font.size, hjust =1 ),
axis.title = element_text(margin=margin(10, 5, 0, 0),
color = "black",size = font.size),
axis.title.y = element_text(angle=90))

如此折腾一番,我对ggplot2更加了解,也可以随意改变横坐标。但是此刻最想说的是,有clusterprofiler的感觉真好,他全自动啊。没有他不能活。