R语言画火山图geogeoggplot2绘图

双阈值的火山图

2021-05-12  本文已影响0人  小洁忘了怎么分身

标准的火山图:


双阈值的火山图:
耶比较常见咯,比如这篇文章里https://pubmed.ncbi.nlm.nih.gov/32278127/

其实也没啥。就是设置了两组logFC和Pvalue的阈值,把中间的基因用浅一点的颜色表示出来。我试了同一颜色设置不同透明度,结果失败咯。因为点太密集,设置了透明度,颜色耶会叠加,不好看。

1.示例数据

随便拿个芯片数据过来,做完他的差异分析,差异分析结果表格。

if(!require(tinyarray))devtools::install_github("xjsun1221/tinyarray")
library(tinyarray)
library(stringr)
geo = geo_download("GSE4107")
Group = factor(ifelse(str_detect(geo$pd$title,"control"),"control","treat"))
ids = idmap(geo$gpl)
dcp = get_deg_all(log2(geo$exp+1),Group,ids)

## [1] "743 down genes,1908 up genes"

这个10列的表格就是limma差异分析结果,后面添加了几列。

head(dcp$deg)

##      logFC   AveExpr         t      P.Value    adj.P.Val        B    probe_id
## 1 6.861133  7.838697 15.686305 9.489229e-14 2.091036e-09 19.58011   202768_at
## 2 5.219628 11.381501 15.545324 1.147345e-13 2.091036e-09 19.43798   209189_at
## 3 2.453844 13.346921 11.538846 5.019678e-11 3.920727e-07 14.57411 201041_s_at
## 4 4.538726  7.466782 10.617313 2.533831e-10 1.731715e-06 13.19062   223316_at
## 5 3.403667  9.523239 10.411289 3.687011e-10 2.239859e-06 12.86560 201693_s_at
## 6 5.024796  6.872653  9.961547 8.508265e-10 4.651894e-06 12.13533   220276_at
##   symbol change ENTREZID
## 1   FOSB     up     2354
## 2    FOS     up     2353
## 3  DUSP1     up     1843
## 4  CCDC3     up    83643
## 5   EGR1     up     1958
## 6  RERGL     up    79785

2.常规火山图

如果要常规的火山图,已经有啦。我在写这个tinyarray包的时候,顺便把画图的代码也加进去了。仅作简化代码用哦。

dcp$plots

3.双阈值的火山图

每句代码都简单,实际应用起来略复杂,搞起来。

library(ggplot2)
logFC_t1 = 1
P.Value_t1 = 0.05
logFC_t2 = 2
P.Value_t2 = 0.01
dat = dcp$deg
library(dplyr)
k1 = with(dat,logFC > logFC_t2 & P.Value<P.Value_t2);table(k1)

## k1
## FALSE  TRUE 
## 19467   283

k2 = with(dat,logFC < -logFC_t2 & P.Value<P.Value_t2);table(k2)

## k2
## FALSE  TRUE 
## 19692    58

k3 = with(dat,logFC > logFC_t1 & P.Value < P.Value_t1 );table(k3)

## k3
## FALSE  TRUE 
## 17842  1908

k4 = with(dat,logFC < -logFC_t1 & P.Value <P.Value_t1 );table(k4)

## k4
## FALSE  TRUE 
## 19007   743

# 设置不同颜色和大小
my_color = case_when(k1~"red",
                     k2~"blue",
                     k3~"#f08080",
                     k4~"#4169e1",
                     TRUE~"#696969")
my_size = case_when(k1|k2~2.5,
                    k3|k4~2,
                    TRUE~1.5)

p = ggplot(data = dat, 
       aes(x = logFC, 
           y = -log10(P.Value))) +
  geom_point(alpha=0.5, size=my_size, 
             color=my_color) +
  geom_vline(xintercept = c(-logFC_t1,logFC_t1,-logFC_t2,logFC_t2),lty= 4,lwd=0.8,alpha = c(0.5,0.5,1,1)) +
  geom_hline(yintercept = c(-log10(P.Value_t1),-log10(P.Value_t2)),lty= 4,lwd=0.8,alpha = c(0.5,1)) +
  theme_bw()+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+
  scale_x_continuous(limits = c(-7, 7), expand = c(0,0))
p
# 加标签
for_label <- dat %>% 
  filter(symbol %in% c("FOSB", "FOS", "DUSP1"))

p +
  geom_point(size = 3, shape = 1, data = for_label) +
  ggrepel::geom_label_repel(
    aes(label = symbol),
    data = for_label,
    color="black"
  )

只要顺利得到了差异分析结果表格,上面的图应该是很轻松搞定咯。如果你仔细看了代码,没太整明白case_when的话,分享下这个函数的核心思想,应该会有茅塞顿开的感觉。可以看到我写的k1 k2 k3 k4 是两组阈值得到差异基因的条件,为什么不是分更多种情况讨论?这是因为case_when函数的条件之间有优先级顺序哦,不满足第一个条件,才往下看第二个条件,以此类推。就像ggplot2的代码也有先后顺序一样!hadly大佬永远的神 ~

上一篇下一篇

猜你喜欢

热点阅读