2011-07-19 52 views
10

是否可以改變個別構面圖的格式?例如,使用下面的示例代碼,是否可以更改cyl = 8圖的標題或背景的顏色?如何更改單個facet_wrap面板的格式?

library(ggplot2) 
ggplot(mtcars, aes(x=gear)) + 
    geom_bar(aes(y=gear), stat="identity", position="dodge") + 
    facet_wrap(~cyl) 
+0

這個問題是類似的,可能會提供靈感:http://stackoverflow.com/q/3167444/602276 – Andrie

回答

17

可以修改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) 

geditGrob example

更新:這應該與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) 
+0

這個作品 - 謝謝! – user338714

+0

+1,但不再有效('g​​rid.ls')。你有什麼想法如何更新? –

+1

@ SimonO101查看更新後的答案... – rcs

3

這可以幫助你得到一點點接近你想要什麼:

mtcars2 = 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) 
8

我知道這是一個老問題,因此原來的海報可能是長了,但我仍然認爲這是值得回答的資源對未來搜索。 rcs所接受的答案確實有用,但我發現它相當不穩定而且很冒險。最後,我決定採用更溫和但更穩定的方法。有了這個方法,你只能改變背景但足以滿足我的目的,有可能給別人,我的方法是使用geom_rect到recolour的背景下,像這樣:

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) 

Example plot