ggplot2、geom_bar、dodge、bars的顺序

8

我希望在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! - maj
1个回答

14

一种选择是创建一个新变量来表示每个组内条形图的顺序,并将此变量作为您绘图中的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 <- data.frame(typ=rep(c("main", "boks", "cuk"), 2), klaster=rep(c("1", "2"), 3), ile=c(5, 4, 6, 7, 8, 7))。你知道如何解决这种情况吗? - Marta
1
@Marta 这取决于在出现并列的情况下条形图应该按什么顺序排列,但是考虑到答案,可以将 ties.method 参数设置为 rank 中的其他选项之一,而不是默认值 "average"。有关更多信息,请参见 rank 帮助页面。 - aosmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接