Como manter a posição da figura com a legenda da figura em pdf do knitr?
estou usando knitr (1.9.5 e 1.9.17) e rmarkdown (0.5.3.1), e gostaria de manter a posição da figura na saída pdf. O ficheiro pdf gerado está a funcionar bem quando é usada a opção chunk fig.pos="H"
.
No entanto, a posição da figura não é mantida quando fig_caption: yes
é definido na
cabeçalho yaml.
editar:
Depois de aprender o ambiente flutuante do látex. Eu adicionofloat
pacote em cabecalho.
\usepackage{float}
Mas o ficheiro Tex gerado usa sempre htbp
no ambiente figure
em relação a quaisquer opções fig.pos
são usadas. Depois de alterar manualmente htbp
para H
, as posições de todas as figuras são mantidas.
Este é o meu exemplo de ficheiro 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
6 answers
Como Andrew salientou, isto fig.pos
não funciona em pedaços, mas funciona se for colocado em opções globais:
```{r global_options, include=FALSE}
knitr::opts_chunk$set(fig.pos = 'H')
```
Update veja esta solução melhor aqui. (o resumo do problema abaixo ainda é bom, mas siga o link para uma solução melhor).
Para resumir alguns testes em RStudio
O argumento knitr chunk Fig.pos = " H " funciona desde que fig_caption: yes
não esteja no cabeçalho yaml.
Cada figura no gerado .o tex parece-se com isto.
\subsection{my_section}\label{my_section}
\includegraphics{path_to_fig.pdf}
Mas se fig_caption: yes
está no cabeçalho yaml então o .o tex parece ... este
\subsection{my_section}\label{my_section}
\begin{figure}[htbp]
\centering
\includegraphics{path_to_fig.pdf}
\caption{}
\end{figure}
fig.pos = "H"
não foi usado, "htbp"
está lá em vez disso.
A workaround for this using RStudio:
Colocar
fig_caption: yes
keep_tex: yes
Na yaml assim como
header-includes: \usepackage{float}
Então procure e substitua [htbp]
por [H]
no gerado .ficheiro tex
Então abra o .Tex file in RStudio and use the" Compile PDF " button.
Exemplo .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)
```
Você também pode definir uma opção por omissão global para a colocação de figuras em latex, incluindo isto no seu cabeçalho YAML inclui:
\makeatletter\renewcommand*{\fps@figure}{H}\makeatother
Como explicado Aqui (e aqui para a parte \makeat...
.
Desta forma, poderá apenas usar o botão de malha no RStudio ou rmarkdown::renderizar e terminar com ele.
A questão é que todos os números sejam preenchidos com H e não serás capaz de definir um para flutuar.Para mim adicionar o pacote float
e depois \floatplacement{figure}{H}
em YAML resolveu o problema como:
---
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}
---
Como Yihui mencionado na resposta, o (Figura posição em markdown, quando da conversão para PDF com knitr e pandoc), não podemos esperar muito sobre a formatação de mardown. Para resolver este problema, basta escrever alguns scripts R para substituir htbp
a H
.
Comparado com knit
do pacote knitr, descobri que render
do rmarkdown é melhor exportar um ficheiro tex
. Lembre - se apenas de adicionar keep_tex: yes
no cabeçalho yaml do seu ficheiro 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')
A opção que funcionou para mim:
In the .Tex put at the beginning: {[[0]}.
No início do Rmd: knitr::opts_chunk$set(fig.pos = 'H')
. O H
em maiúsculas).
E em cada bloco com uma imagem: fig.cap="lorem blabla"
e out.extra=''
(VALOR do parâmetro=Texto vazio).
Não há necessidade de definir:
fig_caption: yes
e keep_tex: yes
na yaml.
Estas opções fazem com que a imagem mantenha a sua posição, seja para include_graphics
e os gráficos gerados pelo Código R.
Usei-os no bookdown
enviroment, gerando o pdf e o html como esperado:)