使用geom_density_ridges绘制带条件填充的连续密度脊图问题
解决密度脊图条件填充断裂问题
你遇到的问题是因为直接用fill = values > 0会让ggplot将每个类别(recipe)按填充条件再次分组,导致脊图被拆分成多个片段。要实现连续脊图的交替填充,需要用支持渐变填充的几何对象,并基于密度曲线的x轴值来判断填充条件,具体步骤如下:
修正后的代码
library(tidyverse) library(ggridges) set.seed(123) # 设置随机种子保证结果可复现 tibble( A = rnorm(4e3, 0, .25), B = rnorm(4e3, 0.2, .25), C = rnorm(4e3, 0.4, .25), ) |> pivot_longer( everything(), names_to = 'recipe', values_to = 'values' ) |> ggplot(aes(x = values, y = recipe)) + stat_density_ridges( geom = "ridgeline_gradient", # 使用支持渐变填充的几何对象 rel_min_height = 0.005, aes(fill = after_stat(x > 0), group = recipe) # 基于密度曲线的x值判断填充,确保分组正确 ) + scale_y_discrete(expand = c(0.01, 0)) + scale_x_continuous(expand = c(0.01, 0)) + scale_fill_manual(values = c("#636363", "#bdbdbd")) # 自定义正负区域填充色 theme_ridges()
关键说明
geom = "ridgeline_gradient":这是实现连续脊图渐变填充的核心,替代默认的geom_density_ridges(仅支持离散填充)。after_stat(x > 0):使用密度计算后的x轴值(而非原始样本值)来判断填充条件,确保填充是沿密度曲线的x轴范围划分的。group = recipe:强制每个recipe作为独立分组,避免被填充条件拆分,保证脊图的连续性。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

