如何绘制两个ggplot密度分布之间的差异?

5

我想使用ggplot2来说明两个类似密度分布之间的差异。这是一个我所拥有数据类型的玩具示例:

library(ggplot2)

# Make toy data
n_sp  <- 100000
n_dup <- 50000
D <- data.frame( 
    event=c(rep("sp", n_sp), rep("dup", n_dup) ), 
    q=c(rnorm(n_sp, mean=2.0), rnorm(n_dup, mean=2.1)) 
)

# Standard density plot
ggplot( D, aes( x=q, y=..density.., col=event ) ) +
    geom_freqpoly()

与其分别为每个类别(dupsp)绘制密度图,如上所示,我该如何绘制一条单独的线来显示这些分布之间的差异?
在上面的玩具示例中,如果我从sp密度分布中减去dup密度分布,则结果线将在绘图左侧上方(因为较小的sp值很多)并在右侧下方(因为较大的dup值很多)。请注意,类型dupsp的观察数量可能不同。
更一般地说,展示类似密度分布之间的差异的最佳方法是什么?
1个回答

3

可能有一种方法可以在ggplot中完成这个任务,但通常最简单的方法是先进行计算。在这种情况下,对于q的每个子集,在相同的范围内调用density,然后减去y值。使用dplyr(如果您愿意,可以将其翻译为base R或data.table),

library(dplyr)
library(ggplot2)

D %>% group_by(event) %>% 
    # calculate densities for each group over same range; store in list column
    summarise(d = list(density(q, from = min(.$q), to = max(.$q)))) %>% 
    # make a new data.frame from two density objects
    do(data.frame(x = .$d[[1]]$x,    # grab one set of x values (which are the same)
                  y = .$d[[1]]$y - .$d[[2]]$y)) %>%    # and subtract the y values
    ggplot(aes(x, y)) +    # now plot
    geom_line()

plot of subtracted densities


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