web-dev-qa-db-fra.com

Comment conserver la position de la figure avec la légende de la figure dans la sortie pdf de knitr?

J'utilise knitr (1.9.5 et 1.9.17) et rmarkdown (0.5.3.1), et je voudrais conserver la position de la figure dans la sortie pdf. Le fichier pdf généré fonctionne correctement lorsque l'option de bloc fig.pos="H" est utilisé.

Cependant, la position du chiffre n'est pas maintenue lorsque fig_caption: yes est défini dans l'en-tête yaml.

Comment dois-je résoudre ce problème? Merci pour toutes suggestions.

MODIFIER:

Après avoir appris l'environnement flottant de Latex. J'ajoute le package float dans l'en-tête.

\usepackage{float}

Mais le fichier tex généré utilise toujours htbp dans l'environnement figure pour tout fig.pos les options sont utilisées. Après avoir modifié manuellement htbp en H, les positions de tous les chiffres sont conservées.

Voici mon exemple de fichier rmd:

---
title: "Untitled"
output:
  pdf_document:
    fig_caption: yes
    includes:
        in_header: mystyles.sty
---

# Section 1


Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.


```{r fig1, echo=FALSE, fig.height=8.5, fig.pos="H"}
plot(cars)
```

# Section 2

More test

```{r fig2, echo=FALSE, fig.height=8.5, fig.pos="H"}
plot(cars)
```

# Section 3

```{r fig3, echo=FALSE, fig.height=8.5, fig.pos="H"}
plot(cars)
```

More test
28
Bangyou

Comme Yihui l'a mentionné dans sa réponse ( Position de la figure dans la démarque lors de la conversion en PDF avec knitr et pandoc ), nous ne pouvons pas trop nous attendre au formatage du mardown. Pour contourner ce problème problème, il suffit d'écrire quelques scripts R pour remplacer htbp en H.

Par rapport à knit du package knitr, j'ai trouvé que render de rmarkdown est préférable d'exporter un fichier tex. N'oubliez pas d'ajouter keep_tex: yes dans l'en-tête yaml de votre fichier rmarkdown.

library(rmarkdown)
render('filepath.Rmd')
x <- readLines('filepath.tex')
pos <- grep('begin\\{figure\\}\\[htbp\\]', x)
x[pos] <- gsub('htbp', 'H', x[pos])
writeLines(x, 'filepath.tex')
tools::texi2pdf('filepath.tex', clean = TRUE)  # gives foo.pdf

file.remove('filepath.tex')
4
Bangyou

Comme Andrew l'a souligné, cette fig.pos ne fonctionne pas en morceaux, mais il fonctionne s'il est placé dans les options globales:

```{r global_options, include=FALSE}
knitr::opts_chunk$set(fig.pos = 'H')
```

EDIT: ce qui précède apparemment utilisé pour travailler et a besoin \usepackage{float} dans le préambule:

header-includes:
 \usepackage{float}

Voir aussi ici .

17
Davor Josipovic

Pour moi, ajouter le package float puis \floatplacement{figure}{H} dans YAML a résolu le problème comme:

---
title: "test"
date: "`r Sys.Date()`"
output: 
  pdf_document :
    keep_tex: true
    number_sections: true
header-includes:
 \usepackage{booktabs}
 \usepackage{longtable}
 \usepackage{array}
 \usepackage{multirow}
 \usepackage[table]{xcolor}
 \usepackage{wrapfig}
 \usepackage{float}
 \floatplacement{figure}{H}
---
13
user9112767

Mise à jour regardez cette meilleure solution ici . (le résumé du problème ci-dessous est toujours bon, mais suivez le lien vers une meilleure solution).

Pour résumer certains tests dans RStudio

L'argument knitr chunk fig.pos = "H" fonctionne tant que fig_caption: yes n'est pas dans l'en-tête yaml.

Chaque figure dans le .tex généré ressemble à ceci

\subsection{my_section}\label{my_section}

\includegraphics{path_to_fig.pdf}

Mais si fig_caption: yes est dans l'en-tête yaml alors le .tex ressemble à ceci

\subsection{my_section}\label{my_section}

\begin{figure}[htbp]
\centering
\includegraphics{path_to_fig.pdf}
\caption{}
\end{figure}

fig.pos = "H" n'a pas été utilisé, "htbp" est là à la place.

Une solution de contournement pour cela en utilisant RStudio:

mettre

fig_caption: yes
keep_tex: yes

dans le yaml ainsi que

header-includes: \usepackage{float}

puis recherchez et remplacez [htbp] avec [H] dans le fichier .tex généré

puis ouvrez le fichier .tex dans RStudio et utilisez le bouton "Compiler PDF".


Exemple .Rmd

---
title: "Testing fig placement with captions"
author: "Andrew Dolman"
date: "1 September 2015"
output: 
  pdf_document: 
    fig_caption: yes
    keep_tex: yes
header-includes: \usepackage{float}
---

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.

When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

```{r}
summary(cars)
```

You can also embed plots, for example:

```{r, echo=FALSE, fig.pos="H"}
plot(cars)
```

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.

```{r, echo=FALSE, fig.pos="H"}
plot(cars)
```
13
Andrew

Bien que la réponse fournie par @Bangyou fonctionne, elle complique le tricot.

Vous pouvez également définir une option globale par défaut pour le placement des figures dans le latex, y compris dans votre en-tête YAML, notamment:

\makeatletter\renewcommand*{\fps@figure}{H}\makeatother

Comme expliqué ici (et ici pour le \makeat... partie).

De cette façon, vous pouvez simplement utiliser le bouton tricot dans RStudio ou rmarkdown :: render et en finir avec.

Le problème est que tous les chiffres doivent être forcés avec H et vous ne pourrez pas en définir un pour flotter.

7
Oscar de León

L'option qui a fonctionné pour moi:

Dans le .tex mis au début: \usepackage{float}.

Au début de la Rmd: knitr::opts_chunk$set(fig.pos = 'H'). H en majuscule).

Et dans chaque morceau avec une image: fig.cap="lorem blabla" Et out.extra='' (Valeur de paramètre = chaîne vide).

Non devez définir: fig_caption: yes Et keep_tex: yes Dans le yaml.

Ces options permettent à l'image de conserver sa position, que ce soit pour include_graphics Et les tracés générés par le code R.

Je les ai utilisés dans l'environnement bookdown, générant le pdf et le html comme prévu :)

5
pablo_sci

Le code de Position de la figure dans la démarque lors de la conversion en PDF avec knitr et pandoc m'aide, aide toute autre personne à le trouver utile.

---
title: "Example"
author: "Martin"
output: pdf_document
---

```{r}
knitr::knit_hooks$set(plot = function(x, options)  {
  knitr::hook_plot_tex(x, options)
})
```


```{r myplot, echo=FALSE, results='hide', fig.cap='Test', fig.pos='h'}
library(ggplot2)
ggplot(mtcars, aes(mpg, drat)) + geom_point()
```
0
Shixiang Wang

Dans le cas où quelqu'un d'autre tombe sur ce fil, j'ai dû utiliser le petit cas 'h' et cela a fonctionné dans la version R 3.5.3 et le latex 2018.

```{r, echo=FALSE, fig.pos="h"}
plot(cars)
```
0
tcratius