2016-11-15 82 views
1

我想繪製某種框圖,顯示我的數據的中值。與常規Box-Plot相比,我想將該框擴展爲我的數據的最小值和最大值,而不是四分位數。 實施例:自定義R框 - 陰謀

x <- c(1,3,5,7,9) 

x的一個普通的箱線圖將具有以下數據:

  • 1:低級晶須
  • 3:箱
  • 的下端
  • 5:中位數
  • 7 :盒子的上端
  • 9:上晶須

我想獲得:

  • 1:箱
  • 5下端中位數
  • 9:箱

任何人誰可以幫我的上端?

回答

4

ggplot中,您可以通過在調用中設置它們來明確控制這些臨界值。

ggplot() + 
    geom_boxplot(
    aes(x = 1 
     , lower = min(x) 
     , middle = median(x) 
     , upper = max(x) 
     , ymin = min(x) 
     , ymax = max(x)) 
    , stat = "identity" 
) 

enter image description here

如果你有一個以上的組,你可能會想先分別計算出這些點。在這裏,用dplyr

iris %>% 
    group_by(Species) %>% 
    summarise(min = min(Petal.Length) 
      , max = max(Petal.Length) 
      , median = median(Petal.Length) 
      ) %>% 
    ggplot() + 
    geom_boxplot(
    aes(x = Species 
     , lower = min 
     , middle = median 
     , upper = max 
     , ymin = min 
     , ymax = max) 
    , stat = "identity" 
) 

enter image description here

如果你想添加一個「傳奇」,你可能需要做更多的調整。但是,使用cowplot簡單地創建一個以您想要的方式標記的圖並相當容易地將其用作圖例。在下面,我創建了與上面相同的boxplot(但將其保存到一個變量)並創建一個新的圖作爲圖例(根據需要進行修改)。

basePlot <- 
    iris %>% 
    group_by(Species) %>% 
    summarise(min = min(Petal.Length) 
      , max = max(Petal.Length) 
      , median = median(Petal.Length) 
) %>% 
    ggplot() + 
    geom_boxplot(
    aes(x = Species 
     , lower = min 
     , middle = median 
     , upper = max 
     , ymin = min 
     , ymax = max) 
    , stat = "identity" 
) 


legendPlot <- 
    data.frame(lower = 1, middle = 2, upper = 3) %>% 
    ggplot(
    aes(x = 1 
     , lower = lower 
     , middle = middle 
     , upper = upper 
     , ymin = lower 
     , ymax = middle 
    ) 
) + 
    # ggtitle("Legend") + 
    geom_boxplot(stat = "identity") + 
    scale_y_continuous(
    name = "" 
    , breaks = 1:3 
    , labels = c("Minimum", "Median", "Maximum") 
) + 
    scale_x_continuous("Legend", position = "top") + 
    theme(axis.text.x = element_blank() 
     , axis.title.x = element_text(face = "bold")) 

然後,負載cowplot(注意,我重置主題,因爲cowplot自動加載它自己的主題,我不關心它),並使用plot_grid佈局。請注意,在這裏我創建了兩個單獨的列,以使圖例更小並且垂直居中。如果你想調整細節,你可以玩rel_widthsrel_heights。 (scale是一個選項太多,但我不喜歡它如何與rel_widths工作。)

library(cowplot) 
theme_set(theme_minimal()) 


plot_grid(
    basePlot 
    , plot_grid(
    ggplot() 
    , legendPlot 
    , ggplot() 
    , ncol = 1 
) 
    , rel_widths = c(1, 0.33) 
) 

給人

enter image description here

+0

有另一種方式來計算值提前比做dplyr和%>%?似乎不適合我... – ChrM

+0

可能。這可能是一個單獨的問題,但「通過」可能會讓你開始。你是什​​麼意思「似乎沒有工作」? –

+0

這工作正常。有沒有辦法打印一個自定義框邊緣,並添加一些註釋在最小/中值/最大值。由於它是一個定製的盒子,我想添加一些信息使其他人可以理解。 – ChrM