Центрирование заголовка в окне просмотра R с несколькими графиками ggplot2 - PullRequest
9 голосов
/ 18 мая 2011

У меня есть окно просмотра с двумя графиками, нарисованными слева направо.Я пытаюсь сделать так, чтобы один заголовок появлялся над обоими графиками, центрированными в области просмотра.Это возможно?Извините, нет изображения из-за моего статуса noob, и я не могу опубликовать код из-за моей рабочей среды.

Ответы [ 3 ]

14 голосов
/ 18 мая 2011

Думаю, вас может заинтересовать пакет gridExtra , который предоставляет функцию grid.arrange(), которая выполняет все, что вам интересно.

С примером @ Kevin, команда будет

grid.arrange(plots[[1]], plots[[2]], ncol=2, 
             main="test main", sub="subtitle test")
3 голосов
/ 18 мая 2011

Я использовал почти неизмененную версию кода в этом сообщении для списка рассылки ggplot2 , чтобы поместить основной заголовок и подзаголовок выше и ниже матрицы графиков. Кредит Баптисту Огие.

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.

1 голос
/ 19 мая 2011

Другая возможность, это своего рода обман путем создания пустого сюжета ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...