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
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.
If you are using RStudio, then the “Knit” button (Ctrl+Shift+K) will render the document and display a preview of it.
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.
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.
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") ```
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With