双阈值的火山图

标准的火山图:

双阈值的火山图:
耶比较常见咯,比如这篇文章里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大佬永远的神 ~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小洁忘了怎么分身

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值