跟着 NC (Nature Communications) 学画图: 火山图进阶
今日有酒今朝醉
1前言
关于希望逐渐建设一个高质量公众号的线下交流社区,此星球为付费模式,保持对 R 和生信的热爱!在里面我会尽量为大家解答和分享知识和心得。 刚开始,希望和大家一起逐步成长,好好经营这个星球,并能学有所得!欢迎感兴趣的小伙伴一起加入! 作为回报,我也会及时在这里上传和分享付费文章的 代码, 文献及 测试数据。
最后欢迎志同道合的的朋友加入!
2引言
今天分享一个有意思的火山图,文章发表在 NC (Nature Communications) ,是一篇关于 新冠病毒研究 的内容。
文章标题:
Large scale discovery of coronavirus-host factor protein interaction motifs reveals SARS-CoV-2 specific mechanisms and vulnerabilities
里面的火山图如下:
里面火山图加了跟曲线,那是如何加上去的呢?于是恶补了一下数学,最后想出来了是哪个函数。同时这种火山图在其他文献里也有出现:
文章标题:
Maspin as a Prognostic Marker for Early Stage Colorectal Cancer With Microsatellite Instability
下面跟随我的探索如何去绘制这两幅火山图。先展示下我的结果:
付费的小伙伴们记得私聊我,我把文献,测试数据,代码分享给你。
3曲线函数
我们首先了解以下怎么才能画出这个曲线,首先相似的 函数为 :
绘制出来的图形:
# 加载R包
library(ggplot2)
library(tidyverse)
# 曲线
fun1 <- function(x){
input = c(seq(-x,-0.001,0.0001),seq(0.001,x,0.0001))
y = 1/input
# 合并为dataframe格式
df = data.frame(x = input,y = y)
}
# 生成曲线数据
df <- fun1(5)
# 绘图
ggplot(df,aes(x = x,y = y)) +
geom_point(size = 1) +
theme_grey(base_size = 18) +
ylim(-250,250)
要绘制出 倒喇叭形 的曲线,我只需要 对 x 变量取绝对值 即可,公式为:
图形为:
#倒喇叭形
fun2 <- function(x){
input = seq(0.001,x,0.001)
y = 1/abs(input)
# 合并为dataframe格式
df1 = data.frame(x = input,y = y)
df2 = data.frame(x = -(input),y = y)
# 合并
res <- rbind(df1,df2)
return(res)
}
# 生成曲线数据
df <- fun2(5)
# 绘图
ggplot(df,aes(x = x,y = y)) +
geom_point(size = 1) +
theme_grey(base_size = 18) +
ylim(0,5)
问题:
这样我们就绘制出来了,但是你仔细观察文章图里的曲线, 内侧的曲线的 x 坐标 和 y 轴 是 无线趋近-1,1 和 某个值 的,但是我们绘制出的都是是 无线趋近 0 的。
y 轴那个值应该是 -log10 pvalue, 解决方法是整体向上平移 -log10 pvalue 个单位:
# 平移-log10 pvalue
fun3 <- function(x){
input = seq(0.001,x,0.001)
y = 1/abs(input) + -log10(0.05)
# 合并为dataframe格式
df1 = data.frame(x = input,y = y)
df2 = data.frame(x = -(input),y = y)
# 合并
res <- rbind(df1,df2)
return(res)
}
# 生成曲线数据
df <- fun3(5)
# 绘图
ggplot(df,aes(x = x,y = y)) +
geom_point(size = 1) +
theme_grey(base_size = 18) +
ylim(0,5)
以上曲线的问题我们就解决了, 对应我们的数据就是 x 为 log2FC, y 值为 1/|log2FC|, 对应公式为:
4绘制火山图
有了以上的基础了,我们就可以绘制火山图了,我们加载文章里的数据,数据我稍微整理了一下:
可试读45%