ggplot2: classificando um gráfico

Eu tenho um data.frame, que é classificado do maior para o menor. Por exemplo:

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() 

Agora, os dados são bons e ordenados, mas quando eu plato, ele é classificado por fator. É chato, como conserto?

   

Aqui estão algumas maneiras.

O primeiro ordenará as coisas com base na ordem vista no quadro de dados:

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

O segundo ordena os níveis com base em outra variável (valor neste caso):

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

Isto parece ser o que você está procurando:

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

A function reorder() irá reorganizar seus itens do eixo x de acordo com o value da variable .

Recentemente, tenho lutado com um problema relacionado, discutido detalhadamente aqui: Ordem das inputs de legenda em barplots ggplot2 com coord_flip () .

Acontece que a razão pela qual eu tive dificuldade em explicar claramente o meu problema envolveu a relação entre (a ordem de) fatores e coord_flip (), como parece ser o caso aqui.

Eu obtenho o resultado desejado adicionando + xlim(rev(levels(x$variable))) à declaração ggplot:

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

Isso inverte a ordem dos fatores encontrados no quadro de dados original no eixo x, que se tornará o eixo y com coord_flip (). Observe que neste exemplo em particular, a variável também está em ordem alfabética, mas especificar uma ordem arbitrária de níveis dentro de xlim() deve funcionar em geral.

Você precisa transformar o fator x em um fator ordered com a ordem desejada, por exemplo

 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() 

Eu não conheço melhor maneira de fazer a operação de encomenda. O que eu tenho lá só vai funcionar se não houver níveis duplicados para a x$variable .