RのgridExtraパッケージのgrid.tableを使って40行5列程度のデータフレームを.pdfファイルに出力しようとしています。
ただし、40 行はページには長すぎるため、.pdf ファイルにはデータフレームの一部しか表示されません。すべての行が 1 ページに表示されるように、1 ページに 2 列を印刷できるかどうかを知りたいです。または、データフレームを複数のページに印刷する方法を知る必要があります。ありがとう、ジョン
次の戦略をお勧めします: 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()
gridExtra パッケージを使用して、複数のページにまたがる pdf ファイルのテーブルを描画するには、これを試してください。
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()
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)
からビューポートを実装することgrid
は、1 つの潜在的な解決策です。
ビューポートは、グラフィックス デバイスの領域を定義します。ビューポートを定義してから、それをプッシュしてその中に描画すると便利な場合があります。次に、別のビューポートをプッシュして内部に描画できます。この方法は、ページ上にオブジェクトを配置する簡単な方法になります。
まず、ページと余白のサイズを定義します。
# 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) で等間隔にします。
2 列の場合、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)
これで、実際のデータが定義されました。このデータは、ビューポートに描画するためにも「グロブ」する必要があります。
# 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()
ハックを使っただけです。R2HTML を使用してテーブルを html に出力し、wkhtmltopdf を使用して html を pdf に変換しました。
Rで:
library(R2HTML)
HTML(table, file="table.html")
シェルで
wkhtmltopdf table.html table.pdf