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()
函数将根据variable
的value
重新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
。