web-dev-qa-db-fra.com

Ajuste automatiquement la largeur de la table LaTeX pour s’adapter au pdf à l’aide de knitr et Rstudio

En utilisant Rstudio et knitr pour produire des tables en latex au format pdf, comment puis-je adapter des tables larges à la page? Je cherche fondamentalement un moyen de réduire les tables.

Avec les chiffres, c’est vraiment facile dans Knitr avec out.width =, mais avec les tableaux, je ne trouve pas moyen de le faire. 

Aucune suggestion?

\documentclass{article}

\begin{document}

Les tableaux suivants sont trop larges pour correspondre au pdf. J'espère qu'il existe un moyen simple de les réduire pour les adapter. Dans cet exemple, j'ai utilisé des tables générées à partir des fonctions xtable (), stargazer () et 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}

Suivant les suggestions de Stat-R, j'ai essayé d'utiliser resizebox mais je ne parviens pas à le faire fonctionner:

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

J'ai essayé d'utiliser reshapebox mais je ne sais vraiment pas comment le faire fonctionner avec 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}

Je reçois cette erreur: 

! 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 
22
Rene Bern

Vous pouvez passer un argument scalebox à print.xtable comme suit

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

Cela ne redimensionne pas automatiquement le tableau pour l'adapter à la page (malheureusement, xtable ne prend pas en charge un argument resizebox), mais pour de nombreuses applications, ce qui précède peut être suffisant.

Le problème avec votre code est que xtable renvoie la table enveloppée dans un environnement table et pas seulement sous forme de tableau. Ce que vous devez envelopper dans la resizebox, cependant, est la tabular. Le seul moyen que je vois pour que cela fonctionne comme vous le souhaitez est de laisser xtable ne renvoyer que le tabular, comme ceci:

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

et ensuite écrire le code LaTeX autour de lui manuellement.

14
RoyalTS

Mise à jour pour refléter les modifications apportées au code au cours des dernières années et la préférence des utilisateurs de travailler au format de fichier .RMarkdown au lieu du format de fichier Rnw.

Le package kableExtra dans R est le moyen le plus simple de régler la taille des tables. Vous pouvez redimensionner la largeur du tableau à l'aide de la fonction kable_styling(latex_options = "scale_down"). Cela forcera la table à la largeur de la page.

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

Pour plus d’exemples du paquet kableExtra, consultez le paquet ici: https://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf

Voici un exemple de 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

9
Michael Harper

Voici quelques étapes typiques que vous pouvez suivre pour réduire la taille de la table.

\setlength{\tabcolsep}{1pt}

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

Pour le texte, utilisez le mode \sf pour rendre le texte plus visible.

2
LKB

Le package LaTeX tabulary permet d’ajuster un tableau à la largeur de la page. On peut dire de casser des lignes par exemple. Mais je ne sais pas si vous pouvez l’utiliser avec xtable.

0
nnn

Une solution basée sur huxtable (mon package):

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

Cela ne garantit pas que la table ne dépassera pas la largeur spécifiée, et ifso sera dépassée. Les solutions possibles incluent la modification de la taille de la police:

font_size(h) <- 8

Ou diviser la table:

h1 <- h[, 1:5]
h2 <- h[, -(1:5)]
0
user3603486

Ce qui suit fonctionne bien pour moi:

    print(xtable(wide.df), scalebox='0.75', floating=FALSE)

Ceci est particulièrement utile pour les tables dans R Markdown.

0
John Maindonald

Une autre option pourrait être quelque chose comme:

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]{@{}c@{}}%s\\end{tabular}", s),
         character(1))
}

appliqué à toutes les colonnes trop larges

0
Rentrop

Pourquoi ne pas scinder automatiquement les tables larges en plusieurs parties comme sur les bons vieux terminaux VT100 de 80 caractères? Ceci est généralement une bonne pratique pour les tables LaTex/docx/odt et défini par défaut dans 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  
--------------------------------------

Veuillez consulter ?pandoc.table et table.split.table dans ?panderOptions pour plus de détails.

0
daroczig