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

发布于:2025-07-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

在转录组 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 ±1P-value < 0.05为显著差异阈值,可通过修改geom_vlinegeom_hlinexintercept/yintercept参数自定义。

2. 基因标签添加:如需在图中标记关键基因(如 Top 10 上调 / 下调基因),可通过geom_textggrepel包实现,示例代码框架:

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


网站公告

今日签到

点亮在社区的每一天
去签到