Автоматическая настройка ширины таблицы LaTeX для установки в pdf с использованием knitr и Rstudio
Используя Rstudio и knitr для производства латекс-таблиц в формате pdf, как мне сделать широкие таблицы подходящими для страницы? Я в основном ищут способ сжать таблицы.
С рисунками в Knitr это действительно легко, используя out.width =, но с таблицами я не могу найти способ сделать это.
Любые предложения?
\documentclass{article}
\begin{document}
Следующие таблицы слишком широки, чтобы соответствовать PDF. Я надеюсь, что есть простой способ уменьшить их размер. В этом примере я использовал таблицы, созданные из функций xtable(), stargazer() и latex().
<<message=FALSE>>=
library(xtable)
library(stargazer)
library(Hmisc)
library(tables)
wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,])
@
<<results='asis'>>=
xtable(wide.df)
@
<<results='asis'>>=
stargazer(wide.df,summary=FALSE)
@
<<results='asis'>>=
latex( tabular( Species ~ (Sepal.Length +Sepal.Length + Sepal.Width + Petal.Length + Petal.Width )*(mean + sd + mean + mean ) , data=iris) )
@
\end{document}
Следуя рекомендациям Stat-R, я попытался использовать resizebox, но не могу заставить его работать:
\documentclass{article}
\usepackage{graphicx}
\begin{document}
Я пытался использовать reshapebox, но я действительно не знаю, как заставить его работать в Rstudio/knitr:
<<message=FALSE>>=
library(xtable)
wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,])
@
\resizebox{0.75\textwidth}{!}{%
<<results='asis'>>=
xtable(wide.df)
@
%}
\end{document}
Я получаю эту ошибку:
! File ended while scanning use of \[email protected]@dd.
sessioninfo()
R version 3.0.0 (2013-04-03)
Platform: i386-w64-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=Danish_Denmark.1252 LC_CTYPE=Danish_Denmark.1252 LC_MONETARY=Danish_Denmark.1252 LC_NUMERIC=C
[5] LC_TIME=Danish_Denmark.1252
attached base packages:
[1] splines grid stats graphics grDevices utils datasets methods base
other attached packages:
[1] tables_0.7 Hmisc_3.10-1 survival_2.37-4 stargazer_3.0.1 pgirmess_1.5.7 splancs_2.01-32 spdep_0.5-56 coda_0.16-1 deldir_0.0-22
[10] maptools_0.8-23 foreign_0.8-53 MASS_7.3-26 Matrix_1.0-12 lattice_0.20-15 rgdal_0.8-9 sp_1.0-9 nlme_3.1-109 boot_1.3-9
[19] xtable_1.7-1 scales_0.2.3 plyr_1.8 reshape2_1.2.2 ggplot2_0.9.3.1
loaded via a namespace (and not attached):
[1] cluster_1.14.4 colorspace_1.2-2 dichromat_2.0-0 digest_0.6.3 evaluate_0.4.3 formatR_0.7 gtable_0.1.2 knitr_1.2
[9] labeling_0.1 LearnBayes_2.12 munsell_0.4 proto_0.3-10 RColorBrewer_1.0-5 stringr_0.6.2 tools_3.0.0
Ответы
Ответ 1
Вы можете передать аргумент scalebox
в print.xtable
так:
<<results='asis'>>=
print(xtable(wide.df), scalebox='0.75')
@
Это не автоматически изменяет размер таблицы для соответствия странице (к сожалению, xtable
не поддерживает аргумент resizebox
), но для многих приложений вышеуказанное может быть достаточно хорошим.
Проблема с вашим кодом заключается в том, что xtable
возвращает таблицу, заключенную в среду table
, а не только таблицу. Однако вы должны обернуть resizebox
tabular
. Единственный способ, с помощью которого я могу заставить это работать, так как вы хотите, чтобы xtable возвращал только tabular
, например:
\begin{table}
\resizebox{\textwidth}{!} {
<<results='asis'>>=
print(xtable(wide.df), floating=FALSE)
@
}
\end{table}
а затем написать код LaTeX вокруг него вручную.
Ответ 2
Ниже приведены некоторые типичные шаги, которые можно предпринять для сокращения размера таблицы.
\setlength{\tabcolsep}{1pt}
\resizebox{\linewidth}{!}{ %% <-- The most effective way to fit a table / figure
\begin{tabular}
...
...
\end{tabular}
} %resizebox
Для использования текста используйте \sf
, чтобы сделать текст более заметным.
Ответ 3
Обновление, чтобы отразить изменения в коде за последние несколько лет, и предпочтение для людей, как правило, работать в .RMarkdown вместо формата файла Rnw.
Пакет kableExtra
в R - это самый простой способ настройки размера таблиц. Вы можете масштабировать ширину таблицы, используя функцию kable_styling(latex_options = "scale_down")
. Это заставит таблицу ширину страницы.
kable(iris[1:5,],
format = "latex", booktabs = TRUE) %>%
kable_styling(latex_options = "scale_down")
Дополнительные примеры пакета kableExtra см. здесь: https://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf
Вот пример MWE:
---
title: "MWE"
author: "Mikey Harper"
date: "7 November 2017"
output: pdf_document
---
```{r setup, include=FALSE}
library(kableExtra)
library(magrittr)
knitr::opts_chunk$set(echo = TRUE)
```
```{r}
# Build the dataframe
wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,])
```
```{r}
# Basic table
knitr::kable(wide.df)
```
```{r}
# Scaled Table
knitr::kable(wide.df, format = "latex", booktabs = TRUE) %>%
kable_styling(latex_options = "scale_down")
```
![введите описание изображения здесь]()
Ответ 4
Как насчет автоматического разделения широких таблиц на части, как на старых старых терминалах VT100 на 80 символов? Как правило, это хорошая практика для таблиц LaTex/docx/odt и устанавливается по умолчанию в pander:
> set.caption('Hello Fisher!')
> pander(wide.df)
---------------------------------------------------------
Sepal.Length Sepal.Width Petal.Length Petal.Width
-------------- ------------- -------------- -------------
5.1 3.5 1.4 0.2
4.9 3 1.4 0.2
4.7 3.2 1.3 0.2
4.6 3.1 1.5 0.2
5 3.6 1.4 0.2
5.4 3.9 1.7 0.4
4.6 3.4 1.4 0.3
5 3.4 1.5 0.2
4.4 2.9 1.4 0.2
4.9 3.1 1.5 0.1
---------------------------------------------------------
Table: Hello Fisher! (continued below)
-----------------------------------------------------
Species Sepal.Length Sepal.Width Petal.Length
--------- -------------- ------------- --------------
setosa 5.1 3.5 1.4
setosa 4.9 3 1.4
setosa 4.7 3.2 1.3
setosa 4.6 3.1 1.5
setosa 5 3.6 1.4
setosa 5.4 3.9 1.7
setosa 4.6 3.4 1.4
setosa 5 3.4 1.5
setosa 4.4 2.9 1.4
setosa 4.9 3.1 1.5
-----------------------------------------------------
Table: Table continues below
----------------------------------------------------
Petal.Width Species Sepal.Length Sepal.Width
------------- --------- -------------- -------------
0.2 setosa 5.1 3.5
0.2 setosa 4.9 3
0.2 setosa 4.7 3.2
0.2 setosa 4.6 3.1
0.2 setosa 5 3.6
0.4 setosa 5.4 3.9
0.3 setosa 4.6 3.4
0.2 setosa 5 3.4
0.2 setosa 4.4 2.9
0.1 setosa 4.9 3.1
----------------------------------------------------
Table: Table continues below
--------------------------------------
Petal.Length Petal.Width Species
-------------- ------------- ---------
1.4 0.2 setosa
1.4 0.2 setosa
1.3 0.2 setosa
1.5 0.2 setosa
1.4 0.2 setosa
1.7 0.4 setosa
1.4 0.3 setosa
1.5 0.2 setosa
1.4 0.2 setosa
1.5 0.1 setosa
--------------------------------------
Подробнее см. ?pandoc.table
и table.split.table
в ?panderOptions
.
Ответ 5
Пакет LaTeX tabulary
лучше подходит для установки таблицы на ширину страницы. Например, можно сказать, что нужно разбить строки. Но я не знаю, можете ли вы использовать его с помощью xxtable.
Ответ 6
Другим вариантом может быть что-то вроде:
my_wrap <- function(x, width) {
x_split <- strwrap(x, width = width, simplify = FALSE)
x_split <- lapply(x_split, paste, collapse = " \\\\ ")
vapply(x_split, function(s) sprintf("\\begin{tabular}[x]{@{}[email protected]{}}%s\\end{tabular}", s),
character(1))
}
применяется ко всем столбцам шириной
Ответ 7
Следующие работы отлично подходят для меня:
print(xtable(wide.df), scalebox='0.75', floating=FALSE)
Это особенно полезно для таблиц в R Markdown.