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

时间:2017-03-02 19:20:00

标签: r plot ggplot2

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

os.cpus().length

如上所述,不是单独绘制每个类别(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() dup)的密度,而是如何绘制显示这些分布之间差异的单行?

在上面的玩具示例中,如果我从sp密度分布中减去dup密度分布,则生成的线将在图的左侧大于零(因为有丰富的较小的sp值)和右边的0(因为有大量的sp值)。并非可能存在类型dupdup的不同数量的观察结果。

更一般地说 - 显示相似密度分布之间差异的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

在ggplot中可能有一种方法可以做到这一点,但事先经常进行计算是最容易的。在这种情况下,请在density的每个子集上调用相同范围内的q,然后减去y值。使用dplyr(如果你愿意,转换为基数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