【R语言】——火山图绘制

本期介绍利用R语言筛选差异表达基因及绘制火山图。

一、什么是火山图?

火山图(volcano plot)是散点图的一种,它将统计测试中的统计显著性量度(如p-value、FDR)和变化幅度相结合,从而可以快速直观地识别那些变化幅度较大且具有统计学意义的数据点(基因、代谢物、微生物等)。是一种单变量统计分析方法,常应用于转录组、基因组、蛋白质组、代谢组等统计数据分析。其每个点代表一个检测到的基因/代谢物/微生物等。

二、火山图绘制

1 数据准备

数据输入格式(xlsx格式):

  • gene_name: 基因的名字

  • FC:基因差异倍数(fold change),即一个基因在一组样本表达量均值除以其在另一组样本中的表达量均值。大于1表示上调,小于1表示下调。

  • log2FC:即Log2(fold change)火山图中横坐标的变量,将“fold change”进行了log2转化后,获得的数据中正数为上调的基因/负数为下调的基因,这样就可以使火山图两边对称分布(即左侧表下调/右侧表上调)。筛选标准默认为|log2FC| ≧1。

  • PValue:即P-value,统计学根据显著性检验方法所得到的一个衡量值,一般以P < 0.05为显著,P <0.01为极显著,其含义是样本间的差异由抽样误差所致的概率小于0.05 或0.01。

  • FDR(false discovery rate):是根据假设检验的P-value进行校正而得到,通常计算FDR采用Benjamini-Hochberg方法(简称BH法)。FDR<0.05表示容许数据中存在至多5%假阳性率。以转录组为例,转录组分析并不是针对一个或几个转录本进行分析,是对一个样品中所转录表达的所有转录本进行分析。这样一个样品当中有多少转录本,就需要对多少个转录本进行假设检验。这样做成千上万次检验,本身就会引入假阳性结果,因此需要进行多重假设检验校正,如FDR、adjusted P-value等。(adjusted P-value, q-value, FDR一般代表相同的含义,都是多重假设检验校正后的P-value,区别在于校正算法的不同)

  • -log10FDR:FDR数值越小统计越显著,-log10FDR转换后则反过来,数值越大越显著。

  • -log10PValue:PValue数值越小统计越显著,-log10PValue转换后则反过来,数值越大越显著。

差异表达基因筛选:

扫描二维码关注公众号,回复: 16735611 查看本文章

将log2FC≧1、且p<0.05的基因标记为:差异显著“上调”基因;

将log2FC≤-1、且p<0.05的基因标记为:差异显著“下调”基因;

剩下的基因标记为:差异不显著基因。

2 R包加载、数据导入及处理


###下载包###
install.packages("ggrepel")
install.packages("ggplot2")
install.packages("openxlsx")
###加载包###
library(ggplot2)
library(ggrepel)
library(openxlsx)
###导入数据###
remove(list = ls()) #清除 Global Environment
getwd()  #查看当前工作路径
setwd("C:/Rdata/jc")  #设置需要的工作路径
list.files()  #查看当前工作目录下的文件
data = read.xlsx("volcano.xlsx",sheet= "单组火山图1",sep=',')  #数据中的log10FDR和log10PValue列都已乘以“-1”
#data = read.table(file='C:/Rdata/jc/volcano.xlsx',header=TRUE,sep=',')
colnames(data) <- c("gene_name", "FC", "log2FC", "PValue", "FDR", "log10FDR","log10PValue") #重新命名行名
head(data)

###数据处理——根据FDR进行差异基因筛选###
cut_off_FDR =0.05 #设置FDR的阈值
cut_off_log2FC =1 #设置log2FC的阈值
data$Sig = ifelse(data$FDR < cut_off_FDR &    #根据阈值筛选差异显著的上下调基因,与差异不显著的基因
                        abs(data$log2FC) >= cut_off_log2FC,  #abs绝对值
                      ifelse(data$log2FC > cut_off_log2FC ,'Up','Down'),'no')
data = data.frame(data)
table(data$Sig) #查看数据统计情况

3 火山图绘制


