R语言绘制火山图

火山图在SCI文章中经常出现,其实火山图就是个散点图,通过不同颜色的散点来表示基因的差异。通常横坐标用log2(fold change)表示,差异越大的基因分布在两端,纵坐标用-log10(pvalue)表示,T检验显著性P值的负对数。通常差异倍数越大的基因T检验越显著,所以往往关注左上角和右上角的值。
在这里插入图片描述
今天我们通过R来绘制火山图,先导入我们的数据和R包

library(ggplot2)
library(ggrepel)
bc<-read.csv("E:/r/test/huoshantu.csv",sep=',',header=TRUE)

在这里插入图片描述
在这里插入图片描述
我们来看一下数据(公众号回复:火山图数据,可以获得数据),Gene为基因的名字,log2FoldChange为已经取了对数的FoldChange,pvalue为P值,padj是校正过后的P值。我们先要把P值转换一下,取它的对数,这样画图起来比较对称好看。
bc l o g 10 p v a l u e = − l o g 10 ( b c log10pvalue=-log10(bc log10pvalue=log10(bcpvalue)
转换号数据我们就可以做图啦,我们先做个基础的火山图,其实就是散点图。
ggplot(bc, aes(log2FoldChange,log10pvalue))+
geom_point()
在这里插入图片描述
非常简单就画好了,一点都不难把,还可以调整X轴的范围和散点的大小或者颜色

ggplot(bc, aes(log2FoldChange,log10pvalue))+
  geom_point(size = 2)+
  scale_x_continuous(limits = c(-2.5, 2.5))

在这里插入图片描述
生成一个新指标对基因进行分类,分为3类,log2FoldChange>=1和P小于0.05分为上调,log2FoldChange<=-1和P小于0.05分为下调,剩下的分为未调整。我们可以使用我们的if语句来轻松做到

bc$expression<-ifelse(bc$log2FoldChange >= 1 & bc$pvalue < 0.05,"Up-regulated",
                      ifelse(bc$log2FoldChange <=-1 & bc$pvalue < 0.05,"Down-regulated","Unchanged"))

在这里插入图片描述
生成指标expression后就可以进行不同颜色的基因标注

ggplot(bc, aes(log2FoldChange,log10pvalue))+
  geom_point(size = 2,aes(color = expression))+
  scale_x_continuous(limits = c(-2.5, 2.5))

在这里插入图片描述
还可以加上标线

ggplot(bc, aes(log2FoldChange,log10pvalue))+
  geom_point(size = 2,aes(color = expression))+
  scale_x_continuous(limits = c(-2.5, 2.5))+
  geom_hline(yintercept=-log10(0.05),linetype=4)+
  geom_vline(xintercept=c(-1,1),linetype=4)

在这里插入图片描述
左侧线外的点表示下调超过2倍的基因,右侧线外的点表示上调超过2倍的基因,大于横轴的点表示有显著先的基因。这样我们就把基因区别开来了,看起来一目了然。
还可以加上X轴和Y轴的标签

ggplot(bc, aes(log2FoldChange,log10pvalue))+
  geom_point(size = 2,aes(color = expression))+
  scale_x_continuous(limits = c(-2.5, 2.5))+
  geom_hline(yintercept=-log10(0.05),linetype=4)+
  geom_vline(xintercept=c(-1,1),linetype=4)+
  xlab(expression("log"[2]*" fold change"))+
  ylab(expression("-log"[10]*" p-value"))

在这里插入图片描述
接下来我们来对最显著的基因进行标注,上调和下调各标5个,使用dplyr包的管道函数可以轻松帮我们做到

library(dplyr)
data<- bind_rows(
  bc %>%
    filter(expression == 'Up-regulated') %>%
    arrange(pvalue,desc(abs(log2FoldChange))) %>%
    head(5),
  bc %>%
    filter(expression == 'Down-regulated') %>%
    arrange(pvalue,desc(abs(log2FoldChange))) %>%
    head(5)
)

在这里插入图片描述
如果不想用管道函数,普通方法也可以实现,就是麻烦点

a<-subset(bc,expression=="Up-regulated")#####a为bc中expression=="Up-regulated"的子集
a1<-head(a[order(abs(a[,2]),decreasing=TRUE),],5)
b<-subset(bc,expression=="Down-regulated")#####b为bc中expression=="Down-regulated"的子集
b1<-head(b[order(abs(b[,2]),decreasing=TRUE),],5)
data1<-rbind(a1,b1)

生成了数据data后就可以进一步绘图了,先把原来绘图函数等于g1

g1<-ggplot(bc, aes(log2FoldChange,log10pvalue))+
  geom_point(size = 2,aes(color = expression))+
  scale_x_continuous(limits = c(-2.5, 2.5))+
  geom_hline(yintercept=-log10(0.05),linetype=4)+
  geom_vline(xintercept=c(-1,1),linetype=4)+
  xlab(expression("log"[2]*" fold change"))+
  ylab(expression("-log"[10]*" p-value")) 

其实就是在原来函数的基础上加上一个geom_label_repel函数进行标签标识

g1+geom_label_repel(data = data,
                       aes(log2FoldChange, -log10(pvalue), label = Gene),
                       size = 2)  

在这里插入图片描述
还可以调整标签的字体、位置、颜色大小等,我这里就
参考文献

  1. https://www.it610.com/article/1276835499339694080.htm
  2. https://mp.weixin.qq.com/s/ApZ6CtnixN9nD4rOTMzwtA
  3. http://www.360doc.com/content/17/0725/00/19913717_673898707.shtml

更多精彩文章请关注公众号:零基础说科研
在这里插入图片描述

  • 12
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,以下是使用 R 语言绘制差异基因火山的基本步骤: 1. 读取差异基因数据,包括基因名称、表达值和差异值等信息; 2. 根据差异值和显著性水平筛选出差异表达的基因,通常选择差异值较大、显著性水平较低的基因; 3. 将筛选出来的基因分为上调和下调两组,并分别用不同的颜色标记; 4. 在坐标系上绘制基因的差异值和显著性水平,其中差异值一般使用 log2 转换,显著性水平使用负对数转换; 5. 将不同调控方向的基因用不同的颜色标记,同时可以设置阈值,将显著性水平高于阈值的基因用更亮的颜色标记; 6. 添加坐标轴标签、标题等注释信息。 下面是一个简单的 R 代码示例: ```R # 读取差异基因数据,例如:gene_name,log2_fold_change,p_value data <- read.table("diff_genes.txt", header = TRUE) # 筛选出差异表达的基因 diff_genes <- subset(data, abs(log2_fold_change) > 1 & p_value < 0.05) # 将上调和下调的基因分别用不同的颜色标记 up_genes <- subset(diff_genes, log2_fold_change > 0) down_genes <- subset(diff_genes, log2_fold_change < 0) # 绘制火山 plot(-log10(diff_genes$p_value), diff_genes$log2_fold_change, pch = 20, col = ifelse(diff_genes$log2_fold_change > 0, "red", "blue"), main = "Differential Gene Expression", xlab = "-log10(p-value)", ylab = "log2(fold change)") # 添加阈值和注释信息 abline(h = c(-1, 1), lty = 2) text(-log10(diff_genes$p_value), diff_genes$log2_fold_change, labels = ifelse(diff_genes$p_value < 0.01, rownames(diff_genes), ""), cex = 0.6, pos = 4) legend("topleft", legend = c("Up-regulated", "Down-regulated"), col = c("red", "blue"), pch = 20) ``` 以上代码仅供参考,具体细节还需要根据实际数据进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天桥下的卖艺者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值