ggplot2: ordenando un diagtwig

Tengo un data.frame, que está ordenado de mayor a menor. Por ejemplo:

x <- structure(list(variable = structure(c(10L, 6L, 3L, 4L, 2L, 8L, 9L, 5L, 1L, 7L), .Label = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"), class = c("ordered", "factor")), value = c(0.990683229813665, 0.975155279503106, 0.928571428571429, 0.807453416149068, 0.717391304347826, 0.388198757763975, 0.357142857142857, 0.201863354037267, 0.173913043478261, 0.0496894409937888)), .Names = c("variable", "value"), row.names = c(10L, 6L, 3L, 4L, 2L, 8L, 9L, 5L, 1L, 7L), class = "data.frame") ggplot(x, aes(x=variable,y=value)) + geom_bar() + scale_y_continuous("",formatter="percent") + coord_flip() 

Ahora, los datos son agradables y ordenados, pero cuando trazo, sale ordenado por factor. Es molesto, ¿cómo lo arreglo?

Aquí hay un par de maneras.

El primero ordenará las cosas según el orden visto en el dataframe:

 x$variable <- factor(x$variable, levels=unique(as.character(x$variable)) ) 

El segundo ordena los niveles basados ​​en otra variable (valor en este caso):

 x <- transform(x, variable=reorder(variable, -value) ) 

Esto parece ser lo que estás buscando:

 g <- ggplot(x, aes(reorder(variable, value), value)) g + geom_bar() + scale_y_continuous(formatter="percent") + coord_flip() 

La función reorder() reordenará los elementos del eje x según el value de la variable .

Recientemente he estado luchando con un problema relacionado, discutido extensamente aquí: Orden de entradas de leyenda en barras de ggplot2 con coord_flip () .

Da la casualidad de que la razón por la que tuve dificultades para explicar mi problema, involucraba la relación entre (el orden de) factores y coord_flip (), como parece ser el caso aquí.

Obtengo el resultado deseado agregando + xlim(rev(levels(x$variable))) a la statement ggplot:

 ggplot(x, aes(x=variable,y=value)) + geom_bar() + scale_y_continuous("",formatter="percent") + coord_flip() + xlim(rev(levels(x$variable))) 

Esto invierte el orden de los factores que se encuentran en el dataframe original en el eje x, que se convertirá en el eje y con coord_flip (). Observe que en este ejemplo particular, la variable también está en orden alfabético, pero especificar un orden arbitrario de niveles dentro de xlim() debería funcionar en general.

Necesita convertir el factor x en un factor ordered con el orden que desee, por ejemplo

 x <- data.frame("variable"=letters[1:5], "value"=rnorm(5)) ## example data x <- x[with(x,order(-value)), ] ## Sorting x$variable <- ordered(x$variable, levels=levels(x$variable)[unclass(x$variable)]) ggplot(x, aes(x=variable,y=value)) + geom_bar() + scale_y_continuous("",formatter="percent") + coord_flip() 

No conozco ninguna forma mejor de hacer la operación de pedido. Lo que tengo allí solo funcionará si no hay niveles duplicados para x$variable .