Pozycja rysunku w markdown podczas konwersji do PDF z knitr i pandoc

Próbuję kontrolować pozycję wykresu podczas konwersji do formatu PDF za pomocą knitr i pandoc. Ojej .Plik RMD wygląda tak:

# My report

Some text some text some text some text some text some text some text some text some text


```{r myplot, echo=FALSE, fig.pos="placeHere", results='hide'}

library(ggplot2)

ggplot(mtcars, aes(mpg, drat)) + geom_point()

```

Some text some text some text some text some text some text some text some text some text

\usepackage{graphicx}
\begin{figure}[placeHere]
  \centering
    \includegraphics[width=0.5\textwidth]{placeHere}
\end{figure}

Some text some text some text some text some text some text some text some text some text

Konwertuję do formatu PDF używając funkcji podanych tutaj: http://quantifyingmemory.blogspot.co.uk/2013/02/reproducible-research-with-r-knitr.html

Jak umieścić Wykres między drugim i trzecim blokiem tekstu? Kod latex nie działa w obecnej formie.

EDIT: This is what I ' m trying teraz.

# My report

   ```{r setup, include=FALSE}
# set global chunk options
opts_chunk$set(cache=FALSE)
library(ggplot2)
```

```{r, echo=FALSE, fig.height=3}

ggplot(mtcars, aes(disp, hp)) + geom_point()


```



Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 

Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 


Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 


Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 


```{r, echo=FALSE, fig.height=3}



ggplot(mtcars, aes(vs, am)) + geom_point()


```



Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 

Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 


Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 


```{r, echo=FALSE, fig.height=6}



ggplot(mtcars, aes(disp, cyl)) + geom_point()

```


```{r, echo=FALSE, fig.height=6}

ggplot(mtcars, aes(hp, qsec)) + geom_point()


```


Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 




```{r, echo=FALSE, fig.height=3}

ggplot(mtcars, aes(hp, wt)) + geom_point()

```



Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 



```{r, echo=FALSE, fig.height=5}

ggplot(mtcars, aes(mpg, drat)) + geom_point()

```




Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 
Author: Tyler Rinker, 2013-05-18

8 answers

Nie znam takiej opcji dla pandoc, aby ustawić zmienną opcję figur podczas konwersji dokumentu Markdown na LaTeX. Jeśli wybierzesz Markdown ze względu na jego prostotę, nie powinieneś oczekiwać od niego zbyt dużej mocy, nawet z potężnymi narzędziami, takimi jak pandoc. Podsumowując: Markdown to nie LaTeX . Został zaprojektowany dla HTML zamiast LaTeX.

Dwa sposoby:

  1. Użyj składni Rnw (R + LaTeX) zamiast RMD (R Markdown) (examples); wtedy będziesz można użyć opcji chunk fig.pos='H' Po \usepackage{float} w preambule; w tym przypadku masz pełną moc lateksu, a pandoc nie będzie zaangażowany

  2. Włamać się do dokumentu LaTeX wygenerowanego przez pandoc, np. coś w rodzaju

    library(knitr)
    knit('foo.Rmd')  # gives foo.md
    pandoc('foo.md', format='latex')  # gives foo.tex
    x = readLines('foo.tex')
    # insert the float package
    x = sub('(\\\\begin\\{document\\})', '\\\\usepackage{float}\n\\1', x)
    # add the H option for all figures
    x = gsub('(\\\\begin\\{figure\\})', '\\1[H]', x)
    # write the processed tex file back
    writeLines(x, 'foo.tex')
    # compile to pdf
    tools::texi2pdf('foo.tex')  # gives foo.pdf
    

Jeśli nie podobają ci się te rozwiązania, rozważ poproś o nową funkcję do pandoc na Githubie, a następnie usiądź i poczekaj.

 24
Author: Yihui Xie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-15 14:45:52

Przedstawiam alternatywne rozwiązanie. Zamiast wstawiać symbole [H] do dokumentu latex ' a w sposób post-hoc, sugeruję przedefiniowanie środowiska rysunków, aby ignorować wszelkie argumenty pozycji i używać [H].

Aby to zrobić, utwórz .plik tex w tym samym katalogu coPlik Rmd, który redefiniuje środowisko rysunku i aktualizuje nagłówek YAML w .Rmd, aby dołączyć plik podczas kompilacji.

Oto przykład .plik tex:

\usepackage{float}
\let\origfigure\figure
\let\endorigfigure\endfigure
\renewenvironment{figure}[1][2] {
    \expandafter\origfigure\expandafter[H]
} {
    \endorigfigure
}

