2012-02-10 6 views
11

quindi ho un carico di dati che ho provato come esempio di seguito:stack ordinazione di formato in una ggplot2 impilato grafico a barre

Sequence Abundance Length 
CAGTG 3  25 
CGCTG 82  23 
GGGAC 4  25 
CTATC 16  23 
CTTGA 14  25 
CAAGG 9  24 
GTAAT 5  24 
ACGAA 32  22 
TCGGA 10  22 
TAGGC 30  21 
TGCCG 25  21 
TCCGG 2  21 
CGCCT 22  24 
TTGGC 4  22 
ATTCC 4  23 

sto mostrando solo le prime 4 parole di ogni sequenza qui, ma in realtà sono lunghi "Lunghezza". Sto osservando l'abbondanza di sequenze per ogni classe di dimensioni che ho qui. Inoltre, voglio visualizzare la proporzione di abbondanza che una particolare sequenza rappresenta all'interno della sua classe di dimensioni. Attualmente, posso fare un grafico a barre in pila in questo modo:

ggplot(tab, aes(x=Length, y=Abundance, fill=Sequence)) 
    + geom_bar(stat='identity') 
    + opts(legend.position="none") 

ggplot stacked bar graph of the sample data

Questo va bene per un piccolo set di dati di questo tipo, ma ho circa 1,7 milioni di righe nel mio set di dati reali. Sembra molto colorato e posso vedere che sequenze particolari hanno un'abbondanza di maggioranza in una classe di dimensioni, ma è molto caotico.

Vorrei poter ordinare le barre colorate impilate per ogni dimensione con l'abbondanza di quella sequenza. cioè le barre con la più alta abbondanza all'interno del loro stack sono in fondo a ogni pila e le barre con l'abbondanza più bassa sono in cima. Dovrebbe sembrare molto più presentabile in questo modo.

Qualche idea su come farlo in ggplot2? So che esiste un parametro "order" in aes() ma non riesco a capire cosa dovrebbe fare con i dati nel formato che ho.

+1

@ GSK3 - credo che il PO sta chiedendo qualcosa di leggermente diverso qui. Invece di voler ordinare le barre per la loro altezza totale, penso che kukimbob stia chiedendo come ordinare i blocchi colorati * entro * ogni barra, mettendo il più grande in basso, in basso per l'asse x e il più piccolo in alto. (cioè l'ordinamento dei colori all'interno di ciascuna barra può ben differire tra le barre). –

+0

@ JoshO'Brien Proprio così! L'ordinamento sull'asse x va bene: dalla lunghezza più piccola alla più lunga. Voglio solo essere in grado di manipolare l'ordine delle pile colorate all'interno di ciascuna barra. – MattLBeck

+0

Ah, questa è sicuramente una domanda diversa. Scuse. –

risposta

10

L'ordine in cui le barre sono disegnate (dal basso verso l'alto) in un barattolo impilato in ggplot2 si basa sull'ordinamento del fattore che definisce i gruppi. Pertanto, il fattore Sequence deve essere riordinato in base allo Abundance. Ma per ottenere il giusto ordine di impilamento, l'ordine deve essere invertito.

ab.tab$Sequence <- reorder(ab.tab$Sequence, ab.tab$Abundance) 
ab.tab$Sequence <- factor(ab.tab$Sequence, levels=rev(levels(ab.tab$Sequence))) 

Utilizzando il codice ora dà la trama si ha richiesto

ggplot(ab.tab, aes(x=Length, y=Abundance, fill=Sequence)) + 
    geom_bar(stat='identity') + 
    opts(legend.position="none") 

enter image description here

potrei raccomandare, tuttavia, qualcosa di leggermente diverso. Dato che stai sopprimendo la scala che mappa il colore in sequenza, e la tua descrizione sembra indicare che non ti interessa comunque la sequenza specifica (e ce ne saranno molti), perché non lasciare quella parte? Disegna solo i contorni delle barre senza alcun colore di riempimento.

ggplot(ab.tab, aes(x=Length, y=Abundance, group=Sequence)) + 
    geom_bar(stat='identity', colour="black", fill=NA) 

enter image description here

+0

Funziona perfettamente, grazie! E il tuo suggerimento è molto meglio di quello che ho attualmente, dal momento che avere lo stesso colore per letture diverse attraverso le classi di dimensioni era confondere l'interpretazione. – MattLBeck

+0

Come faresti l'ordine su base per colonna? –

+0

@AlexT Non credo che sia possibile ordinare le categorie all'interno di una barra in modo diverso per barre diverse. –

Problemi correlati