ggplot2: Flip axes and maintain aspect ratio of data

I agree that the theme solution isn't really a proper one. Here is a solution that does work programatically by calculating the aspect from the actual axes ranges stored in the plot object, but it takes a few lines of code:

ranges <- ggplot_build(p)$layout$panel_ranges[[1]][c('x.range', 'y.range')]
sizes <- sapply(ranges, diff)
aspect <- sizes[1] / sizes[2]

p + coord_flip() + theme(aspect.ratio = aspect)

enter image description here

The solution I would probably use in practice, is to use the horizontal geoms in the ggstance package (although this may not always be feasible).

Note: This will only give the exact correct answer for two continuous scales with an equal multiplicative extend argument (i.e. the default).

edit: In many cases I would recommend using coord_equal combined with the ggstance package instead of this solution.

Tags:

Plot

R

Ggplot2