2017-03-02 74 views
4

我想用ggplot2来说明两个相似的密度分布之间的差异。这里是我的数据的类型的玩具例如:如何绘制两个ggplot密度分布之间的差异?

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值的丰度)和下面0在右边(因为有大量的dup值)。并不是说可能有不同数量的dupsp类型的观测值。

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

回答

3

在ggplot中可能有这样做的方法,但通常事先做好计算是最容易的。在这种情况下,请在相同范围内调用densityq的每个子集,然后减去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