2010-09-22 65 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

相关问题