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

无y变量时为geom_density曲线x>0.05区间添加阴影的技术咨询

给geom_density的x>0.05区域添加阴影的解决方案

嘿,我懂你现在的困扰——当只有单个x变量时,给geom_density曲线下的特定区域加阴影确实比带y变量的情况麻烦些,很多现成方案都没覆盖这种场景。不过别慌,我给你准备了两种实用的方法,用你提供的数据集就能搞定:

首先先把你的数据集整理好(我补全了你没写完的最后一个值):

a <- c(-0.1125, -0.1405, -0.1038, -0.1246, -0.1381, -0.1281, -0.144, -0.1377, -0.1287, -0.1119, 
       -0.1553, -0.1578, -0.154, -0.1379, -0.1506, -0.1166, -0.09943, -0.1689, -0.1794, -0.1632, 
       -0.175, -0.1561, -0.114)

方法一:手动计算密度数据再填充

这种方法的核心是先把密度曲线的x和y值提取出来,变成带y变量的数据框,这样就能用常规的填充函数了:

library(ggplot2)

# 1. 计算密度并转换成数据框
dens_obj <- density(a)
dens_df <- data.frame(x = dens_obj$x, y = dens_obj$y)

# 2. 筛选x>0.05的区域,同时补充x=0.05处的y值(避免阴影缺口)
shade_region <- subset(dens_df, x > 0.05)
# 用插值法补全x=0.05对应的y值
shade_region <- rbind(
  data.frame(x = 0.05, y = approx(dens_df$x, dens_df$y, xout = 0.05)$y),
  shade_region
)

# 3. 绘制曲线+阴影
ggplot() +
  geom_density(data = data.frame(a = a), aes(x = a), color = "darkgray", linewidth = 1) +
  geom_area(data = shade_region, aes(x = x, y = y), fill = "#2196F3", alpha = 0.4) +
  theme_minimal()

方法二:直接用stat_density的subset参数(更简洁)

如果你不想手动处理密度数据,可以直接在ggplot里用stat_density结合subset参数,让它自动计算并填充指定区域:

ggplot(data = data.frame(a = a), aes(x = a)) +
  geom_density(color = "darkgray", linewidth = 1) +
  stat_density(
    geom = "area", 
    fill = "#2196F3", 
    alpha = 0.4,
    subset = .(a > 0.05)  # 直接筛选x>0.05的区域
  ) +
  theme_minimal()

注意事项

你提供的数据集里所有值都是负数,x>0.05的区域其实没有密度(密度值为0),所以阴影会看不到。你可以测试的时候给a加几个大于0.05的值,比如:

a <- c(a, 0.06, 0.07, 0.08, 0.1)

这样就能看到清晰的阴影效果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:22:31