"导师让我分析火山图,可那些红点蓝点到底啥意思?"
"明明P值<0.05,为什么老板说结果不显著?"
别慌!火山图作为组学研究神器,其实藏着读图的黄金法则。今天手把手带你破解基因表达背后的秘密👇
01
火山图真相|别被名字骗了!
❌ 常见误解:火山图只能看基因差异?
✅ 真相:它是「差异显著性探测器」!
-
横轴:log₂FC(差异倍数)→ 数值越大,基因表达变化越剧烈
-
纵轴:-log₁₀(P值)→ 颜色越深,结果越可信(P<0.05为显著)
-
颜色编码:
🔴 红点:显著上调基因(如炎症因子)
🔵 蓝点:显著下调基因(如抑癌基因)
⚪ 灰点:背景噪音(忽略它!)
经典案例:
某肿瘤研究火山图中,红色簇集中出现EGFR基因,提示该靶点可能是关键致癌通路!
02
读图三板斧|秒变分析高手
1. 先看趋势,再看数值
-
离群点警报:远离中心的红/蓝点可能是关键差异基因(如某代谢酶FC=5,P=1e-6)
-
边缘地带慎判:靠近虚线的点(如log₂FC=0.5)可能存在假阳性
2. 颜色陷阱早规避
-
多重检验校正:未校正的P值可能虚高(记得看FDR值!)
-
样本量陷阱:小样本火山图容易放大噪声(≥30例才靠谱)
3. 临床意义大拷问
-
生物学重复:同一基因在3个样本中持续差异才有价值
-
通路富集:用DAVID工具验证红点是否属于同一代谢通路
03
代码实操|手把手画火山图
# 代码来源:https://www.r2omics.cn/
# 加载R包,没有安装请先安装 install.packages("包名")
library(ggplot2)
# 读取火山图数据文件
data = read.delim("https://www.r2omics.cn/res/demodata/Volcano.txt",
header = T # 指定第一行是列名
)
# 建议您的文件里对应的名称跟demo数据一致,这样不用更改后续代码中的变量名称
FC = 1.5 # 用来判断上下调,一般蛋白质组的项目卡1.5
PValue = 0.05 #用来判断上下调
# 判断每个基因的上下调,往数据框data里新增了sig列
data$sig[(-1*log10(data$PValue) < -1*log10(PValue)|data$PValue=="NA")|(log2(data$FC) < log2(FC))& log2(data$FC) > -log2(FC)] <- "NotSig"
data$sig[-1*log10(data$PValue) >= -1*log10(PValue) & log2(data$FC) >= log2(FC)] <- "Up"
data$sig[-1*log10(data$PValue) >= -1*log10(PValue) & log2(data$FC) <= -log2(FC)] <- "Down"
# 绘图
p = ggplot(data,aes(log2(FC),-1*log10(PValue))) + # 加载数据,定义横纵坐标
geom_point(aes(color = sig)) + # 绘制散点图,分组依据是数据框的sig列
labs(title="volcanoplot", # 定义标题,x轴,y轴名称
x="log[2](FC)",
y="-log[10](PValue)") +
scale_color_manual(values = c("#619cff","grey","#f8766d")) + # 自定义颜色,将values更改成你想要的三个颜色
geom_hline(yintercept=-log10(PValue),linetype=2)+ # 在图上添加虚线
geom_vline(xintercept=c(-log2(FC),log2(FC)),linetype=2)+
theme_bw()
p
🎯 代码使用Tips
-
替换数据链接:将
read.csv()
中的URL改为你的数据地址 -
调整阈值:修改
FC_cutoff
和P_cutoff
控制红蓝点范围 -
在线运行:粘贴代码到RStudio Cloud立即生成结果
04
避坑指南|这3种图千万别乱用!
火山图不是玄学,而是基因故事的可视化翻译器!