How to color entire background in ggplot2 when using coord_fixed

前端 未结 3 1494
心在旅途
心在旅途 2020-12-06 18:25

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:

相关标签:
3条回答
  • 2020-12-06 18:59

    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.

    0 讨论(0)
  • 2020-12-06 19:00

    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.

    0 讨论(0)
  • 2020-12-06 19:25

    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.

    0 讨论(0)
提交回复
热议问题