2012-02-10 12 views
11

Así que tienen una carga de datos que he probado como un ejemplo a continuación:pilas de pedido por tamaño en un gráfico de barras apiladas ggplot2

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 

sólo estoy mostrando las primeras 4 palabras de cada secuencia aquí, pero en realidad son "Longitud" de largo. Estoy viendo las abundancias de secuencias para cada clase de tamaño que tengo aquí. Además, quiero visualizar la proporción de abundancia que una secuencia particular representa dentro de su clase de tamaño. Actualmente, puedo hacer un gráfico de barras apiladas de esta manera:

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

Esto está bien para un pequeño conjunto de datos de este tipo, pero tengo alrededor de 1,7 millones de filas en mi conjunto de datos real. Se ve muy colorido y puedo ver que las secuencias particulares tienen una abundancia mayoritaria en una clase de tamaño, pero es muy complicado.

Me gustaría poder ordenar las barras apiladas de colores para cada tamaño por la abundancia de esa secuencia. es decir, las barras con la mayor abundancia dentro de su pila se encuentran en la parte inferior de cada pila y las barras con la menor abundancia están en la parte superior. Debería verse mucho más presentable de esa manera.

¿Alguna idea sobre cómo hacer esto en ggplot2? Sé que hay un parámetro de "orden" en aes() pero no puedo determinar qué debería hacer con los datos en el formato que tengo.

+1

@ GSK3 - Creo que la OP de pedir algo un poco diferente aquí. En lugar de querer ordenar las barras por su altura total, creo que kukimbob está preguntando cómo ordenar los bloques de colores * dentro de cada barra, colocando el más grande en la parte inferior, abajo por el eje xy el más pequeño en la parte superior. (es decir, el orden de los colores dentro de cada barra puede diferir entre barras). –

+0

@ JoshO'Brien ¡Eso es exactamente! El orden en el eje x es bueno: desde la longitud más pequeña hasta la más larga. Solo quiero poder manipular el orden de las pilas de colores dentro de cada barra. – MattLBeck

+0

Ah, esa es definitivamente una pregunta diferente. Disculpas –

Respuesta

10

El orden en que se dibujan las barras (de abajo hacia arriba) en una barra de barras apiladas en ggplot2 se basa en el orden del factor que define los grupos. Por lo tanto, el factor Sequence se debe reordenar según el Abundance. Pero para obtener el orden de apilamiento correcto, el pedido debe revertirse.

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

Utilizando su código da ahora la trama se solicitó

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

enter image description here

Me podría recomendar, sin embargo, algo ligeramente diferente. Ya que está suprimiendo la escala que asigna el color a la secuencia, y su descripción parece indicar que no le importa la secuencia específica de todos modos (y habrá muchos), ¿por qué no dejar esa parte? Solo dibuja los contornos de las barras sin ningún color de relleno.

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

enter image description here

+0

Esto funciona perfectamente, ¡gracias! Y su sugerencia es mucho mejor de lo que tengo actualmente, ya que tener el mismo color para lecturas diferentes en las clases de tamaño confundía la interpretación. – MattLBeck

+0

¿Cómo harías el pedido por columna? –

+0

@AlexT No creo que sea posible ordenar las categorías dentro de una barra de manera diferente para barras diferentes. –

Cuestiones relacionadas