2011-05-18 88 views
9

我有一個視圖,其中兩個圖形以左至右的方式繪製。我試圖讓一個標題顯示在視口中居中的兩個圖上。這可能嗎?對不起,由於我的工作環境,我沒有照片,因爲我的工作環境,我無法發佈代碼。使用多個圖形在R視口中居中標題ggplot2

+3

你可以用一些組成數據發佈代碼。或者一個類似的代碼,顯示你有什麼。 – 2011-05-18 18:22:35

回答

14

我想你可能會感興趣的gridExtra包,它提供了grid.arrange()功能滿足你想知道的一切。

隨着@凱文的例子中,該命令將

grid.arrange(plots[[1]], plots[[2]], ncol=2, 
      main="test main", sub="subtitle test") 
+0

我現在已經瞭解了'grid.arrange()。' – kmm 2011-05-18 20:14:51

+0

@Kevin你的回覆很好(因此我的+1)。在我發現這個之前,我使用了它:-) – chl 2011-05-18 20:16:24

+0

@cgl我的意思是以一種欣賞的方式 - 一種比每次我想爲一組圖(通常是)標題都要採用一個函數更簡單的解決方案。 – kmm 2011-05-18 21:36:53

3

我一直在使用this post to the ggplot2 mailing list中的一個幾乎未修改的代碼版本來將主標題和副標題放在圖的矩陣上方和下方。感謝BaptisteAuguié。

arrange <- function(..., nrow=NULL, ncol=NULL, as.table=FALSE, 
        main=NULL, sub=NULL, plot=TRUE) { 
    dots <- list(...) 
    n <- length(dots) 
    if(is.null(nrow) & is.null(ncol)) { nrow = floor(n/2) ; ncol = ceiling(n/nrow)} 
    if(is.null(nrow)) { nrow = ceiling(n/ncol)} 
    if(is.null(ncol)) { ncol = ceiling(n/nrow)} 
    fg <- frameGrob(layout=grid.layout(nrow,ncol)) 
    ii.p <- 1 
    for(ii.row in seq(1, nrow)){ 
    ii.table.row <- ii.row  
    if(as.table) {ii.table.row <- nrow - ii.table.row + 1} 
    for(ii.col in seq(1, ncol)){ 
     ii.table <- ii.p 
     if(ii.p > n) break 
     fg <- placeGrob(fg, ggplotGrob(dots[[ii.table]]), 
         row=ii.table.row, col=ii.col) 
     ii.p <- ii.p + 1 
    } 
    } 
    if(!is.null(main) | !is.null(sub)){ 
    g <- frameGrob() # large frame to place title(s) and content 
    g <- packGrob(g, fg) 
    if (!is.null(main)) 
     g <- packGrob(g, textGrob(main), side="top") 
    if (!is.null(sub)) 
     g <- packGrob(g, textGrob(sub), side="bottom") 
    } else { 
    g <- fg 
    } 
    if(plot) grid.draw(g) 
    invisible(g) 
} 

library(ggplot2) 
plots <- llply(1:2, function(.x) qplot(1:10,rnorm(10), main=paste("plot",.x))) 
arrange(plots[[1]],plots[[2]], nrow=1, ncol = 2, as.table=TRUE, main="test main", 
     sub="subtitle test") 

產地:

Exmple output.

+0

謝謝凱文,我會用chl的建議。任何人在未來做出改變都會變得更容易和更明顯。 – pcLogos 2011-05-19 15:01:05

1

另一種可能性,它是通過創建一個空白情節的方式樣的欺騙......

p1 <- ggplot(diamonds, aes(price,depth)) + geom_point() 
p2 <- ggplot(diamonds, aes(price,carat)) + geom_point() 
p3 <- ggplot(diamonds, aes(x=1,y=1,label="Title")) + geom_text(size=20) + opts(panel.background=theme_blank(), panel.grid.minor=theme_blank(), panel.grid.major=theme_blank(), axis.text.x=theme_blank(), axis.text.y=theme_blank(), axis.ticks=theme_blank(), axis.title.x=theme_blank(), axis.title.y=theme_blank()) 
vplayout <- function(x, y) viewport(layout.pos.row=x, layout.pos.col=y) 
grid.newpage() 
pushViewport(viewport(layout=grid.layout(4,4))) 
print(p1,vp=vplayout(2:4,1:2)) 
print(p2,vp=vplayout(2:4,3:4)) 
print(p3,vp=vplayout(1,1:4)) 

enter image description here

+0

謝謝我想到這一個,但認爲有可能沒有作弊的方式來做到這一點:)我用chl發佈的代碼去。 – pcLogos 2011-05-19 15:02:29