2010-09-22 12 views
30

Vorrei utilizzare R per creare una serie di grafici a scatole che sono ordinati per valore mediano. Supponiamo poi eseguo:Ordinamento di un boxplot basato sul valore mediano

boxplot(cost ~ type) 

Questo mi darebbe alcuni grafici a scatole sono stati costo è mostrato sull'asse y e la categoria tipo è visibile sul asse x:

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

Tuttavia, quello che ho' d come sono le figure del boxplot ordinate dal valore mediano più alto al più basso. Il mio sospetto è che quello che devo fare è cambiare le etichette del tipo (A o B) per indicare numericamente quale è il valore medio più basso e più alto, ma mi chiedo se c'è un modo più intelligente per risolvere il problema.

risposta

44

Check out ?reorder. L'esempio sembra essere quello che vuoi, ma ordinato nell'ordine opposto. Ho modificato -count nella prima riga in basso per ordinare nell'ordine desiderato.

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

Sì, questa è l'idea:

> 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

Beware of valori mancanti, si deve aggiungere na.rm = TRUE per farlo funzionare. In caso contrario, il codice semplicemente non funziona. Mi ci sono volute ore per scoprirlo.

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

È necessario specificare che questo si riferisce a [risposta di Joshua Ulrich] (http://stackoverflow.com/a/3766007/3982001). In realtà dovrebbe essere un commento, ma può anche stare da solo come risposta separata. –

+0

L'ho contrassegnato come "non una risposta" poiché la stessa risposta esatta viene pubblicata (e accettata). L'utente ha appena aggiunto nuovi argomenti. Ciò non migliora la qualità della soluzione e non è sufficiente per essere una risposta separata. – PoGibas

Problemi correlati