2016-12-05 58 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

但是,想象一下我想要將這個中小型企業與大集團進行對比。換句話說,中小企業與大企業的差異。換句話說,大羣體應該用一條圍繞零的直線表示,其他羣體應該代表差異。像自動協變圖。

enter image description here

如何與ggplot做到這一點任何想法?

回答

1

你可能不能直接用ggplot來做,儘管首先計算差異相對簡單,然後將它們傳回ggplot

在這裏,我使用tidyrdplyr來進行操作。首先,我傳播數據以獲得各自的列中的組(每個日期有一行)以允許比較。然後,我mutate創建感興趣的差異變量。最後,我再次將這些比較變成長格式(需要注意的是,這會複製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