2017-03-02 1 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)에 대한 농도를 플롯, I는 단일 라인을 그릴 수있는 방법이 차이를 보여준다 : 여기서 I는이 데이터 형식의 장난감 예는 배포판? I는 sp 밀도 분포로부터 dup 밀도 분포를 빼는 경우 상기 장난감 예에서

는, 얻어진 라인 아래 (작은 sp 값 풍부한이 있기 때문에) 플롯의 왼쪽에 제로 이상이어야하고 것 오른쪽에는 0이 표시됩니다 (더 큰 dup 값이 풍부하기 때문에). 유형이 dupsp 인 관측 수는 다를 수 있습니다.

더 일반적으로 비슷한 밀도 분포 사이의 차이점을 보여주는 가장 좋은 방법은 무엇입니까?

답변

3

ggplot에서이를 수행 할 수있는 방법이있을 수 있지만 사전에 계산을 수행하는 것이 가장 쉽습니다. 이 경우 q의 각 하위 집합에서 density을 동일한 범위에서 호출 한 다음 y 값을 뺍니다. dplyr를 사용

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

을 (기본 R 또는 원하는 경우 data.table에 번역)
관련 문제