2011-05-18 16 views
9

Sağdan sola doğru iki grafik çizilen bir görünümüm var. Her iki grafikte de görüntü alanında bulunan tek bir başlık görünmeye çalışıyorum. Mümkün mü? Üzgünüz, noob durumumdan dolayı resim yok ve çalışma ortamım nedeniyle kodu gönderemiyorum.R bakış açısıyla birden fazla grafiğe sahip derecelendirme başlığı ggplot2

+3

Yapabilirsin Bazı verilerle kodu yayınlayın. Ya da neye sahip olduğunuzu gösteren benzer bir kod. –

cevap

14

Ben size merak herşeyi yerine getirir grid.arrange() fonksiyonunu sağlar gridExtra pakette, ilgini çekebileceğini düşünüyorum.

Kevin'in Örneğin @ komut

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

Ve şimdi grid.arrange() .0 – kmm

+0

@Kevin hakkında öğrendim. Cevabınız iyiydi (bu yüzden benim +1'im). Bunu keşfeden önce kullandım :-) – chl

+0

@cgl Ben çok takdir ettim ki - her seferinde bir pafta dizisini (çoğu zaman olan) seçmek istediğimde bir işlevin kaynaklanmasından çok daha basit bir çözüm. – kmm

3

this post to the ggplot2 mailing list kodunun hemen hemen değiştirilmemiş bir sürümünü kullanarak bir ana başlık ve alt başlığı bir grafik matrisinin üstüne ve altına yerleştirdim. Baptiste Auguié'ye kredi.

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") 

üretir:

Exmple output.

+0

Teşekkürler Kevin, öneriyi chl'den kullanacağım. Gelecekte değişiklik yapan herkes için daha kolay ve daha görünür olacaktır. – pcLogos

1

başka imkanı, bu tür boş arsa yaratma yoluyla aldatıyor ... olurdu ile

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

Bunu düşündüm ama bunu hile yapmadan yapmanın bir yolu olabileceğini düşündüm :) Ben chl tarafından gönderilen kodu ile gittim. – pcLogos

İlgili konular