R - добавление номеров страниц в PDF - PullRequest
3 голосов
/ 20 апреля 2011

У меня проблемы с добавлением номеров страниц в PDF-файлы. Вот как я вставляю страницы / графики:

pdf( file = pdfFilePath , width = 11 , height = 8.5  )
for ( ... ) {
    grid.newpage()
    pushViewport( viewport( layout = grid.layout( 2 , 2 ) ) )
    ... print 4 plots ....
}

В одном файле имя файла указывается по номеру страницы, но я хочу, чтобы номера страниц отображались в одном файле.

Редактировать
Я изменил пример кода @ Gavin для создания рабочей версии смешивания графических типов для получения номеров страниц:

require(ggplot2)
pdf( file = "FILE_PATH_TO_SAVE_PDF_HERE" , width = 11 , height = 8.5  )
par( oma = c ( 4 , 4 , 4 , 4 ) , mar=c( 4 , 0 , 2 , 0 )  )
plot( 0:11 , type = "n", xaxt="n", yaxt="n", bty="n", xlab = "", ylab = ""  )
mtext( side = 3 , line = 0 , outer = TRUE  , cex = 1.5 , family="mono" , "Title" )
grid.newpage()
p1 <- ggplot(data.frame(X = 1:10, Y = runif(10)), aes(x = X, y = Y)) + 
        geom_point()
vplayout <- function(x, y) {
    viewport(layout.pos.row = x, layout.pos.col = y)
}
pushViewport(viewport(layout = grid.layout(2, 2)))
print(p1, vp = vplayout(1,1))
print(p1, vp = vplayout(1,2))
print(p1, vp = vplayout(2,1))
print(p1, vp = vplayout(2,2))
mtext( "1" , side = 1 , line = 3 , outer = TRUE , cex = .8 , family="mono"  )
dev.off()

Ответы [ 4 ]

2 голосов
/ 21 апреля 2011

Из моего второго комментария к Q я предложил базовое графическое решение с использованием mtext().Похоже, это работает для OP, поэтому я показываю расширенную версию здесь:

Базовая графика:

op <- par(oma = c(2,0,0,0))
layout(matrix(1:4, ncol = 2))
plot(1:10)
plot(1:10)
plot(1:10)
plot(1:10)
mtext(side = 1, text = "Page 1", outer = TRUE)
layout(1)
par(op)

В результате:

base graphics page number example

@ SFun28 сообщает, что эта идея работает и для его графики ggplot / grid, но не для меня.После запуска последней строки фрагмента кода ниже я получаю следующую ошибку:

> mtext(side = 1, text = "Page 1")
Error in mtext(side = 1, text = "Page 1") : 
  plot.new has not been called yet

, которая указывает на предупреждение не смешивать базовую и сеточную графику.

require(ggplot2)
p1 <- ggplot(data.frame(X = 1:10, Y = runif(10)), aes(x = X, y = Y)) + 
        geom_point()
vplayout <- function(x, y) {
    viewport(layout.pos.row = x, layout.pos.col = y)
}
grid.newpage()
pushViewport(viewport(layout = grid.layout(2, 2)))
print(p1, vp = vplayout(1,1))
print(p1, vp = vplayout(1,2))
print(p1, vp = vplayout(2,1))
print(p1, vp = vplayout(2,2))
mtext(side = 1, text = "Page 1")
2 голосов
/ 21 апреля 2011

Я изменил пример из R Graphics Пола Меррелла book , который рисует весь график с использованием сетки, а затем размещает метку внизу в отдельном видовой экран. Я оставляю точную настройку для OP, так как не знаю, что делают отдельные графики, но общая идея создания дополнительного видового экрана (?) В нижней части устройства, в которое рисуется метка, должна отображаться на grid.layout() идей, уже использованных @ SFun28:

label <- textGrob("A page number! ",
                  x=0.5, y = 1.0, just="centre")
x <- seq(0.1, 0.9, length=50)
y <- runif(50, 0.1, 0.9)
gplot <- 
  gTree(
    children=gList(rectGrob(gp=gpar(col="grey60",
                                    fill="white")),
                   linesGrob(x, y), 
                   pointsGrob(x, y, pch=16, 
                              size=unit(1.5, "mm"))),
    vp=viewport(width=unit(1, "npc") - unit(5, "mm"), 
                height=unit(1, "npc") - unit(10, "mm")))



layout <- grid.layout(2, 1,
                      widths=unit(c(1, 1), 
                                  c("null", "grobwidth"),
                                  list(NULL, label)),
                      heights = unit(c(1, 1),
                                     c("null", "grobheight"),
                                     list(NULL, label)))

grid.rect(gp=gpar(col="grey60", fill="grey90"))
pushViewport(viewport(layout=layout))
pushViewport(viewport(layout.pos.row=2))
grid.draw(label)
popViewport()
pushViewport(viewport(layout.pos.col=1))
grid.draw(gplot)
popViewport(2)

Что дает:

A grid page number example

1 голос
/ 19 января 2012
library(ggplot2)
plots = replicate(8, qplot(1,1))
library(gridExtra)
p <- 
do.call(marrangeGrob, c(plots, list(ncol=2, nrow=2, top =NULL, 
        bottom = quote(quote(paste(g, "/",pages))))))

p

ggsave("multipage.pdf", p)

(quote(quote()) необходим, чтобы поддерживать ленивую оценку, каким-то образом)

0 голосов
/ 18 августа 2015

Как уже упоминал @Gavin, я также столкнулся с ошибкой при смешивании ggplot с mtext.

Вот что действительно хорошо работает для меня при использовании ggplot:

require(ggplot2)
require(grid)
printWithFooter = function(gg_obj, bottom_left = NULL, bottom_right = NULL) 
{
  print(gg_obj)
  if (!is.null(bottom_right))
  {
    label = textGrob(bottom_right,
                     x = 0.98,  # right side
                     y = 0.0,   # bottom
                     just="right", 
                     hjust = NULL,
                     vjust = -.5,
                     gp=gpar(fontsize=7, col="#333333"))
    grid.draw(label)
  }
  if (!is.null(bottom_left))
  {
    label = textGrob(bottom_left,
                     x = 0.02,  # left side
                     y = 0.0,   # bottom
                     just="left", 
                     hjust = NULL,
                     vjust = -.5,
                     gp=gpar(fontsize=7, col="#333333"))  
    grid.draw(label)
  }
}

## example

d = data.frame(x = runif(1:20), y = runif(1:20), facet = rep(1:4, each=5))
p = ggplot(d) + geom_point(aes(x=x, y=y)) + facet_wrap(~facet)
printWithFooter(p, "left", "right")

Example result

...