如何模拟将美学传递给ggplot2中的面板背景?

How to simulate passing an aesthetic to panel background in ggplot2?

我在这个堆栈溢出问题中读到了一种使用 geom_rect 模拟设置面板背景美学的巧妙方法。

Conditionally change panel background with facet_grid?

不幸的是,如果你想在绘图中放置其他颜色,它是行不通的。颜色混合,图例被污染。相反,我更希望颜色只适用于背景并且不会混合。我的另一个问题是:是否有一种方法适用于极坐标?

有关可重现的示例,请参见下面的代码:

pies <- data_frame(pie = c(rep("hawaiian", 3), rep("pepperoni", 2)), 
                   fraction = c(c(0.3, 0.2, 0.5), c(0.4, 0.6)),
                   ingredient = c("cheese", "pineapple", "ham",
                                  "peperroni", "cheese"),
                   deepdish = c(rep(TRUE, 3), rep(FALSE, 2)))

p <- pies %>%
  ggplot() +
  geom_bar(aes(x = factor(1),
               y = fraction,
               fill = ingredient),
           width = 0.6,
           stat = "identity",
           position = "fill") +
  facet_wrap(~ pie) +
  geom_rect(mapping = aes(fill = deepdish),
            alpha = 0.1,
            xmin = -Inf, xmax = Inf,
            ymin=-Inf, ymax=Inf,
            show.legend = FALSE)

p
p + coord_polar(theta = "y")
pies <- data_frame(pie = c(rep("hawaiian", 3), rep("pepperoni", 2)), 
                   fraction = c(c(0.3, 0.2, 0.5), c(0.4, 0.6)),
                   ingredient = c("cheese", "pineapple", "ham",
                                  "peperroni", "cheese"),
                   deepdish = c(rep(TRUE, 3), rep(FALSE, 2)))
library(ggplot2)
library(dplyr)
p <- pies %>%
  ggplot() +
  geom_bar(aes(x = factor(1), y = fraction, fill = ingredient),
           width = 0.6, stat = "identity", position = "fill") +
  facet_wrap(~ pie) + coord_polar(theta = "y")

g <- ggplotGrob(p)
# Set manually the background color for each panel
g$grobs[[2]]$children[[1]]$children[[1]]$gp$fill <- "#88334466"
g$grobs[[3]]$children[[1]]$children[[1]]$gp$fill <- "#44338866"

library(grid)
grid.draw(g)

library(egg)
library(grid)

pies <- data.frame(pie = c(rep("hawaiian", 3), rep("pepperoni", 2)), 
                   fraction = c(c(0.3, 0.2, 0.5), c(0.4, 0.6)),
                   ingredient = c("cheese", "pineapple", "ham",
                                  "peperroni", "cheese"))

dummy <- data.frame(x = 0, y = 0, 
                    pie = c("hawaiian","pepperoni"),
                    deepdish = c("green","yellow"), stringsAsFactors = FALSE)

p <-    ggplot(pies) +
  facet_wrap(~ pie) +
  geom_custom(data= dummy, mapping = aes(x = factor(0),
                            y = y,
                            data = deepdish), 
              grob_fun = function(x) rectGrob(gp=gpar(fill=x,col=NA)), inherit.aes = TRUE) +
  geom_bar(aes(x = factor(1),
               y = fraction,
               fill = ingredient),
           width = 0.6,
           stat = "identity",
           position = "fill") 

p + coord_polar(theta = "y")