
其实也没啥。就是设置了两组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. 7. 15. 9.e-14 2.091036e-09 19.58011 _at 2 5. 11. 15. 1.e-13 2.091036e-09 19.43798 _at 3 2. 13. 11. 5.019678e-11 3.e-07 14.57411 _s_at 4 4. 7. 10. 2.e-10 1.e-06 13.19062 _at 5 3. 9. 10. 3.e-10 2.e-06 12.86560 _s_at 6 5.024796 6. 9. 8.e-10 4.e-06 12.13533 _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
logFC_t1 & P.Value < P.Value_t1 );table(k3) k3 FALSE TRUE 17842 1908 k4 = with(dat,logFC < -logFC_t1 & P.Value 
# 加标签 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大佬永远的神 ~
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178742.html原文链接:https://javaforall.net
