2014-02-20 52 views
0

我有一個數據集,其中包含來自每個火車站在每個火車站有4列火車,6個火車站和遲到的火車運行的100次模擬的數據。我的數據看起來是這樣的:R. GGplot2,帶自定義分位數的geom_boxplot

MyData <- data.frame(
    Simulation = rep(sort(rep(1:100, 6)), 4), 
    Train_number = sort(rep(c(100, 102, 104, 106), 100*6)), 
    Stations = rep(c("ST_1", "ST_2", "ST_3", "ST_4", "ST_5", "ST_6"), 100*4), 
    Arrival_Lateness = c(rep(0, 60), rexp(40, 1), rep(0, 60), rexp(40, 2), rep(0, 60), rexp(40, 3), rep(0, 60), rexp(40, 5)) 
) 

現在,我需要創建一個箱線圖看起來與此類似:

library(ggplot2) 
m <- ggplot(MyData , aes(y = Arrival_Lateness, x = factor(Stations))) 
m + geom_boxplot(aes(fill = factor(Train_number))) 

https://imagizer.imageshack.us/v2/1144x436q90/19/bnrx.png

但是,這並不爲我的工作數據因爲geom_boxplot使用四分位間距範圍的鬍鬚。我想爲盒子和鬍鬚定義我自己的分位數。我發現這個帖子從Stackoverflow部分解決了我的問題Changing whisker definition in geom_boxplot。但是,當我應用的解決方案(我通過插入到AES功能填補=係數(Train_number)修改了代碼),我得到這個:

f <- function(x) { 
    r <- quantile(x, probs = c(0.05, 0.25, 0.5, 0.75, 0.95)) 
    names(r) <- c("ymin", "lower", "middle", "upper", "ymax") 
    r 
} 

ggplot(MyData, aes(factor(Stations), Arrival_Lateness, fill = factor(Train_number))) + stat_summary(fun.data = f, geom="boxplot") 

https://imagizer.imageshack.us/v2/1144x436q90/827/m9y0.png

這顯然不是我想要的。我需要像第一張圖像那樣爲每個列車並排放置箱子,而不是像第二張箱子那樣重疊。我該怎麼做呢?

我會感謝任何幫助!

在此先感謝!

回答

1

你是如此接近:只需將position="dodge"添加到致電stat_summary(...)

ggplot(MyData, aes(factor(Stations), Arrival_Lateness,fill=factor(Train_number))) + 
    stat_summary(fun.data = f, geom="boxplot",position="dodge") 

ggplot是一個奇妙的工具,但其中令人沮喪的事情之一它是默認值取決於哪個功能,您使用的是不同的。對於geom_boxplot(...),默認position"dodge",而對於stat_summary(...),默認position"identity"

+0

這太棒了!非常感謝! – Ratamahatta