###绘图——基础火山图###
p1 <- ggplot(data, aes(x =log2FC, y=log10FDR, colour=Sig)) + #x、y轴取值限制,颜色根据"Sig"
  geom_point(alpha=0.65, size=2) +  #点的透明度、大小
  scale_color_manual(values=c("#546de5", "#d2dae2","#ff4757")) + xlim(c(-30, 30)) +  #调整点的颜色和x轴的取值范围
  geom_vline(xintercept=c(-cut_off_log2FC,cut_off_log2FC),lty=4,col="black",lwd=0.8) + #添加x轴辅助线,lty函数调整线的类型:"twodash"、"longdash"、"dotdash"、"dotted"、"dashed"、"solid"、"blank"
  geom_hline(yintercept = -log10(cut_off_FDR), lty=4,col="black",lwd=0.8) +  #添加y轴辅助线
  labs(x="log2FC", y="-log10FDR") +  #x、y轴标签
  ggtitle("单组火山图") + #标题
  theme_bw() + # 主题,help(theme)查找其他个性化设置
  theme(plot.title = element_text(hjust = 0.5),
        legend.position="right", 
        legend.title = element_blank()
  ) 
p1 #出图

图1 初级火山图


###添加基因名标记###
p2 <- p1 + geom_text_repel(
    data = subset(data, data$FDR < cut_off_FDR & abs(data$log2FC) >= cut_off_log2FC),# 可以设置跟上面不同的阈值,用数值替换即可
    aes(label = gene_name), size = 3,
    box.padding = unit(0.5, "lines"),
    point.padding = unit(0.8, "lines"), segment.color = "black", show.legend = FALSE )
p2 #出图

图2 添加基因标记火山图

###添加差异最显著的上调和下调的前几个基因###
#下载与加载包#
install.packages("dplyr")
install.packages("gt")
library(dplyr) # 用于数据处理
library(gt) # 制作表格
#数据预处理——上下调合并绘制同一类型标签框#
top_20 <- bind_rows(   #分别筛选差异显著前10个的上下调基因,并合并两组数值进行绘图
  data %>%
    filter(Sig == 'Up') %>%
    arrange(FDR, desc(abs(log2FC))) %>%
    head(10),
  data %>%
    filter(Sig == 'Down') %>%
    arrange(FDR, desc(abs(log2FC))) %>%
    head(10)
)
top_20 %>% gt()  #将数据制成表
#绘图——添加基因标签框图#
p4 <- p1 +
  geom_label_repel(data = top_20,
                   aes(log2FC, log10FDR, label = gene_name),
                   size = 3, fill="#CCFFFF")
p4

图3 添加标签框火山图


#数据预处理——将上下调基因分开绘制各自的标签框类型#
Up_top_10 =(     #筛选差异显著上调的前10个Gene
  data %>%
    filter(Sig == 'Up') %>%
    arrange(FDR, desc(abs(log2FC))) %>%
    head(10)
)
Up_top_10 %>% gt() #数据制成表
Down_top_10 = (       #筛选差异显著下调的前10个Gene
  data %>%
    filter(Sig == 'Down') %>%
    arrange(FDR, desc(abs(log2FC))) %>%
    head(10)
)
Down_top_10 %>% gt() #数据制成表

#绘图——分别绘制相应类型的标签框#
p5 <- p1 +
  geom_label_repel(data = Up_top_10,
                   aes(log2FC, log10FDR, label = gene_name),
                   size = 3, fill="#CCFFFF",
                   alpha = 0.65, color = "black")+
  geom_label_repel(data = Down_top_10,
                   aes(log2FC, log10FDR, label = gene_name),
                   size = 3, fill="#FFCCCC",
                   alpha = 0.65, color = "black")
p5

图4 添加不同类型基因标签的火山图


#绘图——将筛选的差异显著的点加粗和用不同颜色标记#
p6 <- p5+geom_point(data=Up_top_10,aes(log2FC, log10FDR),
                    color="#CCCCFF",size=3.5,alpha=1)+
  geom_point(data=Down_top_10,aes(log2FC, log10FDR),
             color="#FFCCCC",size=3.5,alpha=1)
p6

图5 个性化设置以后的火山图

好了本次分享就到这里,下期将分享“多组火山图”绘制,敬请期待。

关注“在打豆豆的小潘学长”公众号,发送“单组火山图”获得完整代码包和演示数据。

猜你喜欢

转载自blog.csdn.net/weixin_54004950/article/details/128698464