2013-05-12 8 views
19

Mit Rstudio und knitr können Sie Latex-Tabellen im PDF-Format erstellen. Wie kann ich breite Tabellen an die Seite anpassen? Ich bin im Grunde auf der Suche nach einer Möglichkeit, die Tische zu verkleinern.Automatische Anpassung der LaTeX-Tischbreite an pdf mit knitr und Rstudio

Mit Zahlen, es ist wirklich einfach in Knitr out.width = verwenden, aber mit Tabellen kann ich nicht scheinen, einen Weg zu finden, es zu tun.

Irgendwelche Vorschläge?

\documentclass{article} 

\begin{document} 

Die folgenden Tabellen sind zu groß, um in das PDF zu passen. 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} 

Nach Stat-R Vorschläge habe ich versucht, resizebox zu verwenden, aber es funktioniert nicht bekommen kann:

\documentclass{article} 
\usepackage{graphicx} 
\begin{document} 

ich reshapebox zu verwenden versucht haben, aber ich bin wirklich ratlos, wie man bekommen es in Rstudio/knitr zu arbeiten:

<<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 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 
+1

Halten Sie: http: //tex.stackexchange.com/questions/26477/wider-tables-in- latex-was-ist-die-beste-lösung] –

+0

Für mich scheint es eher eine Latexfrage als rstudio und knitr –

+0

Es würde wahrscheinlich auch auf tex.stack passen (...) und der feine Link den du mir gegeben hast wies mich darauf hin resizingbox() aber ich bin nicht in der Lage, es in einem knitr Dokument in Rstudio zu arbeiten:/ –

Antwort

0

Wie wäre es, die großen Tische automatisch in Teile zu teilen, genau wie auf den guten alten 80 Zeichen breiten VT100 Terminals? Dies ist in der Regel eine gute Praxis für Latex-/docx/odt Tabellen und in pander Voreingestellt:

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

Bitte ?pandoc.table und table.split.table in ?panderOptions für weitere Details sehen.

0

Das LaTeX-Paket tabulary ist besser in der Anpassung einer Tabelle an die Seitenbreite. Es kann beispielsweise gesagt werden, dass Linien unterbrochen werden sollen. Aber ich weiß nicht, ob du es mit xtable benutzen kannst.

11

Sie können eine scalebox Argument print.xtable passieren wie so

<<results='asis'>>= 
print(xtable(wide.df), scalebox='0.75') 
@ 

, die nicht automatisch die Tabelle nicht die Größe der Seite passt (leider xtable kein resizebox Argument nicht unterstützt), aber für viele Anwendungen der oben könnte gut genug sein.

Das Problem mit Ihrem Code ist, dass xtable die Tabelle in eine table Umgebung und nicht nur eine Tabelle verpackt zurückgibt. Was Sie jedoch in die resizebox einpacken müssen, ist die tabular. Der einzige Weg, ich sehe zu bekommen dies funktioniert, wie Sie es wollen, ist XTABLE Rückkehr nur die tabular zu lassen, wie so:

\begin{table} 
\resizebox{\textwidth}{!} { 
<<results='asis'>>= 
print(xtable(wide.df), floating=FALSE) 
@ 
} 
\end{table} 

und dann um sie manuell den LaTeX-Code zu schreiben.

+0

Danke für die tolle Lösung. Ich frage mich, ob es eine Möglichkeit gibt, '\ textwidth' nur zu verwenden, wenn die Tabellenbreite größer ist als die' \ textwidth'? In der automatischen Berichterstattung sind Tabellen manchmal groß und manchmal winzig. Die Verwendung der vollen Textbreite erzeugte eine umständliche große Schriftartentabelle. – Shambho

+0

Vielleicht könnte dies funktionieren: http://tex.stackexchange.com/questions/97505/shrink-table-to-fit-on-a-page-or-keep-it-as-it-is – RoyalTS

2

Im Folgenden finden Sie einige typische Schritte zum Verringern der Tabellengröße.

\setlength{\tabcolsep}{1pt} 

\resizebox{\linewidth}{!}{ %% <-- The most effective way to fit a table/figure 
\begin{tabular} 
... 
... 
\end{tabular} 
} %resizebox 

Für Text Verwendung \sf Modus der Text besser sichtbar zu machen.

0

Eine weitere Option könnte sein, so etwas wie:

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

auf alle Spalten angewendet, die zu breit sind

0

Die folgende 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.

+0

Es funktioniert nicht für mich. Ich benutze die Funktion kable und r {results = 'asis "}. – JAQuent

6

Aktualisierung, um die Änderungen im Code in den letzten Jahren widerzuspiegeln, und die Einstellung, dass Benutzer in der Regel in .RMarkdown anstelle des RNW-Dateiformats arbeiten.

Das kableExtra Paket 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. Dies wird die Tabelle auf die Breite der Seite zwingen.

kable(iris[1:5,], 
      format = "latex", booktabs = TRUE) %>% 
      kable_styling(latex_options = "scale_down") 

For more examples of the kableExtra package, check out the package here: https://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf

Hier ist ein Beispiel 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") 
``` 

enter image description here

+0

Wenn jemand andere Probleme hat, die Tabelle mit dieser Methode zu positionieren, gibt es zusätzliche' latex_options 'von' kableExtra', 'hold_postion '' und '" HOLD_position "' verfügbar. – mlegge

0

A huxtable -basierte Lösung (mein Paket):

library(huxtable) 
h <- as_hux(iris) 
width(h) <- 0.5 

Dies ist keine Garantie die ta ble wird die angegebene Breite nicht überschreiten, und wenn so wird es überlaufen. Mögliche Lösungen umfassen die Schriftgröße zu ändern:

font_size(h) <- 8 

oder die Tabelle Aufspalten:

h1 <- h[, 1:5] 
h2 <- h[, -(1:5)] 
Verwandte Themen