能否更改单个分面绘图的格式?例如,使用下面的示例代码,是否可以更改cyl = 8绘图的标题或背景颜色?
library(ggplot2)
ggplot(mtcars, aes(x=gear)) +
geom_bar(aes(y=gear), stat="identity", position="dodge") +
facet_wrap(~cyl)
您可以修改ggplot2 grobs,例如:
library("ggplot2")
d <- ggplot(mtcars, aes(x=gear)) +
geom_bar(aes(y=gear), stat="identity", position="dodge") +
facet_wrap(~cyl)
grob <- ggplotGrob(d)
strip_bg <- grid.ls(getGrob(grob, "strip.background.rect",
grep=TRUE, global=TRUE))$name
panel_bg <- grid.ls(getGrob(grob, "panel.background.rect",
grep=TRUE, global=TRUE))$name
strip_text <- grid.ls(getGrob(grob, "strip.text.x",
grep=TRUE, global=TRUE))$name
grob <- geditGrob(grob, strip_bg[2], gp=gpar(fill="gray60"))
grob <- geditGrob(grob, panel_bg[2], gp=gpar(fill="darkolivegreen2"))
grob <- geditGrob(grob, strip_text[2], gp=gpar(col="white"))
grid.draw(grob)
更新:这应该可以与 ggplot2 0.9.3 一起使用。
grob <- ggplotGrob(d)
elem <- grob$grobs$panel2
panel_bg <- grid.ls(getGrob(elem, "panel.background.rect", grep=TRUE))$name
grob$grobs$panel2 <- editGrob(elem, panel_bg, gp=gpar(fill="darkolivegreen"), grep=TRUE)
elem <- grob$grobs$strip_t.1
strip_bg <- grid.ls(getGrob(elem, "strip.background.rect", grep=TRUE))$name
grob$grobs$strip_t.1 <- editGrob(elem, strip_bg, gp=gpar(fill="gray60"), grep=TRUE)
elem <- grob$grobs$strip_t.1
strip_text <- grid.ls(getGrob(elem, "strip.text.x.text", grep=TRUE))$name
grob$grobs$strip_t.1 <- editGrob(elem, strip_text, gp=gpar(col="white"), grep=TRUE)
grid.draw(grob)
grid.ls
)。你有任何更新的想法吗? - Simon O'Hanlonfacet_grid
在列中有3个方面)。然而,当我尝试使用panel_border <- grid.ls(getGrob(elem, "panel.border.rect", grep=TRUE))$name
时,我收到了一个错误:Error in getGrob(elem, "panel.border.rect", grep = TRUE) : it is only valid to get a child from a "gTree"
。是什么导致了这样的行为? - radekgrid
修改 ggplot2
图形是一种脆弱的方式... - rcsgrid
的解决方案。 - radekstrip_t1
而非 strip_t.1
。然而,这和其他问题一样,让我认为这种方法真的太不稳定了,不值得推荐。 - Jack Aidley我知道这是一个老问题,原来的发帖者可能早就不在了,但我仍然认为这个问题值得回答,以便未来的搜索者参考。rcs提供的被接受的答案确实可行,但我发现它相当不稳定和hacky。最终,我决定采取一种更为谨慎但更为稳定的方法。使用这种方法,你只能改变背景颜色,但对于我的目的来说已经足够了,对其他人也可能有用,我的方法是使用geom_rect
来重新着色背景,像这样:
highlights <- data.frame(cyl=c(8))
ggplot() +
geom_rect(data=highlights,aes(xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf), fill='red', alpha=0.2) +
geom_bar(data = mtcars, aes(x=gear), position="dodge", fill = 'black') +
facet_wrap(~cyl)
xmin=-Inf
等应该放在aes
之外,对吗? - jf328aes
内部,但我倾向于这样做,因为我习惯将x、y等放在aes
内部,感觉更一致。但你同样可以认为,由于aes
是多余的,应该将其删除。 - Jack Aidleymtcars2 = subset(mtcars, cyl != 8)
subs = subset(mtcars, cyl == 8)
require(ggplot2)
ggplot(mtcars2, aes(x=gear)) +
geom_bar(aes(y=gear, fill = 'black'), stat="identity", position="dodge") +
geom_bar(data = subs, aes(x = gear), fill = 'blue', binwidth = 1) +
facet_wrap(~cyl)