使用r中的grid.table打印到pdf文件 - 太多行以适合一页

时间:2013-04-10 21:52:17

标签: r pdf gridextra

我正在尝试使用R.的gridExtra包中的grid.table将大约40行和5列的数据帧输出到.pdf文件。

但是,对于页面来说,40行太长,因此.pdf文件只显示部分数据帧。我想知道我是否可以在一个页面上打印两列,以便所有行显示在一个页面上。或者,我需要知道如何在多个页面上打印数据帧。谢谢,约翰

6 个答案:

答案 0 :(得分:3)

我建议采用以下策略:创建tableGrob,查询其高度,拆分行以适合每个页面,

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

enter image description here

答案 1 :(得分:2)

一种方法是缩小字体大小和水平/垂直填充字体。

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 :(得分:2)

尝试使用gridExtra包在pdf文件上绘制表格,该文件跨多个页面:

  1. 调整pdf设备宽高比

    pdf(file = myfile.pdf, height = 12, width = 26)
    
  2. 将大数据框拆分为块并在绘制表格之前调用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()
    
  3. 自动执行以上操作:

        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 :(得分:2)

"Type safety: Unchecked cast from ResponseEntity<capture#1-of ? extends ResourceSupport> to ResponseEntity<ErrorResource>" 实施视口是一种潜在的解决方案。

视口定义图形设备中的区域。有时候定义一个视口,然后将其推入并在其中绘制是有用的。然后可以在内部推动和绘制不同的视口;这种方法相当于在页面上排列对象的简单方法。

首先,定义页面和边距大小。

grid

接下来,为每列定义视口。

要在视口中水平排列列,它们的x位置将在间隔(0,1)中等间隔。

在2列情况下,x1 = 0.25且x2 = 0.75:

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

现在,定义了实际数据。 此数据也需要“grob'd”以绘制到视口中。

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

现在,绘制pdf:

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

答案 4 :(得分:1)

我刚用过黑客。我使用R2HTML将表打印到html,然后使用wkhtmltopdf将html转换为pdf。

R中的

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

wkhtmltopdf table.html table.pdf

答案 5 :(得分:0)

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