ggplot2:sorting一个情节

我有一个data.frame,从最高到最低sorting。 例如:

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

现在,数据是很好的,sorting,但是当我绘制,它出来按因素sorting。 这很烦人,我该如何解决?

这里有几个方法。

第一个将根据在数据框中看到的顺序来sorting:

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

第二个命令基于另一个variables(在这种情况下的值)的级别:

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

这似乎是你在找什么:

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

reorder()函数将根据variablevalue重新sortingx轴项目。

我最近一直在处理一个相关的问题,在这里详细讨论: 使用coord_flip()的ggplot2 barplots中的图例条目顺序 。

碰巧,我很难清楚地解释我的问题,因为这里涉及到(因素的顺序)和coord_flip()之间的关系。

我通过向ggplot语句添加+ xlim(rev(levels(x$variable)))来获得所需的结果:

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

这反转了在x轴原始数据框中find的因子的顺序,这将成为coord_flip()的y轴。 请注意,在这个特定的例子中,variables也碰巧按照字母顺序排列,但是在xlim()指定任意级别的顺序应该可以工作。

您需要按照您想要的顺序将x因子转换为ordered因子,例如

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

我不知道有什么更好的方法来做订购操作。 我在那里只会有没有重复的水平x$variable