How to color entire background in ggplot2 when using coord_fixed
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.
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.
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.