双向富集分析图
1.需求
上下调基因分别富集分析,把结果放在一张图上:
2.示例数据和r包准备
library(ggplot2)
library(dplyr)
set.seed(2012)
data <- data.frame(
id = paste0("ca",1:20),
p = runif(20,0,0.05),
change = sample(c("up","down"),20,replace = T)
)
head(data)
## id p change
## 1 ca1 0.01091543 up
## 2 ca2 0.03720259 down
## 3 ca3 0.01408370 down
## 4 ca4 0.04675872 up
## 5 ca5 0.03732084 down
## 6 ca6 0.04373917 up
模拟的是kegg的富集结果,编了一个数据。p是p值。画图的时候用-log10(p)。
因为我们需要上下调分两个方向,所以先把下调的整成负值log10(p)。
为了让通路按照上下调和p值大小顺序排列起来,还需要用有序因子控制一下横坐标的顺序。
3.实现双向画图
data <- data %>%
mutate(p2 = ifelse(change == "up", -log10(p), log10(p))) %>%
arrange(change,p2)
data$id = factor(data$id,levels = unique(data$id),ordered = T)
head(data)
## id p change p2
## 1 ca16 0.002428496 down -2.614663
## 2 ca19 0.005513276 down -2.258590
## 3 ca18 0.007077920 down -2.150094
## 4 ca3 0.014083697 down -1.851283
## 5 ca20 0.027069219 down -1.567524
## 6 ca15 0.032271096 down -1.491186
这里有一点绕:刚才把down对应的那些通路-log10(p)值设置为负了,需要在图上改回去,直接改坐标即可。
以前都是手动修改breaks和labels参数,今天我突然想到,ggplot2的默认的breaks是怎么生成的呢?一番搜索找到了答案,茅塞顿开:https://stackoverflow.com/questions/38486102/how-does-ggplot-calculate-its-default-breaks
tmp = with(data, labeling::extended(range(p2)[1], range(p2)[2], m = 5));tmp
## [1] -3 -2 -1 0 1 2
lm = tmp[c(1,length(tmp))];lm
## [1] -3 2
这里的tmp就是默认的breaks。lm是坐标范围,也可作为参数设置进去。
有两种办法可以画出来双向的直方图
方法1 :geom_segment
ggplot(data, aes(x=id, y=p2)) +
geom_segment( aes(x=id, xend=id, y=0, yend=p2, color=change), size=5, alpha=0.9) +
theme_light() +
theme(
panel.border = element_blank()
) +
xlab("") +
ylab("-log10(pvalue)")+
ylim(lm)+
scale_y_continuous(breaks = tmp,
labels = abs(tmp))+
coord_flip()
方法2 :geom_bar
ggplot(data, aes(x=id, y=p2)) +
geom_bar(stat='identity', aes(fill=change), width=.7)+
coord_flip()+
theme_light() +
ylim(lm)+
scale_y_continuous(breaks = tmp,
labels = abs(tmp))+
theme(
legend.position = "none",
panel.border = element_blank()
)
4.搞定kegg和go双向富集图的函数
氛围到了,写着写着就安排上了呗。拿去用1.4.0以上版本的tinyarray可用,今天(2020.10.16)刚更新上去的。输出格式是ggplot2,所以ggplot2细节调整,都可以添加到这张图上去
load("step4output.Rdata")
library(tinyarray)
pt = double_enrich(deg,n = 5)
pt
## $kp
##
## $gp