2015-10-14 75 views
4

我想在道奇geom_bar中订购酒吧。你知道如何处理它吗? 我的代码:ggplot2,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") 

而且例如地块,以更好地理解这个问题:

What I have

What I would like to have

+0

玛塔您好,欢迎计算器! – maj

回答

5

一种选择是做一个新的变量来表示吧应该顺序在每个组内,然后将这个变量作为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") 

enter image description here

+0

通常它有效 - 有一个例外。当两根酒吧有相同的高度。像这里:'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取决于按照什么顺序排列条纹,但考虑到答案可以将'rank'中的'ties.method'参数设置为远离默认的''average''到其他选项之一。有关更多信息,请参阅“排名”帮助页面。 – aosmith