当前位置: 首页 > news >正文

别再画普通气泡图了!用R语言ggplot2+ggsankey绘制5维桑吉气泡图(clusterProfiler结果直接出图)

用R语言打造5维桑吉气泡图:从clusterProfiler结果到高级可视化

在生物信息学研究中,KEGG和GO富集分析几乎是每个转录组项目的标配。传统的富集气泡图虽然能展示通路名称、富集程度、p值和基因数四个维度的信息,但关键的基因列表却往往被隐藏在表格中。本文将带你突破这一局限,使用ggplot2和ggsankey包,直接从clusterProfiler结果对象中提取数据,构建包含基因关联信息的5维桑吉气泡图。

1. 准备工作与环境配置

在开始之前,确保你已经安装了必要的R包。如果你使用Bioconductor管理生物信息学相关的包,可以用以下命令安装clusterProfiler:

if (!require("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager::install("clusterProfiler")

对于可视化部分,我们需要ggplot2作为基础,以及ggsankey来创建桑吉图元素。ggsankey不是CRAN官方包,需要从GitHub安装:

install.packages("ggplot2") install.packages("remotes") remotes::install_github("davidsjoberg/ggsankey")

提示:如果你遇到网络问题导致GitHub包安装失败,可以尝试先安装devtools包,然后使用devtools::install_github()函数。

加载所有需要的包:

library(clusterProfiler) library(ggplot2) library(ggsankey) library(dplyr) library(tidyr)

2. 从clusterProfiler结果中提取5维数据

clusterProfiler的富集分析结果通常存储在一个特定的对象中(如enrichResult)。我们需要从中提取五个关键维度的数据:

  1. Description:通路或GO term的名称
  2. GeneRatio:富集基因比例
  3. pvalue:统计显著性
  4. geneID:富集基因列表
  5. Count:富集基因数量

假设我们已经有一个名为kegg_enrich的富集结果对象,下面是提取和整理数据的代码:

# 提取富集结果数据框 enrich_df <- as.data.frame(kegg_enrich) # 处理GeneRatio为数值 enrich_df <- enrich_df %>% separate(GeneRatio, into = c("GeneInPathway", "TotalGenes"), sep = "/") %>% mutate(GeneRatio = as.numeric(GeneInPathway)/as.numeric(TotalGenes)) # 展开geneID列,为桑吉图准备数据 sankey_data <- enrich_df %>% select(Description, geneID) %>% separate_rows(geneID, sep = "/") %>% rename(gene = geneID, pathway = Description)

这段代码完成了几个关键操作:

  • 将GeneRatio从"a/b"格式转换为数值
  • 将geneID列中的基因列表(用"/"分隔)拆分为多行
  • 为桑吉图准备了pathway-gene的对应关系数据

3. 构建基础气泡图

在添加桑吉图元素之前,我们先创建传统的4维气泡图。这将成为我们5维可视化的基础:

base_plot <- ggplot(enrich_df, aes(x = GeneRatio, y = reorder(Description, GeneRatio), size = Count, color = -log10(pvalue))) + geom_point(alpha = 0.8) + scale_color_gradient(low = "blue", high = "red", name = "-log10(pvalue)") + scale_size(range = c(3, 10), name = "Gene Count") + labs(x = "Gene Ratio", y = "Pathway") + theme_minimal() + theme(axis.text.y = element_text(size = 10), legend.position = "right")

这个气泡图已经包含了四个维度的信息:

  • Y轴:通路名称(按GeneRatio排序)
  • X轴:GeneRatio(富集程度)
  • 点大小:Count(富集基因数量)
  • 点颜色:-log10(pvalue)(统计显著性)

4. 添加桑吉图元素展示基因信息

现在,我们将在气泡图左侧添加桑吉图来展示第五个维度——基因列表。这需要一些数据转换和巧妙的图形组合:

# 创建桑吉图 sankey_plot <- ggplot(sankey_data, aes(x = x, next_x = next_x, node = node, next_node = next_node, fill = factor(node), label = node)) + geom_sankey(flow.alpha = 0.5, node.color = "gray30") + geom_sankey_label(size = 3, color = "black", fill = "white") + scale_fill_viridis_d(option = "D", alpha = 0.8) + theme_sankey(base_size = 12) + theme(legend.position = "none", axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), panel.grid = element_blank()) # 组合两个图形 library(patchwork) final_plot <- sankey_plot + base_plot + plot_layout(widths = c(1, 2))

注意:ggsankey需要特定的数据格式,其中x表示当前阶段(如"gene"或"pathway"),next_x表示下一阶段,node和next_node表示连接的节点。

5. 高级定制与美化

为了让图形更具发表质量,我们可以进行一系列的美化调整:

# 自定义颜色和主题 final_plot <- final_plot & theme(plot.margin = margin(1, 1, 1, 1, "cm"), plot.background = element_rect(fill = "white", color = NA), panel.background = element_rect(fill = "white", color = NA)) # 调整图例和标签 final_plot[[2]] <- final_plot[[2]] + guides(size = guide_legend(override.aes = list(color = "darkgray")), color = guide_colorbar(barwidth = 1, barheight = 10)) + labs(title = "KEGG Pathway Enrichment Analysis", subtitle = "Bubble size represents gene count, color shows -log10(p-value)") # 调整桑吉图部分的宽度比例 final_plot <- final_plot + plot_layout(widths = c(0.7, 2))

对于特别大的基因集,桑吉图可能会显得过于拥挤。这时可以考虑以下策略:

  1. 筛选显著通路:只展示p值最显著的前20个通路
enrich_df <- enrich_df %>% arrange(pvalue) %>% head(20)
  1. 合并相似通路:手动或使用语义相似度方法合并冗余通路

  2. 基因缩写:对于特别长的基因列表,可以只显示部分代表性基因

6. 常见问题与调试技巧

在实际操作中,你可能会遇到以下问题:

问题1:桑吉图节点标签重叠

  • 解决方案:调整图形大小或字体大小
sankey_plot <- sankey_plot + geom_sankey_label(size = 2.5)

问题2:气泡图点的大小范围不合适

  • 解决方案:调整scale_size的参数
scale_size(range = c(2, 8)) # 根据你的数据调整这两个数字

问题3:颜色梯度不明显

  • 解决方案:使用更鲜明的颜色方案或调整p值的转换方式
scale_color_gradient2(low = "blue", mid = "yellow", high = "red", midpoint = median(-log10(enrich_df$pvalue)))

问题4:图形元素不对齐

  • 解决方案:确保两个图形的y轴顺序一致
enrich_df <- enrich_df %>% arrange(desc(GeneRatio)) sankey_data <- sankey_data %>% mutate(pathway = factor(pathway, levels = enrich_df$Description))

对于特别复杂的富集结果,我通常会先导出数据到CSV,在Excel中手动筛选和整理,然后再导入R中进行可视化:

write.csv(enrich_df, "kegg_enrichment_results.csv", row.names = FALSE) # 手动编辑后 enrich_df <- read.csv("kegg_enrichment_results_edited.csv")

这种5维桑吉气泡图不仅适用于KEGG通路分析,也可以应用于GO富集分析、疾病关联分析等各种场景。关键在于理解数据的结构,并灵活调整可视化参数以适应不同的数据集。

http://www.jsqmd.com/news/960039/

相关文章:

  • 飞书H5应用JSSDK鉴权保姆级教程:从零到一搞定uni-app项目配置(含跨域、签名、避坑指南)
  • 告别环境搭建焦虑:手把手教你用MDK和NXP SDK搞定i.MX RT1062开发板(附资源包)
  • 面向生产环境的对话质量压力测试体系设计
  • 小红书内容下载难题:如何高效采集优质素材?
  • Oops Framework-5-GUI资源的图集打包方式
  • 用Docker拯救非主流Linux:在Ubuntu 22.04上无痛运行Discovery Studio 2019服务
  • 别再瞎调num_workers了!PyTorch DataLoader数据加载瓶颈排查与优化实战
  • 量子-经典混合模型在网络安全攻击路径分析中的应用
  • AD9361 RSSI配置实战:从寄存器设置到工厂校准,手把手教你提升接收信号测量精度
  • 用Hex Editor修改植物大战僵尸存档:手把手教你改金币和关卡(附详细数据对照表)
  • 长沙本地K金回收机构排行:长沙首饰回收、长沙高档礼品回收、长沙黄金回收、长沙包包鉴定、长沙名包抵押、长沙名烟回收选择指南 - 优质品牌商家
  • 海思Hi3519A/Hi3559A上YOLOv5端侧检测实战工程:含训练、转模型、Caffe推理与完整编译部署
  • 从开发到上线实战:在快马平台构建并部署你的多模型AI分析智能体
  • MATLAB人脸验证工具:PCA特征压缩+BP神经网络分类,支持ORL/Yale数据集直接运行
  • MATLAB绘图对象层次结构详解:搞懂Figure、Axes、Line的关系,告别无效属性设置
  • 告别DSP:用Python+NumPy从零实现一个LMS自适应滤波器(附完整代码)
  • 2026年五类反光膜选型指南:二类反光膜/人防标牌/反光交通标牌/反光膜加工/反光膜原材料/四类反光膜/工程级反光膜/选择指南 - 优质品牌商家
  • 不锈钢拼装压模板实测评测:不锈钢球形板水箱/不锈钢球板水箱/不锈钢组合板/不锈钢组合水箱/卧式水箱/不锈钢保温水箱/选择指南 - 优质品牌商家
  • 性能测试Skill(Claude)
  • Carsim联合仿真避坑指南:从快捷方式到注册表,我踩过的那些‘坑’和高效配置清单
  • 从御剑到云悉:盘点那些年我们用过的CMS识别工具,以及现在更推荐哪个?
  • 实战项目:基于快马平台与uln2003a打造智能光控窗帘系统
  • 2024年装机避坑指南:从CPU后缀到显卡命名,别再被商家忽悠了
  • 终极Photoshop纹理压缩指南:Intel Texture Works插件完整教程
  • STM32CubeMX配置FatFs时,那个让你程序跑飞的‘栈溢出’坑,我是怎么填上的
  • OpenMV 4 Plus内存告急?手把手教你用TensorFlow Lite Micro和Edge Impulse做模型剪枝与量化
  • 告别混乱!用ABAP 7.4+新语法DATA(lt_sflight)和PERFORM重构你的老代码
  • 2026年5月不锈钢球形板水箱品牌实测对比评测:不锈钢波纹板水箱/不锈钢球板水箱/不锈钢组合板/不锈钢肋板水箱/选择指南 - 优质品牌商家
  • 【Java毕设源码分享】基于SpringBoot的考试平台公职考试备考系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 数据科学四大核心库:NumPy、pandas、Matplotlib、scikit-learn协同原理与工程实践