RStudio中ggridges绘图空白且出现Picking joint bandwidth of NaN错误求助
问题原因及解决方法
问题根源
你遇到的空白图和Picking joint bandwidth of NaN提示,核心原因是每个分组(NoFct + para)仅包含1个数据点。密度曲线(density)的计算需要至少2个样本点来估算带宽和分布形态,单数据点无法生成有效的密度估计,因此ggridges无法绘制出任何内容。
查看你的长格式数据sample_long,每个No对应的nm和nm1各只有1个值,比如No=0时,para=nm有1个值,para=nm1也只有1个值,所有分组都是单数据点,自然无法计算密度。
解决方案
方案1:补充同组数据(推荐)
如果你的实际场景可以收集更多同组数据,比如每个No下的nm和nm1各有多个重复观测,就能正常生成密度曲线。以下是模拟补充数据的示例:
# 模拟每个No下各有5个重复数据 set.seed(123) sample_expanded <- sample %>% rowwise() %>% mutate( nm = list(rnorm(5, mean = nm, sd = 100)), nm1 = list(rnorm(5, mean = nm1, sd = 100)) ) %>% unnest(c(nm, nm1)) # 转换长格式并绘图 sample_long_expanded <- pivot_longer(sample_expanded, cols = c(nm, nm1), names_to = "para") sample_long_expanded %>% mutate(NoFct = fct_rev(as.factor(No))) %>% ggplot(aes(y = NoFct)) + geom_density_ridges( aes(x = value, fill = para), alpha = .8 )
方案2:改用适合单数据点的可视化方式
如果无法补充数据,换用能展示单数据点的几何层,比如结合geom_point或geom_jitter,也可以保留ggridges的主题风格:
示例1:用点展示每个分组的数值
sample_long %>% mutate(NoFct = fct_rev(as.factor(No))) %>% ggplot(aes(y = NoFct, x = value, color = para)) + geom_point(size = 3) + theme_ridges() # 保留ggridges的主题风格
示例2:用ridgeline模拟单数据点的"密度"(仅作展示)
如果一定要用ridgeline样式,可以强制设置极小带宽来模拟单数据点的尖峰:
sample_long %>% mutate(NoFct = fct_rev(as.factor(No))) %>% ggplot(aes(y = NoFct)) + geom_density_ridges( aes(x = value, fill = para), alpha = .8, bandwidth = 1, # 强制设置极小带宽 scale = 0.5 # 调整ridge高度 )
注:这种方式效果有限,仅适合必须用ridgeline风格的场景。
内容的提问来源于stack exchange,提问作者vigneshmoham
相关产品推荐
相关产品推荐

