2011-03-23 35 views
8

Si quiero ordenar las barras en un diagrama de barras ggplot2 de mayor a menor, a continuación, por lo general me actualizo los niveles de los factores de la categoría de la barra, al igual queCómo pedir barras en ggplot2 facetas gráfico de barras

one_group <- data.frame(
    height = runif(5), 
    category = gl(5, 1) 
) 

o <- order(one_group$height, decreasing = TRUE) 
one_group$category <- factor(one_group$category, levels = one_group$category[o]) 

p_one_group <- ggplot(one_group, aes(category, height)) + 
    geom_bar(stat = "identity") 
p_one_group 

Si tengo varios grupos de diagramas de barras que quisiera en diferentes facetas, con cada faceta con barras ordenadas de mayor a menor (y diferentes ejes x), entonces la técnica se descompone.

dado algunos datos de la muestra

two_groups <- data.frame(
    height = runif(10), 
    category = gl(5, 2), 
    group = gl(2, 1, 10, labels = letters[1:2]) 
) 

y el código de trazado

p_two_groups <- ggplot(two_groups, aes(category, height)) + 
    geom_bar(stat = "identity") + 
    facet_grid(. ~ group, scales = "free_x") 
p_two_groups 

¿qué necesito hacer para conseguir la barra de ordenar la derecha?

Si ayuda, un problema equivalente a resolver es: ¿cómo actualizo los niveles de factor después de haber hecho la facetación?

+1

Buena pregunta. No puedo pensar inmediatamente en una respuesta, solo alternativas. 1) Use align.plots en el paquete ggExtra. 2) Construya gráficas separadas e individuales y combínelas usando ventanas gráficas: vplayout en ggExtra lo simplifica. Si esto parece útil, puedo publicar un ejemplo en una respuesta. – Andrie

Respuesta

14

aquí es un truco:

two_groups <- transform(two_groups, category2 = factor(paste(group, category))) 
two_groups <- transform(two_groups, category2 = reorder(category2, rank(height))) 

ggplot(two_groups, aes(category2, height)) + 
    geom_bar(stat = "identity") + 
    facet_grid(. ~ group, scales = "free_x") + 
    scale_x_discrete(labels=two_groups$category, breaks=two_groups$category2) 
  1. hacen ÚNICA variable de factor de todas las entradas (categoría2)
  2. reordenar la variable en base a la altura
  3. diagrama de la variable: aes (x = categoría2)
  4. reetiquetar el eje utilizando orig valor inal (categoría) para la variable (categoría2) en scale_x_discrete.
+0

Gran truco. Ejército de reserva. –

+0

nice one kohske. ¡Esto irá a mi carpeta de fragmentos de código! – Ramnath

3

Aquí hay un truco para lograr lo que quiere. No pude averiguar cómo obtener los valores de categoría debajo de las marcas de graduación. Entonces, si alguien puede ayudar a solucionar eso, sería maravilloso. Déjame saber si esto funciona

# add a height rank variable to the data frame 
two_groups = ddply(two_groups, .(group), transform, hrank = rank(height)); 

# plot the graph 

p_two_groups <- ggplot(two_groups, aes(-hrank, height)) + 
    geom_bar(stat = "identity") + 
    facet_grid(. ~ group, scales = "free_x") + 
    opts(axis.text.x = theme_blank()) + 
    geom_text(aes(y = 0, label = category, vjust = 1.5)) 
+0

Bonito combo 'ddply' /' transform'. No creo que 'geom_text' funcione fuera de los paneles de trazado; anulando la escala según la respuesta de kohske es una solución más limpia. –

+0

yup. No pude entender cómo superar esa limitación. gran truco de kohske. – Ramnath

Cuestiones relacionadas