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

如何让geom_density_ridges中的分位数线完全透明至背景

解决geom_density_ridges分位数线仅对背景透明的问题

首先是模拟数据集:

rawdata <- data.frame(Score = rnorm(1000, seq(1, 0, length.out = 10), sd = 1),
                      Group = rep(LETTERS[1:3], 10000))
rawdata$Score <- ifelse(rawdata$Group == "A", rawdata$Score+2,rawdata$Score) 
rawdata$Score <- ifelse(rawdata$Group == "C", rawdata$Score-2,rawdata$Score)

stdev <- c(10.78,10.51,9.42)
col <- c("#004d8d", "#cc2701", "#e5b400") 

原代码实现了带白色分位数线的密度脊图,但需求是让白色分位数线仅对背景透明——也就是线条能“穿透”半透明的密度填充层,显示出后面的灰色背景。直接设置vline_color = "transparent"会让线条完全消失,达不到效果。

解决方案:拆分密度脊与分位数线的绘制

核心思路是把密度填充和分位数线分开绘制,通过调整图层顺序让线条透过半透明填充显示背景:

p <- ggplot(rawdata, aes(x = Score, y = Group)) +
  scale_y_discrete() +
  # 绘制灰色背景矩形
  geom_rect(inherit.aes = FALSE, mapping = aes(ymin = 0, ymax = Inf, xmin = -0.1 * min(stdev), xmax = 0.1 * max(stdev)), 
            fill = "grey", alpha = 0.5) +
  # 第一步:仅绘制白色分位数线,不填充密度区域
  geom_density_ridges(scale = -0.5, size = 1, show.legend = FALSE,
                      quantile_lines = TRUE, quantiles = c(0.025, 0.975), 
                      vline_color = "white", fill = NA) +
  # 第二步:绘制半透明的密度填充层,不加分位数线
  geom_density_ridges(scale = -0.5, size = 1, alpha=0.5, show.legend = FALSE,
                      aes(fill = Group)) +
  scale_color_manual(values = col) +   
  scale_fill_manual(values = col) +
  labs(title="Toy Graph", y="Group", x="Value") +
  coord_flip(xlim = c(-8, 8), ylim = NULL, expand = TRUE, clip = "on")

p

关键说明

  • 第一遍geom_density_ridges设置fill = NA,只生成白色分位数线,图层顺序在填充层之前,会被半透明的填充层覆盖,但因为填充有alpha=0.5,线条会透过填充显示出后面的灰色背景,实现“仅对背景透明”的效果。
  • 第二遍geom_density_ridges去掉分位数线相关参数,仅绘制带颜色的半透明密度填充。

这样调整后,白色分位数线既能透过密度填充看到背景,又不会消失,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:45:29