【问题标题】:ggplot2, geom_bar, dodge, order of barsggplot2,geom_bar,闪避,条形顺序
【发布时间】:2015-10-14 13:44:37
【问题描述】:

我想在道奇geom_bar 中订购酒吧。你知道如何处理它吗?

我的代码:

ttt <- data.frame(typ=rep(c("main", "boks", "cuk"), 2),
                  klaster=rep(c("1", "2"), 3),
                  ile=c(5, 4, 6, 1, 8, 7))

ggplot()+
    geom_bar(data=ttt, aes(x=klaster, y=ile, fill=typ),
             stat="identity", color="black", position="dodge")

以及更好地理解问题的示例图:

我有什么:

我想要什么:

【问题讨论】:

  • 你好 Marta,欢迎来到 StackOverflow!

标签: r ggplot2 geom-bar


【解决方案1】:

一种选择是创建一个新变量来表示每个组中条形的顺序,并将此变量作为group 参数添加到您的绘图中。

制作变量的方法有很多,这里有一种使用 dplyr 中的函数的方法。新变量基于在每个klaster 组内按降序排列ile。如果您在任何组中有联系,您会想弄清楚在这种情况下您想做什么(在给定的联系中,条形应该按什么顺序排列?)。您可能希望将rank 中的ties.method 参数设置为远离默认值,可能设置为"first""random"

library(dplyr)
ttt = ttt %>% 
    group_by(klaster) %>% 
    mutate(position = rank(-ile))
ttt
Source: local data frame [6 x 5]
Groups: klaster [2]

     typ klaster   ile  rank position
  (fctr)  (fctr) (dbl) (dbl)    (dbl)
1   main       1     5     3        3
2   boks       2     4     2        2
3    cuk       1     6     2        2
4   main       2     1     3        3
5   boks       1     8     1        1
6    cuk       2     7     1        1

现在只需将group = position 添加到您的绘图代码中。

ggplot() +
    geom_bar(data=ttt, aes(x=klaster, y=ile, fill=typ, group = position),
                     stat="identity", color="black", position="dodge")

【讨论】:

  • 通常它可以工作——有一个例外。当两个条具有相同的高度时。喜欢这里:ttt &lt;- data.frame(typ=rep(c("main", "boks", "cuk"), 2), klaster=rep(c("1", "2"), 3), ile=c(5, 4, 6, 7, 8, 7))。你知道如何解决这种情况吗?
  • @Marta 取决于给定平局时条的顺序,但鉴于该答案可以将rank 中的ties.method 参数从默认的"average" 设置为以下之一其他选项。有关详细信息,请参阅rank 帮助页面。