gpt4 book ai didi

r - ggplot2:如何将样本数添加到密度图中?

转载 作者:行者123 更新时间:2023-12-04 14:26:10 26 4
gpt4 key购买 nike

我正在尝试生成标有样本大小的(分组)密度图。

示例数据:

set.seed(100)
df <- data.frame(ab.class = c(rep("A", 200), rep("B", 200)),
val = c(rnorm(200, 0, 1), rnorm(200, 1, 1)))

未标记的密度图已生成,如下所示:

ggplot(df, aes(x = val, group = ab.class)) +
geom_density(aes(fill = ab.class), alpha = 0.4)

Density example

我想做的是在每个密度峰值附近的某处添加文本标签,显示每个组中的样本数。但是,我找不到正确的选项组合来以这种方式总结数据。

我尝试将此答案中建议的代码改编为箱线图上的类似问题:https://stackoverflow.com/a/15720769/1836013

n_fun <- function(x){
return(data.frame(y = max(x), label = paste0("n = ",length(x))))
}

ggplot(df, aes(x = val, group = ab.class)) +
geom_density(aes(fill = ab.class), alpha = 0.4) +
stat_summary(geom = "text", fun.data = n_fun)

但是,这会失败并显示 Error: stat_summary requires the following missing aesthetics: y

我还尝试在 aes() 中为每个 geom_density() 添加 y = ..density.. stat_summary() 层,以及 ggplot() 对象本身……这些都没有解决问题。

我知道这可以通过为每个组手动添加标签来实现,但我希望有一个通用的解决方案,例如允许通过 aes() 设置标签颜色以匹配密度。

我哪里错了?

最佳答案

fun.data返回的y不是aes。 stat_summary 提示找不到y,应该在ggplot(df, aes(x = val, group = ab.class, y =stat_summary(aes(y = 如果 y 的全局设置不可用。fun.data 计算显示位置point/text/... at each x based on y given in the data through aes. (我不确定我是否做了这么清楚。不是以英语为母语的人)。

即使您通过 aes 指定了 y,您也不会得到想要的结果,因为 stat_summary 计算了一个 y 在每个 x

但是,您可以通过geom_textannotate 将文本添加到所需位置:

# save the plot as p
p <- ggplot(df, aes(x = val, group = ab.class)) +
geom_density(aes(fill = ab.class), alpha = 0.4)

# build the data displayed on the plot.
p.data <- ggplot_build(p)$data[[1]]

# Note that column 'scaled' is used for plotting
# so we extract the max density row for each group
p.text <- lapply(split(p.data, f = p.data$group), function(df){
df[which.max(df$scaled), ]
})
p.text <- do.call(rbind, p.text) # we can also get p.text with dplyr.

# now add the text layer to the plot
p + annotate('text', x = p.text$x, y = p.text$y,
label = sprintf('n = %d', p.text$n), vjust = 0)

enter image description here

关于r - ggplot2:如何将样本数添加到密度图中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43207655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com