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

