在转录组 Bulk 测序数据分析中,差异基因的筛选与可视化是关键步骤,而火山图作为直观展示基因表达差异的工具,其美观度与信息传递效率直接影响分析结果的呈现质量。本文将分享 10 种基于 R 语言的火山图绘制方法,涵盖从数据准备到代码实战的完整流程,适用于不同场景下的差异基因可视化需求。
一、火山图的应用场景与价值
火山图通过横轴(log2 Fold Change)展示基因在两组样本中的表达差异倍数,纵轴(-log10 P-value)展示差异的统计学显著性,能快速区分显著上调、显著下调及无显著差异的基因。在期刊论文、项目汇报中,高质量的火山图不仅能清晰传递分析结果,更能提升内容的专业性与可读性。
二、数据准备:基因表达矩阵格式要求
绘制火山图的前提是正确的基因表达矩阵,需满足以下格式规范:
- 第一列:基因名称(如 GeneSymbol);
- 第二列及以后:各样本的基因表达值(FPKM、TPM 或 Counts 均可);
- 第一行:样本名称(需按分组顺序排列,如 Normal 组在前,Disease 组在后)。
示例数据格式如下(简化版):
Gene | Normal1 | Normal2 | Disease1 | Disease2 |
---|---|---|---|---|
GeneA | 12.3 | 11.8 | 25.6 | 24.1 |
GeneB | 8.7 | 9.2 | 3.1 | 2.8 |
三、核心代码框架与使用说明
3.1 数据读取与预处理
首先需读取基因表达矩阵,代码中已内置差异基因分析流程(基于 DESeq2 或 edgeR 原理),无需额外预处理。核心读取代码如下:
# 读取基因表达矩阵(替换为你的文件路径)
data <- read.csv("gene_expression_matrix.csv", row.names = 1, check.names = FALSE)
3.2 样本信息配置
需根据实际样本分组情况配置样本信息,关键参数为each
(每组样本数量),示例如下:
# 配置样本分组(Normal组与Disease组,需与表达矩阵列顺序一致)
sample_info <- data.frame(
sample = colnames(data),
# 若Normal组3个样本、Disease组3个样本,each分别为3
condition = factor(rep(c("Normal", "Disease"), each = 3))
)
注意:表达矩阵样本顺序需与分组严格对应(如 Normal1、Normal2、...、Disease1、Disease2...),否则会导致差异分析结果错误。
四、10 种火山图风格及代码示例
以下为部分代表性风格的实现代码,完整 10 种风格可按需获取。所有代码基于 ggplot2 绘制,支持自定义颜色、标签及主题。
4.1 半透明密度风格
特点:通过密度轮廓线展示基因分布密度,点的半透明效果避免重叠遮挡,适合样本量较大的数据集。
# 半透明密度风格火山图
p6 <- ggplot(res_df, aes(x = log2FoldChange, y = log10p, color = sig)) +
geom_point(alpha = 0.3, size = 2) + # 点半透明,大小适中
geom_density_2d(color = "black", alpha = 0.5) + # 密度轮廓线
scale_color_manual(values = c("dodgerblue", "grey", "firebrick")) + # 下调、无差异、上调颜色
geom_hline(yintercept = -log10(0.05), linetype = "dashed") + # 显著性P值阈值线
geom_vline(xintercept = c(-1, 1), linetype = "dashed") + # 差异倍数阈值线
labs(title = "Density Contour Style", x = "Log2 Fold Change", y = "-Log10(p-value)") +
custom_theme # 自定义主题(包含字体、背景等设置)
print(p6)
4.2 杂志封面风格
特点:通过点的大小映射 P 值显著性(P 值越小,点越大),配色沉稳专业,适合期刊配图。
# 杂志封面风格火山图
p7 <- ggplot(res_df, aes(x = log2FoldChange, y = log10p, color = sig, size = -log10(pvalue))) +
geom_point(alpha = 0.7) + # 适度透明,避免视觉拥挤
scale_color_manual(values = c("#377eb8", "#999999", "#e41a1c")) + # 期刊常用配色
scale_size(range = c(1, 5)) + # 点大小范围控制
geom_hline(yintercept = -log10(0.05), linetype = "dashed") +
geom_vline(xintercept = c(-1, 1), linetype = "dashed") +
labs(title = "Magazine Cover Style", x = "Log2 Fold Change", y = "-Log10(p-value)") +
custom_theme +
theme(text = element_text(color = "black")) # 确保文本清晰可见
print(p7)
4.3 荧光霓虹风格
特点:高对比度荧光配色,适合用于汇报展示,突出关键差异基因。
# 荧光霓虹风格火山图
p8 <- ggplot(res_df, aes(x = log2FoldChange, y = log10p, color = sig)) +
geom_point(size = 2, alpha = 0.8) +
scale_color_manual(values = c("#00ffff", "#555555", "#ff00ff")) + # 霓虹蓝、灰色、霓虹粉
geom_hline(yintercept = -log10(0.05), linetype = "dashed") +
geom_vline(xintercept = c(-1, 1), linetype = "dashed") +
labs(title = "Neon Glow Style", x = "Log2 Fold Change", y = "-Log10(p-value)") +
custom_theme +
theme(text = element_text(color = "black"))
print(p8)
五、关键参数调整与自定义技巧
1. 阈值调整:默认以log2FoldChange ±1
和P-value < 0.05
为显著差异阈值,可通过修改geom_vline
和geom_hline
的xintercept
/yintercept
参数自定义。
2. 基因标签添加:如需在图中标记关键基因(如 Top 10 上调 / 下调基因),可通过geom_text
或ggrepel
包实现,示例代码框架:
# 标记显著上调的Top5基因
top_up <- res_df %>% filter(sig == "up") %>% arrange(pvalue) %>% head(5)
p + geom_text(data = top_up, aes(label = Gene), size = 3, vjust = -1)
3. 图片保存:使用ggsave
函数保存高清图片,支持 png、pdf 等格式:
ggsave("volcano_magazine_style.png", p7, width = 10, height = 8, dpi = 300)
六、总结
本文提供的 10 种火山图风格覆盖了期刊发表、汇报展示等多种场景,代码内置差异基因分析流程,无需额外预处理,仅需按实际数据格式调整参数即可快速使用。若在使用过程中遇到数据格式、样本分组或风格自定义问题,欢迎在评论区交流探讨。