Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to control ggplot's plotting area proportions instead of fitting them to devices in R?

Tags:

plot

r

ggplot2

By default, each plot in ggplot fits its device.

That's not always desirable. For instance, one may need to make tiles in geom_tile to be squares. Once you change the device or change the number of elements on x/y-axis, the tiles are no longer squares.

Is it possible to set hard proportions or size for a plot and fit the plot in its device's window (or make the device width and height proportional to those of the plot)?

like image 323
Anton Tarasenko Avatar asked Dec 14 '13 08:12

Anton Tarasenko


2 Answers

You can specify the aspect ratio of your plots using coord_fixed().

> library(ggplot2)
> df <- data.frame(
+     x = runif(100, 0, 5),
+     y = runif(100, 0, 5))

If we just go ahead and plot these data then we get a plot which conforms to the dimensions of the output device.

> ggplot(df, aes(x=x, y=y)) + geom_point()

If, however, we use coord_fixed() then we get a plot with fixed aspect ratio (which, by default has x- and y-axes of same length). The size of the plot will be determined by the shortest dimension of the output device.

> ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

Finally, we can adjust the fixed aspect ratio by specifying an argument to coord_fixed(), where the argument is the ratio of the length of the y-axis to the length of the x-axis. So, to get a plot that is twice as tall as it is wide, we would use:

> ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(2)
like image 185
datawookie Avatar answered Nov 01 '22 02:11

datawookie


A cleaner way is to use the theme(aspect.ratio) argument e.g.

library(ggplot2)
d <- data.frame(x=rnorm(100),y=rnorm(100)*1000)
ggplot(d,aes(x,y))+
geom_point() +
theme(aspect.ratio=1/10) #Long and skinny

enter image description here

coord_fixed() sets the ratio of x/y coordinates, which isn't always the same thing (e.g. in this case, where the units of x and y are very different.

like image 28
Mark Payne Avatar answered Nov 01 '22 01:11

Mark Payne