2010-09-22 42 views
30

我想用R製作一系列按中位值排序的盒子圖。假設然後我執行:根據中位數值對盒子圖進行排序

boxplot(cost ~ type) 

這會給我一些箱線圖中的成本顯示在Y軸和類型類別是在x軸可見:

-----  ----- 
    |   | 
[ ]  | 
    |  [ ] 
    |   | 
-----  ----- 
    A   B 

不過,我」 d喜歡的是從最高到最低中值的排序圖。我懷疑的是,我需要做的是改變類型(A或B)的標籤以數字表明哪個是最低和最高的中值,但我想知道是否有更聰明的方法來解決問題。

回答

44

結帳?reorder。這個例子似乎是你想要的,但是按照相反的順序排序。我在下面的第一行更改了-count,按照您想要的順序排序。

bymedian <- with(InsectSprays, reorder(spray, -count, median)) 
    boxplot(count ~ bymedian, data = InsectSprays, 
      xlab = "Type of spray", ylab = "Insect count", 
      main = "InsectSprays data", varwidth = TRUE, 
      col = "lightgray") 
10

沒錯,就是這個想法:

> set.seed(42)      # fix seed  
> DF <- data.frame(type=sample(LETTERS[1:5], 100, replace=TRUE), 
+     cost=rnorm(100)) 
> 
> boxplot(cost ~ type, data=DF) # not ordered by median 
> 
> # compute index of ordered 'cost factor' and reassign   
> oind <- order(as.numeric(by(DF$cost, DF$type, median)))  
> DF$type <- ordered(DF$type, levels=levels(DF$type)[oind]) 
> 
> boxplot(cost ~ type, data=DF) # now it is ordered by median 
0

謹防遺漏值的,你必須添加na.rm = TRUE爲它工作。如果沒有,代碼根本不起作用。我花了數小時才發現這一點。

bymedian <- with(InsectSprays, reorder(spray, -count, median, **na.rm = TRUE**) 
    boxplot(count ~ bymedian, data = InsectSprays, 
      xlab = "Type of spray", ylab = "Insect count", 
      main = "InsectSprays data", varwidth = TRUE, 
      col = "lightgray") 
+1

您應該指定這是指[Joshua Ulrich的答案](http://stackoverflow.com/a/3766007/3982001)。它實際上應該是一個評論,但它也可以獨立作爲一個單獨的答案。 – 2016-08-24 14:10:01

+0

我將其標記爲「不是答案」,因爲完全相同的答案已發佈(並已接受)。用戶剛剛添加了新的參數。這不會提高解決方案的質量,也不足以成爲一個單獨的答案。 – PoGibas 2017-12-12 18:11:46

相關問題