查看原文
其他

跟着 NC (Nature Communications) 学画图: 火山图进阶

JunJunLab 老俊俊的生信笔记 2022-08-15
前言
我不是大神,但你可以站在我的肩上成为大神


今日有酒今朝醉

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%

微信扫一扫付费阅读本文

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存