2012-10-08 2 views
52

che sto cercando di fare un heatmap utilizzando ggplot2 utilizzando la funzione geom_tiles ecco il mio codice qui sotto:Come si ordina in modo specifico l'asse x di ggplot2 al posto dell'ordine alfabetico?

p<-ggplot(data,aes(Treatment,organisms))+geom_tile(aes(fill=S))+ 
    scale_fill_gradient(low = "black",high = "red") + 
    scale_x_discrete(expand = c(0, 0)) + 
    scale_y_discrete(expand = c(0, 0)) + 
    theme(legend.position = "right", 
    axis.ticks = element_blank(), 
    axis.text.x = element_text(size = base_size, angle = 90, hjust = 0, colour = "black"), 
    axis.text.y = element_text(size = base_size, hjust = 1, colour = "black")). 

dati è il mio file data.csv
mio asse X è tipi di trattamento
mia Y Asse è tipi di organismi

Non ho molta familiarità con i comandi e la programmazione e sono relativamente nuovo in questo. Voglio solo essere in grado di specificare l'ordine delle etichette sull'asse x. In questo caso, sto cercando di specificare l'ordine di "Trattamento". Per impostazione predefinita, ordina in ordine alfabetico. Come faccio a sovrascrivere questo/mantenere i dati nello stesso ordine del mio file csv originale?

Ho provato questo comando

scale_x_discrete(limits=c("Y","X","Z")) 

dove x, yez sono mio ordine condizione di trattamento. Tuttavia, non funziona molto bene e mi manca le scatole di calore.

risposta

85

È un po 'difficile rispondere alla domanda specifica senza un esempio completo e riproducibile. Tuttavia qualcosa come questo dovrebbe funzionare:

#Turn your 'treatment' column into a character vector 
data$Treatment <- as.character(data$Treatment) 
#Then turn it back into an ordered factor 
data$Treatment <- factor(data$Treatment, levels=unique(data$Treatment)) 

In questo esempio, l'ordine del fattore sarà lo stesso nel file data.csv.

Se si preferisce un ordine diverso, è possibile ordinarli a mano:

data$Treatment <- factor(data$Treatment, levels=c("Y", "X", "Z")) 

Tuttavia, questo è pericoloso se si hanno un sacco di livelli: se uno qualsiasi di loro torto, che causerà problemi.

+0

OMG! Capito! Grazie mille, questo era esattamente quello di cui avevo bisogno! :) Mi hai migliorato la giornata. –

+10

Mi chiedo perché questo sia addirittura necessario. Perché gli assi sono riordinati da ggplot in primo luogo? Sembra pericoloso se qualcuno non è consapevole che ciò accadrà. –

+0

Mi sono imbattuto in questo problema effettuando [heatmap con qplot] (http://martinsbioblogg.wordpress.com/2013/03/21/using-r-correlation-heatmap-with-ggplot2/) e ho applicato automaticamente i nomi delle variabili . Dovrebbe essere segnalato? –

0

Si è imbattuto in questa risposta a causa di una domanda duplicata corrente. La risposta al momento attuale offre una soluzione che richiede la modifica del frame di dati sottostante. Ma non è necessario. Si può anche semplicemente definire un vettore per la disposizione e utilizzarlo direttamente nella chiamata estetica. La seguente soluzione non è ovviamente molto diversa dalla risposta di cui sopra, con l'importante differenza che il frame di dati originale non viene modificato.

level_order <- c('virginica', 'versicolor', 'setosa') 

ggplot(iris, aes(x = factor(Species, level = level_order), y = Petal.Width)) + geom_col() 

o

level_order <- factor(iris$Species, level = c('virginica', 'versicolor', 'setosa')) 

ggplot(iris, aes(x = level_order, y = Petal.Width)) + geom_col() 

that's for the first version