2013-10-09 87 views
8

我有一個數據集從我想積小的倍數,特別是在一個2×2陣列,像這樣:如何將表達式添加到facet_wrap中的標籤?

mydf <- data.frame(letter = factor(rep(c("A", "B", "C", "D"), each = 20)), x = rnorm(80), y = rnorm(80)) 
ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_wrap(~ letter, ncol = 2) 

然而,我希望每個小面標籤包括表達式,如

expression(paste("A or ", alpha)) 

我可以通過

f_names <- list('A' = expression(paste("A or ", alpha)), 'B' = expression(paste("B or ", beta)), 'C' = expression(paste("C or ", gamma)), 'D' = expression(paste("D or ", delta))) 
f_labeller <- function(variable, value){return(f_names[value])} 
ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_grid(~ letter, labeller = f_labeller) 

這一點使用facet_grid()但後來我失去了2×2陣列。我如何使用表達式重命名facet_wrap()構面標籤?或者,我如何通過使用facet_grid()重新創建2乘2的數組來解決這個問題,但只能通過一個變量來分割?

(這個問題建立關括號注意到在@巴蒂斯特的回答this previous question。)

謝謝!

+0

這是否有幫助:http://stackoverflow.com/questions/10151123/how-to-specify-columns-in-facet-grid-or-how-to-change-labels-in-facet-wrap –

+0

@ baptiste:是的!謝謝你,鏈接到的Q&A中的'facet_wrap_labeller()'功能非常棒。 @Ricardo:感謝那個鏈接 - 我已經找到了答案,它最初把我推向了這個問題。感謝你們兩位。 – RTM

回答

9

爲了做什麼,我問,第一負荷@Roland該貼標機的功能首先出現here

facet_wrap_labeller <- function(gg.plot,labels=NULL) { 
    #works with R 3.0.1 and ggplot2 0.9.3.1 
    require(gridExtra) 

    g <- ggplotGrob(gg.plot) 
    gg <- g$grobs  
    strips <- grep("strip_t", names(gg)) 

    for(ii in seq_along(labels)) { 
    modgrob <- getGrob(gg[[strips[ii]]], "strip.text", 
         grep=TRUE, global=TRUE) 
    gg[[strips[ii]]]$children[[modgrob$name]] <- editGrob(modgrob,label=labels[ii]) 
    } 

    g$grobs <- gg 
    class(g) = c("arrange", "ggplot",class(g)) 
    g 
} 

然後保存原始ggplot()對象:

myplot <- ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_wrap(~ letter, ncol = 2) 

然後調用facet_wrap_labeller()和飼料表達標籤作爲參數:

facet_wrap_labeller(myplot, labels = c(expression(paste("A or ", alpha)), expression(beta), expression(gamma), expression(delta))) 

表達式現在應該顯示爲facet_wrap()標籤。

+0

更簡單的方式來使用它,不需要在標籤的每個字段上傳遞表達式,也不需要「標籤」:facet_wrap_labeller(myplot,表達式(paste(「A或」,alpha),beta,gamma,delta)) – Eduardo

+1

對於任何嘗試這種更現在的人來說,ggplot中的解決方案現在已經實現。在[ggplot index](http://docs.ggplot2.org/current/labellers.html)底部有一個很好的例子,它顯示瞭如何用facet_wrap非常方便地完成此操作。 – Nova

相關問題