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
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:
-
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 -
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.
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)
```
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
```
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.
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)
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ę.
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
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)
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 plikuRmd
.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}
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
Wytnij i wklej ten kod szablonu do pustego pliku tekstowego.
Dodaj wiersz:
\usepackage{float}
Zapisz pod nazwą pliku
"default.latex"
w katalogu takie jakC:\Users\YOURNAME\pandoc\templates
-
Dodaj opcję
--data-dir=C:/Users/YOURNAME/pandoc/templates"
do połączenia z pandoc lubPandoc.convert("my file.md", format="pdf", options=c("--data-dir=C:/Users/YOURNAME/pandoc/templates"))
Jeśli używasz Pandera w R.
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