titles gradiente de color de fondo ggplot2 plot



titles ggplot (1)

El enlace relevante al enfoque ggplot2 fue dado en los comentarios. Copiado desde allí:

library(grid) 
g <- rasterGrob(blues9, width=unit(1,"npc"), height = unit(1,"npc"), 
interpolate = TRUE) 
# grid.draw(g) 

library(ggplot2) 
ggplot(mtcars, aes(factor(cyl))) + # add gradient background 
   annotation_custom(g, xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf) + 
   geom_bar() # add data layer 

Mi propio enfoque:

Como de costumbre, no puedo competir con la simple elegancia de las soluciones de Baptiste para los problemas con los gráficos de cuadrícula, pero este es mi enfoque, ya que fui a todo ese trabajo:

gg.background.fill <- function(gg.plot, cols = "white", which = "x") {
  #does not work with facets

  stopifnot(which %in% c("x", "y"))
  which1 <- if (which == "x") "width" else "height"

  require(gridExtra)

  g <- ggplotGrob(gg.plot)
  #g <- ggplotGrob(p)
  gg <- g$grobs      
  findIt <- vapply(gg, function(x) grepl("GRID.gTree", x$name, fixed = TRUE), TRUE)
  n1 <- getGrob(gg[findIt][[1]], "grill.gTree", grep=TRUE)$name
  n2 <- getGrob(gg[findIt][[1]], "panel.background.rect", grep=TRUE)$name
  gg[findIt][[1]]$children[[n1]]$children[[n2]]$gp$fill <- cols
  x <- gg[findIt][[1]]$children[[n1]]$children[[n2]][[which]]
  w <- gg[findIt][[1]]$children[[n1]]$children[[n2]][[which1]]
  attr <- attributes(x)
  x <- seq(0 + c(w)/length(cols)/2, 1 - c(w)/length(cols)/2, length.out = length(cols))
  attributes(x) <- attr
  gg[findIt][[1]]$children[[n1]]$children[[n2]][[which]] <- x
  w <- c(w)/length(cols) 
  attributes(w) <- attr
  gg[findIt][[1]]$children[[n1]]$children[[n2]][[which1]] <- w
  g$grobs <- gg
  class(g) = c("arrange", "ggplot", class(g)) 
  g
}
p1 <-  gg.background.fill(p, colorRampPalette(c("red", "blue"))(100))
print(p1)

p2 <-  gg.background.fill(p, colorRampPalette(c("red", "blue"))(100), "y")
print(p2)

Esto modifica el fondo existente que podría considerarse una ventaja, pero a diferencia del enfoque annotation_custom , no funciona con facetado. Se necesitaría más trabajo para eso.

Este código produce el primer diagrama a continuación:

water.height <- seq(0, 5, 1)
y <- seq(0, 1500, length.out = 6)
df <- data.frame(water.height, y)

library(ggplot2)
ggplot(df, aes(water.height, y)) + geom_blank()+ theme_bw()

He photoshopped en este fondo azul:

¿Puedo producir el mismo fondo azul con el código R?