You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ggplot2绘制分层火山图:让目标通路点置于灰色背景点上方

解决GSEA火山图彩色点被灰色点遮挡的问题

核心思路

ggplot的图层是按代码顺序叠加的,后绘制的图层会显示在之前的图层上方。因此只需分开绘制两组点:先画灰色的Other组作为背景,再画彩色的关注组作为前景,就能彻底解决遮挡问题。同时调整灰色点的透明度,让其数量分布更易辨识。

修改后的完整代码

suppressPackageStartupMessages(library(tidyverse)) 

# 数据预处理:用case_when替代嵌套ifelse,代码更简洁易读
gseaRes <- gseaRes %>%  
  mutate(group = case_when(
    str_detect(pathway, "blabla1") ~ "group1",
    str_detect(pathway, "blabla2") ~ "group2",
    str_detect(pathway, "blabla3") ~ "group3",
    str_detect(pathway, "blabla4") ~ "group4",
    str_detect(pathway, "blabla5") ~ "group5",
    TRUE ~ "Other"
  ))

# 分层绘制火山图
ggplot() +
  # 第一步:绘制灰色背景点(Other组),调整alpha让数量更易辨识
  geom_point(data = filter(gseaRes, group == "Other"),
             aes(x = -log10(padj), y = NES, size = size),
             color = "grey30", alpha = 0.1) +
  # 第二步:绘制彩色关注组点(叠加在灰色点上方)
  geom_point(data = filter(gseaRes, group != "Other"),
             aes(x = -log10(padj), y = NES, size = size, color = group),
             alpha = 1) +
  # 设置关注组的颜色映射
  scale_color_manual(values = c(
    "group1" = "violetred",
    "group2" = "royalblue1",
    "group3" = "orange",
    "group4" = "cyan",
    "group5" = "tomato4"
  )) +
  theme_classic()

关键细节说明

  • 分开调用geom_point:第一个仅处理Other组,第二个处理所有关注组,利用ggplot的图层顺序实现前景/背景分层。
  • 调整灰色点的alpha:将原来的0.02改为0.1,既能避免过度遮挡,又能清晰看出灰色点的整体数量分布。
  • 用case_when优化数据分组:比嵌套ifelse更简洁,后续新增分组时修改更方便。

内容的提问来源于stack exchange,提问作者MariaK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:55:18