2015-02-06 79 views
3

我想分組的boxplots是由stat_summary定義的。隨着changing-whisker-definition幫助下,我寫了下面的代碼:ggplot:當使用stat_summary時,如何更改boxplot設置

# Data 
xdf2 <- data.frame(month = rep(1:6,each=100) 
        , grp = rep(c('A','B'), 50*6) 
       ) 
xdf2$m <- rpois(n=nrow(xdf2),10) 
# Definition of whiskers 
f <- function(x) { 
    r <- quantile(x, probs = c(0.10, 0.25, 0.5, 0.75, 0.90)) 
    names(r) <- c("ymin", "lower", "middle", "upper", "ymax") 
    r 
} 

# Add points outside of whiskers 
o <- function(x) { 
    subset(x, x < quantile(x,probs=0.1) | quantile(x,probs=0.9) < x) 
} 


# Plot 
ggplot(data = xdf2 
     , aes(factor(month),m, color=grp) 
     ) + 
     stat_summary(fun.data = f 
        , geom="boxplot" 
        , position=position_dodge(width=1) 
        , size=1 
        ) + 
     stat_summary(fun.y = o, geom="point", position=position_dodge(width=1)) + 
     scale_color_manual(values = c("gray30","darkgrey"),labels = c("AAA","BBB")) + 
     theme_bw() 

其給出以下圖表: enter image description here

有一些變化,我想執行:

  • 我怎樣才能改變盒子的寬度?
  • 如何填充邊框顏色相同的框?

我很樂意提供任何幫助。非常感謝。

+1

查看[此問題](https://stackoverflow.com/q/17479793/832693)。雖然它是用於條形圖,但在ggplot的「aes」中使用「width」也適用於箱形圖。出於某種原因,谷歌總是首先將我帶到這個問題上,可能是因爲它是最近的。 – 2017-06-27 13:43:33

回答

3

地圖fill審美grp併爲其添加一個類似的比例。我使用稍微不同的顏色使平均值可見。

要更改箱線寬度,請使用ggsave和各種width參數,箱線圖將自動調整。如果你想在兩者之間增加一些空間,你將不得不作弊,見下文。

這是不容易改變的寬度結合stat_summary:雖然有一個width參數geom_bargeom_boxplot,我不能使它與stat_summary正常工作。相反,我使用scale_x一些骯髒的技巧。

K <- length(unique(xdf2$month)) 
lev <- seq_len(1 + 2 * K) 

xdf2$month2 <- factor(2 * xdf2$month, 
         levels = lev) 

ggplot(data = xdf2, aes(month2, m, color = grp, fill = grp)) + 
    stat_summary(fun.data = f, geom="boxplot", 
       position=position_dodge(width=1.5), size=1) + 
    stat_summary(fun.y = o, geom="point", position=position_dodge(width=1.5)) + 
    scale_color_manual(values = c("gray30","darkgrey"),labels = c("AAA","BBB")) + 
    scale_fill_manual(values = c("gray20","grey75"),labels = c("AAA","BBB")) + 
    theme_bw() + 
    scale_x_discrete(limits = lev, breaks = 1:K*2, labels = 1:K) 

enter image description here

widthposition_dodge額外的調整。

+0

非常感謝!現在我得到了不錯的箱子。關於**寬度**:我想使框的寬度變窄以顯示月份之間的更多區別。 – giordano 2015-02-06 14:01:59

+1

@giordano這並不像我希望的那麼容易。但是,請參閱編輯,我認爲它會對您有用。 – tonytonov 2015-02-06 15:09:35

+0

非常感謝。你是一個很好的幫助。據我瞭解,你創建一個標籤2 *月和13級的因素。也許你可以給我一個提示爲什麼這個盒子更窄。 – giordano 2015-02-06 15:40:01