Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to color entire background in ggplot2 when using coord_fixed

Tags:

r

ggplot2

When coord_fixed() is used with ggplot2, it does not appear to be possible to set the background color of the entire plot. Consider this simple example:

library(ggplot2)
test_data <- data.frame(x=1:10)
test_data$y <- sqrt(test_data$x)
p1 <- ggplot(test_data) + geom_point(aes(x, y))
p1

Simple example plot

I can easily make the background another color, such as a garish green color:

p1 + theme(plot.background=element_rect(fill="green"))

enter image description here

But what if I want to use coord_fixed() and color the background green? When I try this ggplot2 leaves a white strip on the bottom and top of the plot:

p1 + theme(plot.background=element_rect(fill="green")) + coord_fixed()

enter image description here

How do I completely fill the background of the above plot (without the white strips on the top and bottom)? I am producing a number of subplots in a loop to be used with the animation package, and I need to ensure the backgrounds of all the subplots are the same (non-white) color, including one on which I need to use coord_fixed().

like image 684
Alex Zvoleff Avatar asked Apr 28 '14 19:04

Alex Zvoleff


2 Answers

This will do what you want:

p2 <- p1 + theme(
  plot.background=element_rect(fill="green", color="green")
) + coord_fixed()
grid:::grid.rect(gp=gpar(fill="green", col="green"))
ggplot2:::print.ggplot(p2, newpage=FALSE)

First, we set the border and fill to green, then we plot a grid rectangle in the same color to fill the viewport, and finally we plot with ggplot2:::print setting the newpage parameter to false so that it overplots on top of our grid rectangle:

enter image description here

Note that the problem isn't with ggplot, but it's just that you are plotting into a viewport that is the wrong size. If you pre-shape your viewport to the correct aspect ratio, you won't need to worry about setting the viewport contents to green first.

like image 196
BrodieG Avatar answered Oct 22 '22 11:10

BrodieG


If you want to achieve this effect without relying on non-exported ggplot2 functions, you can also use ggdraw() from cowplot:

test_data <- data.frame(x=1:10)
test_data$y <- sqrt(test_data$x)
p1 <- ggplot(test_data) + geom_point(aes(x, y))
p2 <- p1 + theme(plot.background=element_rect(fill="green", color = NA)) + coord_fixed()

# note, don't load cowplot, since it may change your theme
cowplot::ggdraw(p2) + 
  theme(plot.background = element_rect(fill="green", color = NA))

enter image description here

The function ggdraw() wraps your plot into a new ggplot object that you can then draw onto or style as you wish.

like image 40
Claus Wilke Avatar answered Oct 22 '22 12:10

Claus Wilke