2013-06-06 10 views
27

Ho combattuto per ordinare e tracciare un semplice dataframe come grafico a barre in ggplot2.Tracciare i dati in ordine decrescente come visualizzato nel frame dati

Voglio tracciare i dati così come appaiono, in modo che i valori (variabile 'conto') per le categorie corrispondenti (ad esempio 'umani', 'maschi') siano tracciati da alto a basso. Ho seguito altri thread su questo sito facendo domande simili, ma non riesco a farlo funzionare!

## Dataset (mesh2) 

#Category     Count 

#Humans    62 

#Male    40 

#Female    38 

#Adult    37 

#Middle Aged   30 

#Liver/anatomy & histology   29 

#Organ Size     29 

#Adolescent     28 

#Child    21 

#Liver/radiography*    20 

#Liver Transplantation*  20 

#Tomography, X-Ray Computed   20 

#Body Weight   18 

#Child, Preschool    18 

#Living Donors*   18 

#Infant    16 

#Aged    14 

#Body Surface Area    14 

#Regression Analysis  11 

#Hepatectomy   10 

## read in data (mesh2) as object (mesh2) 

mesh2 <- read.csv("mesh2.csv", header = T) 

## order data by count of mesh variable 

mesh2$cat2 <- order(mesh2$Category, mesh2$Count, decreasing=TRUE) 

## Barplot created in ggplot2 

library(ggplot2) 

mesh2p <- ggplot(mesh2, aes(x=cat2, y=Count)) + geom_bar (stat="identity") +  scale_x_continuous(breaks=c(1:20), labels=c("Humans", "Male", "Female", "Adult", "MAged", "Liver anat & hist", "Organ Size", "Adolescent", "Child", "Liver radiog", "Liver Transplnt", "Tomog X-Ray Computed", "Body Weight", "Child Preschool", "Living Donors", "Infant", "Aged", "BSA", "Regression Analysis", "Hepatectomy"))+ theme (axis.text.x=element_text(angle=45, hjust=1)) 

Apparentemente non posso pubblicare l'output perché non ho abbastanza "reputazione"?

+1

Rendi il tuo 'Category' un fattore ordinato. Vedi "fattore" per imparare come farlo. – Roland

+1

@Roland No, questo * non * come fare questo in generale. Qual è l'ordinamento implicito nell'insieme 'c (" human "," male "," female "," cat ")'? Un fattore ordinato è per i dati in cui i livelli * stessi * trasmettono alcune informazioni quantitative, ad esempio il set 'c (" wet "," moist "," dry ")'. Perché il tuo errore su questo è memorizzare questi dati come un fattore ordinato farà la cosa sbagliata se utilizzato in un modello in R (vincoli polinomiali) per i dati non ordinati. Ciò che si desidera è la funzione 'reorder()'. –

+1

s/your/you're/fingers ... –

risposta

97

Si desidera reorder(). Ecco un esempio con dati fittizi

set.seed(42) 
df <- data.frame(Category = sample(LETTERS), Count = rpois(26, 6)) 

require("ggplot2") 

p1 <- ggplot(df, aes(x = Category, y = Count)) + 
     geom_bar(stat = "identity") 

p2 <- ggplot(df, aes(x = reorder(Category, -Count), y = Count)) + 
     geom_bar(stat = "identity") 

require("gridExtra") 
grid.arrange(arrangeGrob(p1, p2)) 

Dare:

enter image description here

Usa reorder(Category, Count) avere Category ordinati da basso-alto.

+1

Ciao Gavin. Grazie v.much per questo. Ho appena effettuato l'accesso, avendo trascorso l'ultima ora cercando di trovare una soluzione e ho anche trovato la soluzione che presentavi! Tuttavia, la tua spiegazione dei livelli che trasmettono informazioni quantitative o meno e l'uso appropriato del fattore o della funzione di riordino è davvero utile. Grazie ancora. –

+0

Non riesco a capire perché questo non funziona se si dispone di più di un riempimento, per categoria in questo caso. – JHo

+0

Penso che il tuo codice non funzionerà con valori negativi, vedi http://dpaste.com/0Y5T182 In questo caso, il tuo grafico non sarà in ordine decrescente dopo la stampa. Codice anche qui 'dat.m <- struttura (lista (Data = c (" 1.5.2017 "," 1.3.2017 "," 1.5.2017 "," 1.3.2017 "), variabile = struttura (c (1L, 1L, 2L, 2L), .Label = c ("Totale", "Area"), classe = "fattore"), valore = c (110, -90, 700, 880)), row.names = c (NA , -4L), .Names = c ("Date", "variable", "value"), class = "data.frame"); biblioteca (ggplot2); ggplot (dat.m, aes (x = riordino (data, valore), y = valore, riempimento = variabile)) + geom_bar (stat = 'identità') '. –

Problemi correlati