分析方法生物信息编程R语言做生信

假如没有clusterprofiler,怎么活?

2019-04-23  本文已影响6人  9d760c7ce737

接触生物信息是GO分析和KEGG分析开始的,那时候最常用的是David,可视化用的是excel表格。
后面接触到了Y叔的神包clusterprofiler,目前这个包的引用已经超过了1000次。如何使用可以参考三个地方:

假如要做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的感觉真好,他全自动啊。没有他不能活。

上一篇 下一篇

猜你喜欢

热点阅读