R语言富集数据框melt转换后绘制分类气泡图问题求助
你最初绘图错误的核心原因是冗余使用了melt()函数,你的原始数据已经是符合要求的结构化长表格式,可直接作为ggplot输入,melt操作反而将Category、LogP两个字段转为变量值,导致x轴展示字段名而非你需要的两个通路分组。
以下是可实现你需求的完整代码:
第一步:数据预处理
library(tidyverse) library(data.table) # 加载你的原始数据后先做清洗 df_clean <- df %>% # 去重:保留每个Category+Description组合的唯一记录(你原始数据中重复项的LogP完全一致) distinct(Category, Description, .keep_all = TRUE) %>% # 按通路数据库分组,取Top10最显著的通路 group_by(Category) %>% slice_min(order_by = LogP, n = 10) %>% ungroup() %>% # 对通路名称做因子排序,按显著性从高到低排列 mutate(Description = fct_reorder(Description, LogP, .desc = FALSE)) # 自定义配色,对应两个分组 colours = c("KEGG Pathway" = "#A54657", "Reactome Gene Sets" = "#582630")
第二步:绘制气泡图(图例放置在图内)
ggplot(df_clean, aes(x = Category, y = Description)) + geom_point(aes(size = abs(LogP), fill = Category), alpha = 0.75, shape = 21, stroke = 0.8) + # 调整气泡大小范围,更美观 scale_size_continuous(range = c(3, 15), name = "-log10(P)") + # 自定义填充色 scale_fill_manual(values = colours, name = "通路数据库") + # 翻转y轴顺序,最显著的通路放在最上方 scale_y_discrete(limits = rev(levels(df_clean$Description))) + labs(x = NULL, y = "通路名称") + theme_bw() + theme( axis.text.x = element_text(colour = "black", size = 12, face = "bold"), axis.text.y = element_text(colour = "black", face = "bold", size = 11), legend.text = element_text(size = 10, face ="bold", colour ="black"), legend.title = element_text(size = 12, face = "bold"), panel.border = element_rect(colour = "black", fill = NA, size = 1.2), # 设置图例在图内的坐标,可根据实际布局调整数值 legend.position = c(0.85, 0.2), legend.background = element_rect(fill = "white", color = "black", size = 0.6) )
关键调整说明
- 直接以
Category作为x轴映射,自然得到KEGG Pathway、Reactome Gene Sets两个分组的x轴刻度 - 对LogP取绝对值映射气泡大小,符合常规富集分析气泡图的展示逻辑:显著性越高,气泡越大
- 通过
legend.position参数设置图例坐标,放在图内空白区域,节省排版空间,数值可根据实际出图效果灵活调整
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

