我们总能在文献中看到的火山图是怎么绘制的,本期就介绍火山图原理并且一起进行R代码实操训练,绘制自己的火山图。
导语: 火山图原理介绍; 阈值介绍; R代码实操;
火山图是一种用于可视化基因表达数据的图形,通常用于比较不同条件下的基因表达差异。它结合了基因的显著性(P值)和表达变化(Fold Change),能够快速识别出显著上调或下调的基因。
火山图的横轴表示基因表达的对数变化(Log2 Fold Change),而纵轴表示显著性水平的负对数(-log10(P值))。通过这种方式,图中的每个点代表一个基因,点的位置反映了该基因在不同条件下的表达变化和显著性。
识别显著基因:快速识别上调和下调的基因。
可视化数据:将复杂的基因表达数据以直观的方式呈现。
阈值设定:通过设定阈值,筛选出感兴趣的基因。
数据预处理:确保数据经过适当的标准化和预处理。
阈值选择:选择合适的阈值以避免假阳性或假阴性。
样本量:样本量不足可能导致结果不可靠。
Fold Change:通常选择2倍变化(Log2 Fold Change ≥ 1或≤ -1)作为上调或下调的阈值。
P值:常用的显著性水平为0.05(-log10(P值) ≥ 1.3),但根据具体研究可调整。
接下来就让我们通过复现一篇natrure文章的火山图,文献为:
文章原图:
数据可以从文章中下载,数据格式为:
复现代码:
## volcano_plot
library(readxl)
library(tidyverse)# 读取Excel文件中的特定工作表
library(ggthemes)
library(ggsci)
reshighctrl <- read_excel("./41586_2023_6990_MOESM7_ESM.xlsx", sheet = "Extended Data Figure 2",na="NA")
## 筛选阈值
lfc=1
pval=0.1
## 导入自定义主题
source("theme_bipin.r")
reshighctrl %>% mutate(color=case_when(
abs(log2FoldChange)>lfc & padj>pval ~ "grey",
abs(log2FoldChange)<lfc & padj<pval ~ "grey",
#abs(log2FoldChange)>lfc & padj<pval ~ pal_nejm("default", alpha = 0.4)(8)[1],
abs(log2FoldChange)>lfc & padj<pval ~ "#ED8172",
abs(log2FoldChange)<lfc & padj>pval ~ "grey"
),
plot_label=case_when(
abs(log2FoldChange)>lfc & padj<pval ~ symbol
),
plot_label=gsub("\\.",NA,plot_label)
)%>%
ggplot(aes(log2FoldChange, -log10(padj), fill=color,label=plot_label)) +
geom_point(alpha=1,size=4,pch=21) +
#geom_text(hjust=-0.3, vjust=0) +
scale_fill_identity() +
labs(x=expression(Log[2]~fold~change), y=expression(-~Log[10]~padj~value)) +
geom_vline(xintercept=c(-lfc,lfc), linetype=2) + geom_hline(yintercept=-log10(pval), linetype=5) +
ggrepel::geom_label_repel(alpha=1,family="sans",color="black",fill="white",face="italicize") +
#scale_y_log10() +
xlim(-3,3) +
theme_bipin() +
theme(axis.title = element_text(size=16),
text = element_text(family="sans"))
ggsave("./Fig/volcano.pdf",width=6,height=6)
## 自定义主题
theme_bipin <- function(base_size=14, base_family="arial") {
library(grid)
library(ggthemes)
library(ggsci)
(theme_foundation(base_size=base_size, base_family=base_family)
+ theme(plot.title = element_text(face = "bold",
size = rel(1.2), hjust = 0.5),
text = element_text(),
panel.background = element_rect(colour = NA),
plot.background = element_rect(colour = NA),
panel.border = element_rect(colour = NA),
#axis.title = element_text(face = "bold",size = rel(2)),
axis.title.y = element_text(angle=90,vjust =2),
axis.title.x = element_text(vjust = -0.2),
复现结果图:
本期分享到这里就结束啦,如有疑问或建议,欢迎大家到评论区留言!