Wie kann ich mit Rstudio und knitr Latex-Tabellen im PDF-Format erstellen? Wie kann ich breite Tabellen an die Seite anpassen? Ich bin grundsätzlich auf der Suche nach Möglichkeiten, die Tische zu verkleinern.
Mit Zahlen ist es in Knitr wirklich einfach, out.width = zu verwenden, aber mit Tabellen kann ich keinen Weg finden, dies zu tun.
Irgendwelche Vorschläge?
\documentclass{article}
\begin{document}
Die folgenden Tabellen sind zu breit für das PDF. Ich hoffe, es gibt eine einfache Möglichkeit, sie zu verkleinern. In diesem Beispiel habe ich Tabellen verwendet, die aus den Funktionen xtable (), stargazer () und latex () generiert wurden.
<<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}
Den Stat-R-Vorschlägen folgend habe ich versucht, die resizebox zu verwenden, aber es funktioniert nicht:
\documentclass{article}
\usepackage{graphicx}
\begin{document}
Ich habe versucht, Reshapebox zu verwenden, aber ich weiß wirklich nicht, wie ich es in Rstudio/knitr schaffen kann:
<<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}
Ich erhalte diesen Fehler:
! 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
Sie können ein scalebox
-Argument wie folgt an print.xtable
übergeben
<<results='asis'>>=
print(xtable(wide.df), scalebox='0.75')
@
Die Größe der Tabelle wird dadurch nicht automatisch an die Seite angepasst (leider unterstützt xtable
kein resizebox
-Argument), aber für viele Anwendungen ist dies möglicherweise ausreichend.
Das Problem mit Ihrem Code ist, dass xtable
die Tabelle in einer table
-Umgebung und nicht nur in einer Tabelle zurückgibt. Was Sie in resizebox
einschließen müssen, ist jedoch tabular
. Der einzige Weg, um zu sehen, dass dies so funktioniert, wie Sie es möchten, besteht darin, dass xtable nur den tabular
zurückgeben soll, wie es so ist:
\begin{table}
\resizebox{\textwidth}{!} {
<<results='asis'>>=
print(xtable(wide.df), floating=FALSE)
@
}
\end{table}
und dann den LaTeX-Code manuell umschreiben.
Aktualisierung, um die Änderungen im Code der letzten Jahre widerzuspiegeln und die Einstellung, dass Leute normalerweise in .RMarkdown statt im Rnw-Dateiformat arbeiten.
Das Paket kableExtra
in R ist der einfachste Weg, um die Größe von Tabellen anzupassen. Sie können die Breite der Tabelle mit der Funktion kable_styling(latex_options = "scale_down")
skalieren. Dadurch wird die Tabelle auf die Breite der Seite festgelegt.
kable(iris[1:5,],
format = "latex", booktabs = TRUE) %>%
kable_styling(latex_options = "scale_down")
Weitere Beispiele für das kableExtra-Paket finden Sie hier: https://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf
Hier ist ein Beispiel für 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")
```
Im Folgenden sind einige typische Schritte aufgeführt, mit denen Sie die Tabellengröße verkleinern können.
\setlength{\tabcolsep}{1pt}
\resizebox{\linewidth}{!}{ %% <-- The most effective way to fit a table / figure
\begin{tabular}
...
...
\end{tabular}
} %resizebox
Verwenden Sie für Text den Modus \sf
, um den Text besser sichtbar zu machen.
Das LaTeX-Paket tabulary
passt besser eine Tabelle an die Seitenbreite an. Es kann beispielsweise gesagt werden, dass die Zeilen unterbrochen werden. Ich weiß nicht, ob Sie es mit xtable verwenden können.
Eine huxtable
-basierte Lösung (mein Paket):
library(huxtable)
h <- as_hux(iris)
width(h) <- 0.5
Dies garantiert nicht, dass die Tabelle die angegebene Breite nicht überschreitet, und wennso wird sie überschritten. Mögliche Lösungen umfassen das Ändern der Schriftgröße:
font_size(h) <- 8
Oder die Tabelle aufteilen:
h1 <- h[, 1:5]
h2 <- h[, -(1:5)]
Folgendes funktioniert gut für mich:
print(xtable(wide.df), scalebox='0.75', floating=FALSE)
Dies ist besonders nützlich für Tabellen in R Markdown.
Eine andere Option könnte so aussehen:
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))
}
wird auf alle Spalten angewendet, die zu breit sind
Wie wäre es mit dem automatischen Aufteilen der breiten Tische in Teile wie bei den guten alten 80 Zeichen breiten VT100-Terminals? Dies ist in der Regel eine gute Vorgehensweise für LaTex/docx/odt-Tabellen und wird standardmäßig in pander festgelegt:
> 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
--------------------------------------
Weitere Informationen finden Sie unter ?pandoc.table
und table.split.table
in ?panderOptions
.