Reversed order after coord_flip in R
Asked Answered
G

2

37

Data example from dbv:

  gender Sektion
1      m       5
2      m       5
3      w      3B
4      w      3B
5      w      3B
6      m       4

I have the following plot:

Sekplot <- ggplot(dbv,aes(x=Sektion,
                          fill=factor(gender),
                          stat="bin", 
                          label = paste(round((..count..)/sum(..count..)*100), "%"))) 
Sekplot <- Sekplot + geom_bar(position="fill")
Sekplot <- Sekplot + scale_y_continuous(labels = percent)
Sekplot <- Sekplot + labs(title = "test")
Sekplot <- Sekplot + scale_fill_discrete(name="test", breaks=c("m", "w", "k.A."), labels=c("m", "w", "k.A."))
Sekplot <- Sekplot + geom_hline(aes(yintercept = ges, linetype = "test"), colour = "black", size = 0.75, show_guide = T)
Sekplot <- last_plot() + coord_flip()
Sekplot <- Sekplot + guides(colour = guide_legend(override.aes = list(linetype = 0 )), 
                                    fill = guide_legend(override.aes = list(linetype = 0 )), 
                                    shape = guide_legend(override.aes = list(linetype = 0 )), 
                                    linetype = guide_legend()) + theme(legend.title=element_blank())

Sekplot 

Output: Plot with y-axis in wrong order

Plot with y-axis in wrong order

How can I reverse the order of the "Sektion" axis? I'd like to have one on top and 8 at the bottom.

I tried, according to groupA$Date <- factor(groupA$Date, levels=rev(unique(groupA$Date))):

Sekplot <- last_plot() + coord_flip() + scale_x_reverse()

in several flavor, but couldn't find the right way.

Genna answered 11/12, 2015 at 16:18 Comment(3)
You need something like scale_x_discrete(limits = rev(levels(dat$Sektion))) - see this answerLimestone
Thanks a lot, it worked like a charm! I cannot mark this question as solved, because the answer is in a comment.Genna
I hadn't put it as an answer because I was trying to find duplicates. I haven't found a really good match, though, so will add as answer.Limestone
L
63

You can add scale_x_discrete with the limits argument to do this. You could simply write out the limits in the order you want, but that gets complicated when you have many factor levels.

Instead, you can pull the levels of the factor from your dataset and take advantage of rev to put them in reverse order.

It would look like:

scale_x_discrete(limits = rev(levels(dbv$Sektion)))

2022 edit by @slhck

Adding in example using forcats::fct_rev() function to set the levels of the factor in reverse order. You can either make this change in the dataset or use directly when mapping your x variable as below.

ggplot(dbv, aes(x = forcats::fct_rev(Sektion),
               fill = factor(gender),
               stat = "bin", 
               label = paste(round((..count..)/sum(..count..)*100), "%")
   )
)
...
Limestone answered 14/12, 2015 at 15:43 Comment(1)
forcats::fct_rev() is useful here.Yarmouth
O
4

As suggested by @sindri_baldur, while you're specifying the aesthetics, add fct_rev() like so ggplot(dbv,aes(x=fct_rev(Sektion), fill=factor(gender),stat="bin", label = paste(round((..count..)/sum(..count..)*100), "%")))

That should be all you need ... remove the scale_x_discrete() from your code.

Odysseus answered 23/5, 2021 at 14:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.