2016-08-02 2 views
1

Я пытаюсь автоматизировать серию анализов, которые предназначены для сохранения ряда графиков для последующей проверки. Один из участков будет сопровождаться таблицей ценностей. Я хотел бы иметь их в том же формате pdf, чтобы пользователям не приходилось перебирать файлы.Распечатка кадра данных в R: grid.table выводит обрезанные таблицы, не отвечает на fontsize

Я проверил многочисленные вопросы на SO относительно вывода кадров данных в формат PDF, вот несколько причин, почему существующие ответы не являются удовлетворительными в моем случае:

  • Не знакомы с knitr/Sweave
  • Пакетная генерация цифр означает, что я не могу сделать это вручную через RStudio Viewer
  • Решения grid.table не генерируют всю таблицу.

Это подводит меня к моим проблемам, скажем, что у меня есть стол 48 х 5 в пропорциях. Если я попытаюсь построить его с grid.table(geno), это приведет к обрезанной таблице, показывающей примерно 20-30 рядов посередине. Если я иду с grid.table(geno, gp = gpar(fontsize=8)), чтобы уменьшить шрифт, я получаю следующее сообщение об ошибке.

Error in gtable_table(d, name = "core", fg_fun = theme$core$fg_fun, bg_fun = theme$core$bg_fun, : 
    unused argument (gp = list(fontsize = 8) 

)

По существу я хотел бы иметь возможность использовать его таким образом:

library(grid) 
library(gridExtra) 
pdf(file="gtype.pdf", title = "Genotype data") 
plotGenotype(geno, text_size = 10) # outputs a custom plot 
grid.newpage() 
grid.table(geno)   # grid.table(geno, gp = gpar(fontsize=8)) 
dev.off() 

Проблема здесь состоит в том, что я либо получить обрезанную таблицу или вообще ничего, на вторая страница. Я заметил, что многие люди добавляют height=11, width=8.5 в звонок pdf(). Я не уверен, если/почему это будет иметь значение, но установка paper="a4" или высота/ширина в соответствии с А4 не имеет никакого значения в моем случае.

Q1: Невозможно получить grid.table, чтобы изменить размер по содержанию, а не бумаге?

Q2: Есть ли другой способ получить фрейм данных, напечатанный в pdf без необходимости использования решений на базе LaTeX?

(я в настоящее время работает R 3.3.1 и 2.2.1) gridExtra

+0

вы проверили [этот FAQ] (https://github.com/baptiste/gridextra/wiki#problems-with-gridtable)? – baptiste

+0

@baptiste спасибо за ссылку. Я видел примеры/документацию, но, возможно, пропустил FAQ. Я спрашиваю, хотя, где в [этом примере] (http://stackoverflow.com/a/31620903/328725) корректируется шрифт? – posdef

+1

Размер шрифта задан в теме, это 7pts в 'ttheme_default (7)' – baptiste

ответ

2

Q1: Разве это не возможно, чтобы получить grid.table изменять размеры в зависимости от содержания, а не бумаги?

Возможно, но в целом не желательно. Таблица предназначена для чтения, и если текст и интервалы определяются страницей, а не содержимым, она часто дает нечитаемые результаты. Таким образом, обычный совет: manually tweak the font size and padding, или split the table.

Это отнюдь не техническое ограничение: не стесняйтесь set the cell size to fit the page:

grid.newpage() 
pushViewport(viewport(width=unit(0.8,"npc"), height=unit(0.8,"npc"))) 
g <- g2 <- tableGrob(iris[1:4, 1:3], cols = NULL, rows=NULL) 
g2$heights <- unit(rep(1/nrow(g2), nrow(g2)), "npc") 
grid.arrange(rectGrob(), rectGrob(), nrow=1, newpage = FALSE) 
grid.arrange(g, g2, nrow=1, newpage = FALSE) 

enter image description here

но со слишком большим количеством контента для страницы неясно, какой результат лучше

grid.newpage() 
pushViewport(viewport(width=unit(0.8,"npc"), height=unit(0.8,"npc"))) 

g <- g2 <- tableGrob(iris[1:20, 1:3], cols = NULL, rows=NULL) 
g3 <- tableGrob(iris[1:20, 1:3], cols = NULL, rows=NULL, theme=ttheme_default(base_size=7)) 
g2$heights <- g3$heights <- unit(rep(1/nrow(g2), nrow(g2)), "npc") 
grid.arrange(rectGrob(), rectGrob(), rectGrob(), nrow=1, newpage = FALSE) 
grid.arrange(g, g2, g3, nrow=1, newpage = FALSE) 

enter image description here

Если размер страницы можно изменить, это, как правило, лучший вариант. Можно запросить размер таблицы перед рисованием, преобразовать ее в дюймы и передать ее на устройство.

g1 <- tableGrob(iris[1:4, 1:5]) 
g2 <- tableGrob(iris[1:20, 1:5]) 

maxheight <- convertHeight(sum(g2$heights), "in", TRUE) 
pdf("fit.pdf", height=maxheight) 
grid.draw(g1) 
grid.newpage() 
grid.draw(g2) 
dev.off() 

enter image description here

Однако, насколько я знаю, все страницы в заданном формате PDF будет иметь тот же размер (там могут быть пути вокруг него, но сложно).

+0

Я вижу вашу точку зрения на читаемость. Только для записи я никогда не предполагал, что размер бумаги должен определять размер таблицы, напротив, я полностью согласен с тем, что размер содержимого должен определять размер компонентов таблицы. Как я уже упоминал выше, в отношении часто задаваемых вопросов, я не уверен, как размер шрифта изменен в примере, который вы указали – posdef

Смежные вопросы