Oto przykład .Rmd który obejmuje (zakładając, że nazwałeśtex file ' preambuła-latex.tex"): {]}

---
title: "example"
author: "you"
date: "`r format(Sys.time(), '%d %B %Y')`"
output:
  rmarkdown::pdf_document:
    fig_caption: yes        
    includes:  
      in_header: preamble-latex.tex
---

```{r, fig.cap='Markdownvellous!'}
plot(1:10, 1:10)
```
 54
Author: paleo13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-01 06:34:53

Używam KnitR i markdown w RSTUDIO, rozwiązaniem w moim przypadku jest dodanie we wstępie \usepackage{float}:

    ---
title: "Proyect 2"
author: "FV"
date: "2016-12-3"
output:
  pdf_document:
    fig_caption: yes
    fig_crop: no
    fig_height: 2
    fig_width: 3
    highlight: haddock
    keep_tex: yes
    number_sections: yes
    toc: yes
    toc_depth: 2
  html_document:
    fig_caption: yes
    theme: journal
    toc: yes
    toc_depth: 2
header-includes: 
- \usepackage{graphicx}
- \usepackage{float}
---

A następnie dodanie tej linii kodu (rys.pos=' H') w pierwszych wierszach:

```{r echo=FALSE,warning=FALSE}
 library(knitr)
  opts_chunk$set(fig.path='figure/graphics-', 
                 cache.path='cache/graphics-', 
                 fig.align='center',
                 external=TRUE,
                 echo=TRUE,
                 warning=FALSE,
                 fig.pos='H'
                )
  a4width<- 8.3
  a4height<- 11.7
```
 7
Author: Ferran VilBer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-12 16:00:14

Mam kilka projektów, z których dokonuję konwersji.Rmd do .pdf (głównie prezentacja slajdów beamer) i chcesz, aby wykresy nie pływają (pływające dane naprawdę nie działają z prezentacjami slajdów).

Metoda, której używam polega na dodaniu spacji po linii w pliku. md. Oznacza to, że wykres znajduje się wewnątrz akapitu, a nie jest jego własnym akapitem, oznacza to, że pandoc nie zawija go w środowisko rysunku (oznacza to również, że nie mogę użyć podpisu z to) i dlatego umieszcza go w dokładnie tej pozycji.

Używam Makefile do wykonywania wszystkich konwersji za mnie, więc po uruchomieniu R i knitr automatycznie uruchomi skrypt Perla (choć można to zrobić za pomocą R lub innych narzędzi), który znajdzie miejsce wstawiania wykresów i doda odstęp na końcu linii.

 6
Author: Greg Snow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-16 17:57:08

Jeśli to, czego szukasz, to po prostu ręcznie kontrolować, gdzie umieścić swoje figury, za pomocą tej strony: http://www.rci.rutgers.edu/ ~ ag978/litdata/figs / , odkryłem, że jeśli dodasz jeden ukośnik " \ " gdzieś po poleceniach wykresu, wykresy nie będą pływające, ale zamiast tego zostaną wydrukowane w ich bieżącej lokalizacji.

Jeśli chcesz, aby wyświetlały się tylko niektóre wykresy, możesz zmodyfikować tę opcję dla każdego z nich.

W twoim przykładzie:

# My report

```{r setup, include=FALSE}
# set global chunk options
knitr::opts_chunk$set(cache=FALSE)

library(ggplot2)
```

Some text Some text Some text Some text Some text Some text Some text Some       text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 

```{r, echo=FALSE, fig.height=3}
ggplot(mtcars, aes(disp, hp)) + geom_point()
```
\

Some text Some text Some text Some text Some text Some text Some text Some       text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some text Some textSome text Some text Some text 

(etc)

 3
Author: Tamara vdD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-31 22:07:10

Za pomocą haka dzianinowego

Jakoś natknąłem się na to pytanie i chcę dodać inne podejście. Tutaj korzystam z niesamowitej elastyczności dostarczanej przez knitr hooks. Po prostu zmieniam hak wykresu, aby użyć funkcji knitr hook_plot_tex(). Następnie mogę po prostu użyć opcji chunk fig.pos, do której jesteśmy przyzwyczajeni w dokumentach Rnw w celu pozycjonowania środowisk figure (fig.cap musi być ustawione w celu wywołania środowiska figure).

To działa na przykładach podanych przez OP. myślę, że również pracować w (jakoś) bardziej skomplikowanych przykładach. Dlaczego można to zrobić tak łatwo i nie jest to domyślne dla dokumentów Rmd, nie jestem pewien. Może Yihui to wyjaśni.

Oto kod:

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

```{r}
knitr::knit_hooks$set(plot = function(x, options)  {
  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()
```

Bez fig.pos='h', fabuła Zwykle przeskakuje na drugą stronę.

 1
Author: Martin Schmelzer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 13:10:11

To jest to, czego szukasz:

```{r setup, include=FALSE}
# set global chunk options
opts_chunk$set(cache=FALSE)
library(ggplot2)
```

# My report

Some text some text some text some text some text some text some text some text some text

Some text some text some text some text some text some text some text some text some text

```{r myplot, echo=FALSE}

ggplot(mtcars, aes(mpg, drat)) + geom_point()

```

Some text some text some text some text some text some text some text some text some text
 0
Author: Tyler Rinker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 00:15:57

Rozwiązanie nie jest zbyt proste, może ktoś inny będzie w stanie je usprawnić.

Podstawowe kroki. (Windows 7)

  1. Możesz dodać argument fig.pos="H" do opcji knitr, globalnie lub dla każdego fragmentu. Zwróć uwagę na wielką literę H. poleca to latexowi umieszczenie znaków dokładnie tam, gdzie są wywoływane w pliku Rmd.

  2. Ale wymaga to, aby pakiet był używany przez latex, można to określić w szablon, który pandoc używa do konstruowania plików pdf. Robisz to dodając wiersz \usepackage{float}

  3. Ale najpierw musisz znaleźć bieżący plik szablonu do modyfikacji. Nie mogłem znaleźć tego nigdzie, ale możesz dostać pandoc wydrukować zawartość szablonu do konsoli za pomocą tego polecenia: pandoc -D latex

  4. Wytnij i wklej ten kod szablonu do pustego pliku tekstowego.

  5. Dodaj wiersz: \usepackage{float}

  6. Zapisz pod nazwą pliku "default.latex" w katalogu takie jak C:\Users\YOURNAME\pandoc\templates

  7. Dodaj opcję --data-dir=C:/Users/YOURNAME/pandoc/templates" do połączenia z pandoc lub Pandoc.convert("my file.md", format="pdf", options=c("--data-dir=C:/Users/YOURNAME/pandoc/templates")) Jeśli używasz Pandera w R.

Mam nadzieję, że to ci pomoże.
 0
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-06 19:01:37