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:
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))
The function ggdraw()
wraps your plot into a new ggplot object that you can then draw onto or style as you wish.
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:
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.
There's a way to do this in ggplot
by using a secret (undocumented, passed to device in ...
) argument bg
to ggsave()
.
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)) +
theme(plot.background = element_rect(fill = "green", color = "green")) +
coord_fixed()
ggsave("test.png", bg = "green", h = 5)
I came here originally because I was using geom_sf
to plot maps which are by definition fixed to a ratio, and wanted to add a dark background. The bg
argument also applies to gganimate::animate()
, if you need to add a background color to a fixed ratio animation.