2010-09-19 95 views
44

我有一个data.frame,从最高到最低排序。例如:ggplot2:排序一个阴谋

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

现在,数据是很好的和排序的,但是当我绘制时,它会按照因子排序。这很烦人,我该如何解决它?

+1

使用R版本3.2.2,我得到一个错误:'scale_y_continuous(“”,formatter =“percent”):未使用的参数(formatter =“percent”)' – Iris 2016-04-05 09:00:19

+0

是的,我认为它的'scale_y_continuos(labels = percent )'并且你还必须加载'scales'包。 – 2016-04-05 13:47:41

+0

然后,我有一个新的错误'错误:stat_count()不能与aesthetic.' – Iris 2016-04-05 13:52:31

回答

53

以下是几种方法。

第一基于在数据帧中看到的顺序将命令的东西:

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

第二订单基于另一变量的水平(在这种情况下的值):

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

第二个提供了我没有找到“ - ”的结果。 – 2010-09-20 04:33:11

+0

reorder()将被gdata包覆盖。如果您为什么无法正常工作而感到茫然,这可能是原因。 – 2012-12-16 09:01:07

+4

我希望ggplot2会被重写,使它更容易。我已经整理了我的数据。框架,以及为什么订单不被剧情所尊重...... – userJT 2015-07-31 17:11:48

2

你需要做X因素和您要订购的ordered因素,e.g

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没有重复关卡的情况下才有效。

+0

一个是本机适用于我所提供的示例中使用,但它似乎并没有转化为我的实际问题。 – 2010-09-19 02:17:22

+0

我已经改变了例子,以提供我与 – 2010-09-19 02:47:05

+0

工作实际数据完美的作品时,我尝试... – zwol 2010-09-19 04:39:23

63

这似乎是你在找什么:

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

reorder()函数将reord呃根据valuevariable您的x轴项目。

+6

如果要添加一个解释,应该做些什么。 – naught101 2013-04-05 02:42:02

+0

这正是我一直在寻找的,谢谢! – Timothy055 2015-07-18 20:21:26

+2

如果有人对'formatter ='参数有问题:在更新的版本中,它已更改为'labels = scales :: percent'(请参阅http://stackoverflow.com/a/14511974/2761742)。 – 2016-02-09 14:09:45

8

我最近一直在努力解决相关问题,在这里详细讨论:Order of legend entries in ggplot2 barplots with coord_flip()

碰巧,我有一个很难解释清楚我的问题的原因,涉及各方之间(顺序)因素和coord_flip()的关系,因为似乎这里是这样的。

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

用于颠倒的,如在x轴上的原始数据帧发现因素,这将成为在y的顺序:

我通过添加+ xlim(rev(levels(x$variable)))到ggplot语句获得所需的结果带有coord_flip()的轴。请注意,在这个特定的例子中,变量也碰巧按字母顺序排列,但在xlim()中指定任意级别的顺序应该可以工作。