R 语言绘制 10 种精美火山图:转录组差异基因可视化

在转录组 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 种火山图风格覆盖了期刊发表、汇报展示等多种场景,代码内置差异基因分析流程,无需额外预处理,仅需按实际数据格式调整参数即可快速使用。若在使用过程中遇到数据格式、样本分组或风格自定义问题,欢迎在评论区交流探讨。

相关推荐
时早玖沐2 分钟前
KOOK「找不到语音频道」:同一个错误假设,我犯了三次
python·开源·ai编程
_冷眸_4 分钟前
Python 调用大模型 API:最小请求、Base URL 和 401/404 排查
开发语言·人工智能·python
Dumbness23 分钟前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
甜到心里的蛋糕29 分钟前
从 QQ 机器人到 B 站 AI 运营:一套可复现的视频流水线踩坑实录
运维·人工智能·python·自动化·视频制作
张驰咨询公司32 分钟前
六西格玛Python DOE试验矩阵:3因子2水平生成与验算
python·六西格玛·实验设计·itertools·doe试验矩阵
像风一样自由20201 小时前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
田里的水稻1 小时前
FA_CNN卷积神经网络十八---感知机到多层感知机PyTorch
人工智能·pytorch·python
終不似少年遊*2 小时前
【Skill】为中型研发团队制作的敏捷迭代AI副驾Skill
人工智能·python·华为云·agent·ai编程·skill
呆萌的代Ma2 小时前
python使用ThreadPoolExecutor自带队列将多线程变串行执行
python