I have found that when adding coord_flip()
to certain plots using ggplot2 that the order of values in the legend no longer lines up with the order of values in the plot.
For example:
dTbl = data.frame(x=c(1,2,3,4,5,6,7,8), y=c('a','a','b','b','a','a','b','b'), z=c('q','q','q','q','r','r','r','r')) print(ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) + geom_bar(position=position_dodge(), stat='identity') + coord_flip() + theme(legend.position='top', legend.direction='vertical'))
I would like the 'q' and 'r' in the legend to be reversed without changing the order of 'q' and 'r' in the plot.
scale.x.reverse()
looked promising, but it doesn't seem to work within factors (as is the case for this bar plot).
In Design mode, right-click the chart legend you want to edit. Click Format Chart Legend. Check Reverse legend order.
Under Chart Tools, on the Design tab, in the Data group, click Select Data. In the Select Data Source dialog box, in the Legend Entries (Series) box, click the data series that you want to change the order of. Click the Move Up or Move Down arrows to move the data series to the position that you want.
You're looking for guides
:
ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) + geom_bar(position=position_dodge(), stat='identity') + coord_flip() + theme(legend.position='top', legend.direction='vertical') + guides(fill = guide_legend(reverse = TRUE))
I was reminded in chat by Brian that there is a more general way to do this for arbitrary orderings, by setting the breaks
argument:
ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) + geom_bar(position=position_dodge(), stat='identity') + coord_flip() + theme(legend.position='top', legend.direction='vertical') + scale_fill_discrete(breaks = c("r","q"))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With