ggplot: изменить порядок стековых баров на основе компонента% уровня в баре - PullRequest
1 голос
/ 12 мая 2011

Я создал составной линейчатый график в ggplot как таковой.

antr1$Traits4<-factor(antr1$Traits4,
                      levels=c("Flight", "Avoidance", "Investigative",
                               "Defensive aggression","Active aggression"))

ggplot(antr1, aes(Receiver3, fill=Traits4)) + 
  geom_bar(position="fill") + 
  coord_flip() +
  scale_y_continuous("", formatter="percent") + 
  scale_fill_manual(values=c("Flight"="yellow",
                             "Avoidance"="green",
                             "Investigative"="blue",
                             "Defensive aggression"="orange",
                             "Active aggression"="red"))  

Хорошо работает.Однако на данный момент столбцы расположены в алфавитном порядке на основе имен «Receiver3».Я хотел бы изменить порядок столбцов в зависимости от уровня «Активная агрессия».

Заранее благодарю

Мэтт

1 Ответ

3 голосов
/ 18 мая 2011

Если вы знаете порядок уровней Receiver3, который вы хотите, вы можете указать через что-то вроде:

antr1$Receiver3 <- factor(antr1$Receiver3,
                    levels=c(...list the levels in the order you'd like...),
                    ordered=TRUE)

Если у Receiver3 много уровней, поэтому определение правильного порядка вручную непозволительно, вы можете попробовать что-то вроде этого:

temp <- aggregate(antr1$Traits4,by=list(receiver=antr1$Receiver3),
          FUN=function(xx){
                return(sum(xx=='Active aggression')/length(xx))
          }
antr1$Receiver3 <- factor(antr1$Receiver3,levels=temp$receiver[order(temp$x)],
                     ordered=TRUE)

Если вы хотите противоположный порядок, измените порядок (temp $ x) на порядок (temp $ x, убывающий = TRUE).

...