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

R语言如何从ggplot绘制的密度图中提取指定位置的密度数值

提取ggplot分面密度图对应数值的方法

你可以通过两种方式获取目标数值:

方法1:直接提取ggplot内部计算好的密度数据

ggplot绘制的所有图层数据都可以通过ggplot_build()函数提取,密度值已经提前计算完成,不需要重复计算:

library(ggplot2)
set.seed(1234)
df = data.frame(
  fruits = factor(rep(c("Orange", "Apple", "Pears", "Banana"), each = 200)),
  weight = round(c(rnorm(200, mean = 55, sd=5),
                 rnorm(200, mean=65, sd=5),
                 rnorm(200, mean=70, sd=5),
                 rnorm(200, mean=75, sd=5)))
)

# 先保存ggplot对象
p <- ggplot(df, aes(x = weight)) +
  geom_density() + 
  facet_grid(fruits ~ ., scales = "free", space = "free")

# 提取图层计算数据
p_data <- ggplot_build(p)$data[[1]]
# 分面PANEL编号对应因子水平:1=Orange,2=Apple,3=Pears,4=Banana
fruit_levels <- levels(df$fruits)
p_data$fruits <- fruit_levels[p_data$PANEL]

# 提取weight=71对应的密度值,无精确匹配时用线性插值
get_density <- function(fruit_name, target_x=71){
  sub_data <- p_data[p_data$fruits == fruit_name,]
  approx(sub_data$x, sub_data$density, xout = target_x)$y
}

# 输出四类水果对应密度
sapply(fruit_levels, get_density)

运行上述代码会直接返回weight=71时四类水果的密度值,结果参考:

Orange         Apple         Pears        Banana 
1.305439e-08 2.082779e-03 6.741536e-02 5.319858e-02 

方法2:独立调用density函数计算

如果不需要依赖绘图对象,可以直接按分组计算密度,结果和ggplot默认计算逻辑一致:

# 按水果分组计算密度
density_list <- split(df$weight, df$fruits) |> 
  lapply(density)

# 提取71对应密度值
sapply(density_list, function(d) approx(d$x, d$y, xout=71)$y)

计算结果和方法1完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:57:01