如何让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
相关产品推荐
相关产品推荐

