如何使用ggplot将图例放置于多个分布峰值处?

3
我希望在R中,将每个柱状图的图例放在其峰值上方而不是图形右侧。让我用一个伪数据集来解释:
a <- rnorm(100, mean = 20, sd = 1)
b <- rnorm(100, mean = 22, sd = 1)
aleg <- rep("A",length(a))
bleg <- rep("B",length(b))
data <- data.frame(value=c(a,b), variable=c(lega,legb))
ggplot(data,aes(x=value, fill=variable)) + geom_density(alpha=0.25) + labs(fill="")

这将为您提供:

enter image description here

这是我想要的:

enter image description here

我有一个包含 ~8 种不同变量的大数据集。因此,我希望有一个快速的解决方案,而不是添加单个文本框。

谢谢!


1
也许可以获取曲线的值或预先计算它们(geom_density()使用什么算法以及如何提取曲线的点/方程?),并在geom_text中使用它们? - Henrik
1
还没有尝试过,但也许值得检查一下:ggpmisc::stat_peak - Henrik
1个回答

3
这个怎么样?
library(ggplot2)

set.seed(1)
a <- rnorm(100, mean = 20, sd = 1)
b <- rnorm(100, mean = 22, sd = 1)
aleg <- rep("A",length(a))
bleg <- rep("B",length(b))

data <- data.frame(value=c(a,b), variable=c(aleg,bleg))

labels <-
  lapply(split(data, data$variable), function(x){
    dens <- density(x$value)  # compute density of each variable

    data.frame(y = max(dens$y),  # get maximum density of each variable
               x = dens$x[which(dens$y == max(dens$y))],  # get corresponding x value
               label = x$variable[1])
  })

ggplot(data,aes(x=value, fill=variable)) + 
  geom_density(alpha=0.25) + 
  geom_text(data = do.call(rbind, labels), aes(x = x, y = y, label = label), 
            inherit.aes = F, 
            nudge_y = 0.03) +
  labs(fill="")


正是我所需要的! - wthimdh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接