2012-07-05 65 views
66

我經常使用數值來表示刻面。 我希望提供足夠的信息來解釋補充標題中的這些刻面值,類似於軸標題。 標籤選項重複了很多不必要的文本,並且對較長的變量標題不可用。如何在ggplot2中添加通用標籤到facet?

有什麼建議嗎?

默認:

test<-data.frame(x=1:20, y=21:40, facet.a=rep(c(1,2),10), facet.b=rep(c(1,2), each=20)) 
qplot(data=test, x=x, y=y, facets=facet.b~facet.a) 

enter image description here

我會愛:

enter image description here

我可以在ggplot做到最好:

qplot(data=test, x=x, y=y)+facet_grid(facet.b~facet.a, labeller=label_both) 

enter image description here

正如@Hendy表示,類似於: add a secondary y axis to ggplot2 plots - make it perfect

+1

聖牛。我只是* *正在尋找這個,通過谷歌找到這個...現在看到它被問了一分鐘前。 [這個問題](http:// stackoverflow。com/questions/9096671/add-a-secondary-y-axis-to-ggplot2-plots-make-it-perfect)似乎是基於他的評論詢問同樣的事情,儘管可能暗示其他標題。偉大的模型來說明。這正是我的問題 - 如果我不必解釋我的數字分面類別,那就好了。該圖應該用一個簡單的標籤來說明自己的面部變量是什麼。 – Hendy 2012-07-05 22:19:36

+0

我問過一個[類似的問題。](http://stackoverflow.com/q/7603949/707145) – MYaseen208 2012-07-05 23:00:39

+3

我詢問了溫斯頓張(不知道他的SO手柄),ggplot的主要開發人員之一,通過電子郵件。他不認爲這是目前的選擇,但可以考慮添加它。他建議我在github上添加一個問題,[所以我](https://github.com/hadley/ggplot2/issues/612) – Hendy 2012-07-06 16:37:02

回答

43

由於採用了最新ggplot2使用gtable內部,這是很容易修改一個數字:

library(ggplot2) 
test <- data.frame(x=1:20, y=21:40, 
        facet.a=rep(c(1,2),10), 
        facet.b=rep(c(1,2), each=20)) 
p <- qplot(data=test, x=x, y=y, facets=facet.b~facet.a) 

# get gtable object 
z <- ggplotGrob(p) 

library(grid) 
library(gtable) 
# add label for right strip 
z <- gtable_add_cols(z, unit(z$widths[[7]], 'cm'), 7) 
z <- gtable_add_grob(z, 
        list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))), 
          textGrob("Variable 1", rot = -90, gp = gpar(col = gray(1)))), 
        4, 8, 6, name = paste(runif(2))) 

# add label for top strip 
z <- gtable_add_rows(z, unit(z$heights[[3]], 'cm'), 2) 
z <- gtable_add_grob(z, 
        list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))), 
          textGrob("Variable 2", gp = gpar(col = gray(1)))), 
        3, 4, 3, 6, name = paste(runif(2))) 

# add margins 
z <- gtable_add_cols(z, unit(1/8, "line"), 7) 
z <- gtable_add_rows(z, unit(1/8, "line"), 3) 

# draw it 
grid.newpage() 
grid.draw(z) 

enter image description here

當然,您可以編寫一個自動添加條形標籤的功能。未來版本的ggplot2可能具有此功能;不確定。

+0

- 我想知道這是否仍然是最簡潔的方法,版本0.9.3.1。我在最新的文檔中沒有看到類似「這種功能」的東西http://docs.ggplot2.org/0.9.3.1/ – yosukesabai 2013-06-22 15:35:52

+1

版本0.9.3.1提供了與ggplot_gtable(ggplot_build())相同的'ggplotGrob() ))'。我認爲這仍然是最好的方式。 – kohske 2013-06-23 04:56:06

+0

該方法在有圖例時覆蓋圖例。我想知道是否有辦法阻止這種情況發生。 – papirrin 2014-02-19 10:43:56

1

除了由kohske概述的方法,你可以邊框通過改變

col=NA 

添加盒加入到

col=gray(0.5), linetype=1 

另外,更改

fill=gray(0.5) 

fill=grey(0.8) 

gp=gpar(col=gray(1)) 

gp=gpar(col=gray(0)) 

如果你想在新的酒吧,以配合小標籤

z <- gtable_add_grob(z, 
     list(rectGrob(gp = gpar(col = gray(0.5), linetype=1, fill = gray(0.8))), 
     textGrob("Variable 1", rot = -90, gp = gpar(col = gray(0)))), 
     4, 8, 6, name = paste(runif(2))) 
0

有可能是一個更好的辦法做到它,但你可以:

fac1 = factor(rep(c('a','b'),10)) 
fac2 = factor(rep(c('a','b'),10)) 
data = data.frame(x=1:10, y=1:10, fac1=fac1, fac2=fac2) 
p = ggplot(data,aes(x,y)) + ggplot2::geom_point() + 
facet_grid(fac1~fac2) 
p + theme(plot.margin = unit(c(1.5,1.5,0.2,0.2), "cm")) 
grid::grid.text(unit(0.98,"npc"),0.5,label = 'label ar right', rot = 270) # right 
grid::grid.text(unit(0.5,"npc"),unit(.98,'npc'),label = 'label at top', rot = 0) # top 
相關問題