2016-12-05 4 views
0

는 다음과 같은 데이터를 고려플롯의 차이는

set.seed(4235) 
dates <- c("2016-01-01", "2015-01-01", "2014-01-01", "2013-01-01") 
small <- data.frame(group = "small", n1 = rnorm(4), dates = as.Date(dates)) 
medium <- data.frame(group = "medium", n1 = rnorm(4), dates = as.Date(dates)) 
large <- data.frame(group = "large", n1 = rnorm(4), dates = as.Date(dates)) 

data <- rbind(small, medium, large) 

이 이렇게 그릴 수 있습니다 아주 기본적인 데이터입니다 :

ggplot(data, aes(dates, col = group)) + 
    geom_line(aes(y = n1)) 

enter image description here

그러나

, 그 내가 상상 큰 그룹에 대해 중소 그룹을 계획하고 싶습니다. 즉, 중소 그룹과 대형 그룹의 차이. 즉, 큰 그룹은 0 주위의 직선으로 나타내야하고 다른 그룹은 차이를 나타내야합니다. 자기 공분산 계획과 같은 것.

enter image description here

ggplot이 작업을 수행하는 방법에 대한 어떤 생각?

답변

1

ggplot과 직접 비교할 수는 없지만 먼저 차이를 계산 한 다음 ggplot으로 다시 전달하십시오.

여기서는 tidyrdplyr을 사용하여 조작합니다. 첫째, 데이터를 분산하여 그룹을 자신의 열 (날짜 당 하나의 행)로 가져와 비교할 수있게합니다. 그런 다음 관심있는 차이 변수를 만들려면 mutate을 입력하십시오. 마지막으로, 나는 gather 비교를 긴 형식으로 되 돌린다 (이것은 small, mediumlarge의 항목을 복제하지만, 필요한 경우 select으로 삭제할 수 있음을주의해야 함). 그런 다음 결과를 ggplot에 전달하고 원하는대로 그림을 그립니다 (여기서는 단순한 선).

data %>% 
    spread(group, n1) %>% 
    mutate(large - medium 
     , large - small) %>% 
    gather(Comparison, Difference, `large - medium`, `large - small`) %>% 
    ggplot(aes(x = dates 
      , y = Difference 
      , col = Comparison)) + 
    geom_line() 

을 제공합니다

이 또한해야

enter image description here

0

작동 :

library(reshape2) 
df <- dcast(data, dates~group, value.var = 'n1') 
df$diff.small <- df$small - df$large 
df$diff.medium <- df$medium - df$large 
df$large <- 0 
data <- subset(melt(df, id='dates'), variable %in% c('diff.small', 'diff.medium', 'large')) 
ggplot(data, aes(dates, fill = variable, col = variable)) + 
    geom_ribbon(aes(ymax=value, ymin=0), alpha=0.2) + 
    geom_line(aes(y = value)) 

enter image description here