多面体STRIP背景中的多种颜色 [英] Multiple colors in a facet STRIP background
问题描述
我想修改基于组的背景颜色。我不确定这是否可能。具体来说,我使用 facet_grid
(不是 facet_wrap
)与多个图层。
I would like to modify the colors of the facet background based on the group. I'm not sure if this is even possible. Specifically, I am using facet_grid
(not facet_wrap
) with multiple layers.
## Sample data
dat <- mtcars
## Add in some colors based on the data
dat$facet_fill_color <- c("red", "green", "blue", "yellow", "orange")[dat$gear]
## Create main plot
library(ggplot2)
P <- ggplot(dat, aes(x=cyl, y=wt)) + geom_point(aes(fill=hp)) + facet_grid(gear+carb ~ .)
## I can easily cahnge the background using:
P + theme(strip.background = element_rect(fill="red"))
然而,我想改变不同组的颜色。
理想情况下,如下所示(当然不起作用)
However, I would like to change the color differently for different groups. Ideally, something like the following (which of course does not work)
P + theme(strip.background = element_rect(fill=dat$facet_fill_color))
P + theme(strip.background = element_rect(aes(fill=facet_fill_color)))
对于背景背景是否可以有多种颜色?
Can there be more than one color for facet backgrounds?
(相关,但不是上述的实际答案:)
(related, but not an actual answer to above: ggplot2: facet_wrap strip color based on variable in data set)
推荐答案
对于它的价值,它非常简单直接,以适应以前的 gtable hack 。
For what it's worth, it's pretty straight-forward to adapt that previous gtable hack.
## Sample data
require(ggplot2)
dat <- mtcars
## Add in some colors based on the data
dat$facet_fill_color <- c("red", "green", "blue", "yellow", "orange")[dat$gear]
## Create main plot
p <- ggplot(dat, aes(x=cyl, y=wt)) +
geom_point(aes(fill=hp)) + facet_grid(gear+carb ~ .) +
theme(strip.background=element_blank())
dummy <- p
dummy$layers <- NULL
dummy <- dummy + geom_rect(data=dat, xmin=-Inf, ymin=-Inf, xmax=Inf, ymax=Inf,
aes(fill = facet_fill_color))
library(gtable)
g1 <- ggplotGrob(p)
g2 <- ggplotGrob(dummy)
gtable_select <- function (x, ...)
{
matches <- c(...)
x$layout <- x$layout[matches, , drop = FALSE]
x$grobs <- x$grobs[matches]
x
}
panels <- grepl(pattern="panel", g2$layout$name)
strips <- grepl(pattern="strip-right", g2$layout$name)
g2$grobs[strips] <- replicate(sum(strips), nullGrob(), simplify = FALSE)
g2$layout$l[panels] <- g2$layout$l[panels] + 1
g2$layout$r[panels] <- g2$layout$r[panels] + 2
new_strips <- gtable_select(g2, panels | strips)
grid.newpage()
grid.draw(new_strips)
gtable_stack <- function(g1, g2){
g1$grobs <- c(g1$grobs, g2$grobs)
g1$layout <- rbind(g1$layout, g2$layout)
g1
}
## ideally you'd remove the old strips, for now they're just covered
new_plot <- gtable_stack(g1, new_strips)
grid.newpage()
grid.draw(new_plot)
这篇关于多面体STRIP背景中的多种颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!