Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automatically adjust LaTeX table width to fit pdf using knitr and Rstudio

Using Rstudio and knitr to produce latex-tables in pdf, how do I make wide tables fit the page? I'm basically looking for at way to shrink the tables.

With figures, it is really easy in Knitr using out.width=, but with tables I can't seem find a way to do it.

Any suggestions?

\documentclass{article}  \begin{document} 

The following tables are too wide to fit the pdf. I hope there is a simple way to shrink them to fit. In this example I've used tables generated from the xtable(), stargazer() and latex() functions.

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

Following Stat-R's suggestions I've tried to use resizebox but can't get it to work:

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

I've tried to use reshapebox but I am really clueless on how to get it to work in 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} 

I get this error:

! File ended while scanning use of \Gscale@box@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  
like image 635
Rene Bern Avatar asked May 12 '13 12:05

Rene Bern


People also ask

How do you autofit a table in LaTeX?

Use p{width} column specifier: e.g. \begin{tabular}{ l p{10cm} } will put column's content into 10cm-wide parbox, and the text will be properly broken to several lines, like in normal paragraph. You can also use tabular* environment to specify width for the entire table.

How do you use the knitr in R studio?

If you are using RStudio, then the “Knit” button (Ctrl+Shift+K) will render the document and display a preview of it.

What is knitr :: Kable?

The kable() function in knitr is a very simple table generator, and is simple by design. It only generates tables for strictly rectangular data such as matrices and data frames.


2 Answers

You can pass a scalebox argument to print.xtable like so

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

That doesn't automatically resize the table to fit the page (unfortunately xtable doesn't support a resizebox argument) but for many applications the above might be good enough.

The problem with your code is that xtable returns the table wrapped in a table environment and not just a tabular. What you have to wrap in the resizebox, however, is the tabular. The only way I can see to get this to work as you want it is to let xtable return only the tabular, like so:

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

and then to write the LaTeX code around it manually.

like image 120
RoyalTS Avatar answered Sep 18 '22 12:09

RoyalTS


Updating to reflect the changes in code past few years, and the preference for people to typically work in .RMarkdown instead of Rnw file format.

The kableExtra package in R is the easiest way for adjusting the size of tables. You can scale the width of the table using the function kable_styling(latex_options = "scale_down"). This will force the table to the width of the page.

   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

Here is an example 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

like image 30
Michael Harper Avatar answered Sep 21 '22 12:09

Michael Harper