Распечатать в pdf файл с помощью grid.table в r - слишком много строк для размещения на одной странице

Я пытаюсь вывести фрейм данных из примерно 40 строк и 5 столбцов в файл .pdf, используя grid.table в пакете gridExtra R.

Однако 40 строк слишком длинны для страницы, поэтому файл .pdf показывает только часть фрейма данных. Я хочу знать, могу ли я напечатать два столбца на одной странице, чтобы все строки отображались на одной странице. Кроме того, мне нужно знать, как печатать данные на нескольких страницах. Спасибо, Джон

Ответ 1

Один из способов - уменьшить размер шрифта и размер шрифта по горизонтали/вертикали.

grid.table(mtcars, gpar.coretext = gpar(fontsize=6), gpar.coltext = gpar(fontsize=6), padding.h=unit(2, "mm"), padding.v=unit(2, "mm"), show.rownames = TRUE)

Ответ 2

Попробуйте это для рисования таблицы в pdf файле, который охватывает несколько страниц с помощью пакета gridExtra:

  • Отрегулируйте пропорции формата pdf

    pdf(file = myfile.pdf, height = 12, width = 26)
    
  • Разделите большой кадр данных на куски и вызовите grid.newpage перед рисованием таблицы.

    require(gridExtra)
    pdf(file = myfile.pdf, height = 12, width = 26)
    grid.newpage()
    grid.table(sga_hits[1:38, ], show.rownames = FALSE)
    grid.newpage()
    grid.table(sga_hits[39:75, ], show.rownames = FALSE)
    dev.off()
    

Автоматизируйте приведенное выше:

    require(gridExtra)
    pdf(file = myfile.pdf, height = 12, width = 26)
    total_rows_per_page = 38 
    start_row = 1 

    if(total_rows_per_page > nrow(sga_hits)){
         end_row = nrow(sga_hits)
    }else {
         end_row = total_rows_per_page 
    }    

    for(i in 1:ceiling(nrow(sga_hits)/total_rows_per_page)){

       grid.newpage()   

       grid.table(sga_hits[start_row:end_row, ], show.rownames = FALSE)

       start_row = end_row + 1

       if((total_rows_per_page + end_row) < nrow(sga_hits)){

            end_row = total_rows_per_page + end_row

       }else {

            end_row = nrow(sga_hits)
       }    
    }

    dev.off()

Ответ 3

Реализация видовых экранов из grid является одним из возможных решений.

Область просмотра определяет область в графическом устройстве. Иногда бывает полезно определить окно просмотра, затем нажать его и нарисовать внутри него. Затем другой видовой экран может быть нажат и нарисован внутри; этот метод представляет собой простой способ размещения объектов на странице.

Сначала определите размеры страниц и полей.

# Assume total page size is 8.5in x 11in
vp.page <- viewport(x = 0.5, y = 0.5,
                   width = unit(x = 8.5, units = "inches"),
                   height = unit(x = 11, units = "inches"))

# Assume 0.5in margins (i.e., 0.5 left, right, bottom, top)
# This totals 1in for each dimension
vp.marg <- viewport(x = 0.5, y = 0.5,
                    width = (7.5 / 8.5), height = (10 / 11))

Далее, Определите видовые экраны для каждого столбца.

Чтобы расположить столбцы по горизонтали внутри области просмотра, их позиции x будут равномерно распределены в интервале (0,1).

В случае с двумя столбцами x1 = 0,25 и x2 = 0,75:

# Define the viewport for column 1
vp.col1 <- viewport(x = 0.25, y = 0.5, width = 0.5, height = 1)

# Define the viewport for column 2
vp.col2 <- viewport(x = 0.75, y = 0.5, width = 0.5, height = 1)

Теперь фактические данные определены. Эти данные также должны быть "grob'd" для рисования в видовых экранах.

# Assume data is stored as `dat` and has 40 rows
# Grob the data for column 1
col1 <- tableGrob(dat[1:20,], rows = NULL)

# Grob the data for column 2
col2 <- tableGrob(dat[21:40,], rows = NULL)

Теперь нарисуем pdf:

# Initiate the pdf
pdf("results.pdf", height = 11, width = 8.5)
# Push the viewports for page and margin
pushViewport(vp.page); pushViewport(vp.marg)

# Push column 1
pushViewport(vp.col1)
# Draw column 1
grid.draw(col1)

# Return to the previous viewport
upViewport()

# Push the viewport for column 2
pushViewport(vp.col2)
# Draw column 2
grid.draw(col2)

# End the pdf and save it
dev.off()

Ответ 4

Я просто использовал хак. Я напечатал таблицу в html, используя R2HTML, а затем преобразовал html в pdf с помощью wkhtmltopdf.

в R:

library(R2HTML)
HTML(table, file="table.html")

в оболочке

wkhtmltopdf table.html table.pdf

Ответ 5

Я бы предложил следующую стратегию: создать таблицуGrob, запросить ее высоты, разбить строки для каждой страницы,

library(gridExtra)
library(grid)
d <- iris[sample(nrow(iris), 187, TRUE),]
tg <- tableGrob(d, rows = seq_len(nrow(d))) 

fullheight <- convertHeight(sum(tg$heights), "cm", valueOnly = TRUE)
margin <- unit(0.51,"in")
margin_cm <- convertHeight(margin, "cm", valueOnly = TRUE)
a4height <- 29.7 - margin_cm
nrows <- nrow(tg)
npages <- ceiling(fullheight / a4height)

heights <- convertHeight(tg$heights, "cm", valueOnly = TRUE) 
rows <- cut(cumsum(heights), include.lowest = FALSE,
            breaks = c(0, cumsum(rep(a4height, npages))))

groups <- split(seq_len(nrows), rows)

gl <- lapply(groups, function(id) tg[id,])

pdf("multipage.pdf", paper = "a4", width = 0, height = 0)
for(page in seq_len(npages)){
  grid.newpage()
  grid.rect(width=unit(21,"cm") - margin,
            height=unit(29.7,"cm")- margin)
  grid.draw(gl[[page]])
}
## alternative to explicit loop:
## print(marrangeGrob(grobs=gl, ncol=1, nrow=1, top=NULL))
dev.off()

введите описание изображения здесь

Ответ 6

pdf() имеет аргументы width и height.

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

В качестве альтернативы, если вы хотите напечатать два столбца на одной странице, просто перейдите по столбцам:

# assuming `myDF` is your data.frame

pdf("filename.pdf")
for (cl in seq(from=1, to=ncol(myDF)-1, by=2)) {
      plot.new()
      grid.table(myDF[, cl+(0:1)])
    }
dev.off()