2012-09-18 7 views
7

This question pregunta sobre cómo ordenar un gráfico de barras de acuerdo con una tabla no resumida. Tengo una situación ligeramente diferente. Esto es parte de mi datos originales:El pedido de gráficos de barra con ggplot2 de acuerdo con su tamaño, es decir, el valor numérico

experiment,pvs_id,src,hrc,mqs,mcs,dmqs,imcs 
dna-wm,0,7,9,4.454545454545454,1.4545454545454546,1.4545454545454541,4.3939393939393945 
dna-wm,1,7,4,2.909090909090909,1.8181818181818181,0.09090909090909083,3.9090909090909087 
dna-wm,2,7,1,4.818181818181818,1.4545454545454546,1.8181818181818183,4.3939393939393945 
dna-wm,3,7,8,3.4545454545454546,1.5454545454545454,0.4545454545454546,4.272727272727273 
dna-wm,4,7,10,3.8181818181818183,1.9090909090909092,0.8181818181818183,3.7878787878787876 
dna-wm,5,7,7,3.909090909090909,1.9090909090909092,0.9090909090909092,3.7878787878787876 
dna-wm,6,7,0,4.909090909090909,1.3636363636363635,1.9090909090909092,4.515151515151516 
dna-wm,7,7,3,3.909090909090909,1.7272727272727273,0.9090909090909092,4.030303030303029 
dna-wm,8,7,11,3.6363636363636362,1.5454545454545454,0.6363636363636362,4.272727272727273 

necesito solamente unas pocas variables de esto, a saber mqs y imcs, agrupados por su pvs_id, por lo que se crea una nueva tabla:

m = melt(t, id.var="pvs_id", measure.var=c("mqs","imcs")) 

puedo trazar esto como un gráfico de barras donde se puede ver la correlación entre MQS y IMCS.

ggplot(m, aes(x=pvs_id, y=value)) 
+ geom_bar(aes(fill=variable), position="dodge", stat="identity") 

Sin embargo, me gustaría los barras resultantes para ser ordenadas por el MQS valor, de izquierda a derecha, en orden decreciente. Los valores IMCS se deben pedir con esos, por supuesto.

¿Cómo puedo lograr eso? En general, dado cualquier marco de datos fundido, que parece útil para graficar en ggplot2 y hoy es la primera vez que lo encuentro, ¿cómo especifico el orden de una variable?

Respuesta

7

Es todo en la fabricación de

pvs_id un factor y el suministro de los niveles apropiados a ella:

dat$pvs_id <- factor(dat$pvs_id, levels = dat[order(-dat$mqs), 2]) 

m = melt(dat, id.var="pvs_id", measure.var=c("mqs","imcs")) 

ggplot(m, aes(x=pvs_id, y=value))+ 
    geom_bar(aes(fill=variable), position="dodge", stat="identity") 

Esto produce el siguiente diagrama:

EDIT: Bueno, ya que pvs_id fue n umeric se trata de manera ordenada. Donde como si tuviera un factor, no se asume ningún orden. Por lo tanto, aunque tenga etiquetas numéricas, pvs_id es realmente un factor (nominal). Y en lo que respecta a dat[order(-dat$mqs), 2], la función de orden con un signo negativo ordena el marco de datos de mayor a menor a lo largo de la variable mqs. Pero está interesado en ese orden para la variable pvs_id, por lo que indexa esa columna, que es la segunda columna. Si se desgarra aparte de que usted verá que le ofrece:

> dat[order(-dat$mqs), 2] 
[1] 6 2 0 5 7 4 8 3 1 

Ahora se suministran al argumento de que levels de factor y esto ordena el factor tal como usted lo desee.

+0

PS no nombra un conjunto de datos t, ya que escribe sobre una función de instalación básica bastante importante que se transpone. –

+2

En realidad, no es así. Puede distinguir conjuntos de datos de funciones. Pruébalo: 't <- 1: 5; t (matriz (1: 9, nrow = 3)) '. Si tuvieras que decir 't <- function (x) 1: x', sin embargo, te meterías en problemas. –

+1

En cualquier caso, mala práctica. –

Cuestiones relacionadas