ggplot2-plotly|让你的火山图“活”过来
火山图(Volcano Plot)常用于展示基因表达差异的分布,横坐标常为Fold change(倍数),越偏离中心差异倍数越大;纵坐标为P value(P值),值越大差异越显著。得名原因也许是因为结果图像火山吧
一 载入R函数包及数据集
library(ggplot2)
data <- read.csv("火山图.csv",header=TRUE,row.names = 1)
head(data) #查看数据类型,主要有P值,Fold change和基因ID即可。
二 ggplot2绘制火山图
2.1 绘制简单的火山图--点图
ggplot(data = data, aes(x = logFC, y = -log10(adj.P.Val))) +
geom_point(alpha=0.8, size = 1)
和文献中的差距较大,以下几个方面可改进:
A:上下调基因的区分;
B:横轴,纵轴的阈值线;
C:重点基因的标示。
2.2 细节优化火山图
1)根据阈值设定上下调基因
新增change列,利用ifelse函数添加基因的上下调情况,color进行区分,然后使用geom_hline() 和 geom_vline( )参数添加阈值线,
data$change <- as.factor(ifelse(data$adj.P.Val < 0.01 & abs(data$logFC) > 1,ifelse(data$logFC > 1,'UP','DOWN'),'NOT'))
2)添加阈值线
使用geom_hline() 和 geom_vline( )参数添加阈值线
ggplot(data = data, aes(x = logFC, y = -log10(adj.P.Val), color = change)) +
geom_point(alpha=0.8, size = 1) +
theme_bw(base_size = 15) +
theme(panel.grid.minor = element_blank(),panel.grid.major = element_blank()) +
geom_hline(yintercept=2 ,linetype=4) +
geom_vline(xintercept=c(-1,1) ,linetype=4 ) +
scale_color_manual(name = "", values = c("red", "green", "black"), limits = c("UP", "DOWN", "NOT"))
3) 标示重点显著差异基因
上图是不是有点像了,新增sign列,利用ifelse函数添加重点显著差异基因,然后使用geom_text参数添加到图上,
data$sign <- ifelse(data$adj.P.Val < 0.001 & abs(data$logFC) > 2.5,rownames(data),NA)
ggplot(data = data, aes(x = logFC, y = -log10(adj.P.Val), color = change)) +
geom_point(alpha=0.8, size = 1) +
theme_bw(base_size = 15) +
theme(panel.grid.minor = element_blank(),panel.grid.major = element_blank()) +
geom_hline(yintercept=2 ,linetype=4) +
geom_vline(xintercept=c(-1,1) ,linetype=4 ) +
scale_color_manual(name = "", values = c("red", "green", "black"), limits = c("UP", "DOWN", "NOT")) +
geom_text(aes(label = sign), size = 3)
4) 解决基因名重叠问题
基本和paper一致,但是因为差异表达基因太多,存在重叠情况,现使用R语言的ggrepel包解决标签太多导致的重叠问题。
library(ggrepel)
ggplot(data = data, aes(x = logFC, y = -log10(adj.P.Val), color = change)) +
geom_point(alpha=0.8, size = 1) +
theme_bw(base_size = 15) +
theme(panel.grid.minor = element_blank(),panel.grid.major = element_blank()) +
scale_color_manual(name = "", values = c("red", "green", "black"), limits = c("UP", "DOWN", "NOT")) +
geom_label_repel(aes(label=sign), fontface="bold", color="grey50", box.padding=unit(0.35, "lines"), point.padding=unit(0.5, "lines"), segment.colour = "grey50")
5) 标示感兴趣的基因的表达情况
将我们感兴趣的基因添加到数据的LABEL列中,假设以下几个基因是我们重点关注的基因,单独查看以下基因的表达情况
ggplot(data = data, aes(x = logFC, y = -log10(adj.P.Val), color = change)) +
geom_point(alpha=0.8, size = 1) +
theme_bw(base_size = 15) +
theme(panel.grid.minor = element_blank(),panel.grid.major = element_blank() ) +
scale_color_manual(name = "", values = c("red", "green", "black"), limits = c("UP", "DOWN", "NOT")) +
geom_label_repel(aes(label=LABEL), fontface="bold", color="grey50", box.padding=unit(0.35, "lines"), point.padding=unit(0.5, "lines"), segment.colour = "grey50")
呐,到这里除了数据不一样,基本实现了文献中的火山图,是不是以为到这就结束了?NO!NO!NO! 实现上述静态的就可以发paper去了!
但是,,,
汇报展示的时候,如果能动态交互式的展示所有显著基因的FC值和P值,是不是更酷炫!
三 plotly绘制交互式火山图
1)plot_ly函数画散点图
library(plotly)
plot_ly(data,x = ~logFC, y = ~-log10(adj.P.Val),text = ~sign, type = 'scatter', mode = 'markers')
会弹出一个网页,然后可以交互式的展示每个点的FC值和P值。
那可不可以在“paper”级静态火山图的基础上,实现交互式呢?当然可以!!!
四,参考资料
https://www.bioconductor.org/packages/release/bioc/vignettes/EnhancedVolcano/inst/doc/EnhancedVolcano.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 7.13论坛常见问题以及解决办法
- 移植SDL到JZ2440显示BMP图片
- Vue图片验证码-自定义组件高级版
- Angular页面调试一个有用的小技巧 - normalizeDebugBindingName和normalizeDebugBindingValue
- 19个JS超有用的简写技巧
- 【教程】移植web server到Ubuntu就是这么简单!
- 为什么采用Proxy重构响应系统 | Vue3源码系列
- 制作Linux嵌入式系统开机LOGO(图片)
- R语言奇淫巧技之pdftools包
- 14个Spring MVC超实用技巧!
- 想要成为前端Star 吗?一首歌时间将React / Vue 应用Docker 化
- 初识Pandas
- 【教程】从零制作文件系统到jz2440,使其支持telnet , ftp 和tftp
- Mybatis源码学习第六天(核心流程分析)之Executor分析
- EasyPoi导出Excel