通过 out.width 在 Rmd 中缩放绘图
Scaling plots in Rmd via out.width
我正在生成一个 Rmd 文档,其中还包含一些图。它应该导出为 otd 和 pdf。一些数字应该足够小,以便在生成的 odt 中将其中两个并排放置。
我通过
编织文档
Rscript -e "require(knitr); require(markdown); knit('Test_Markdown.Rmd', 'Test_Markdown.md')"
在 Rmd 中有一个看起来像这样的情节:
```{r plottestnormal, fig.path = ".", fig.width = 6, fig.height = 6, dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```
我希望情节是一半大小 -- 但按比例缩放!
这得到了正确的大小,但不是缩放:
```{r plottestsmall, fig.path = ".", fig.width = 3, fig.height = 3, dpi = 600, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```
我从 the opiton description 中了解到,以下内容应该符合我的意思,但它不会 'work'。
```{r plottestscaled, fig.path = ".", fig.width = 6, fig.height = 6, out.width = 3, out.height = 3, dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```
发生的事情是,这会在生成的 *md 文件中产生一个 html img 标签:
<img src=".plottestscaled-1.png" title="plot of chunk plottestscaled" alt="plot of chunk plottestscaled" width="3" height="3" />
使用
编译时,pdf 和 odt 中均未显示
pandoc -f markdown "Test_Markdown.md" -o "Test_Markdown.odt"
pandoc -t latex "Test_Markdown.md" -o "Test_Markdown.pdf"
而且我已经看到 this issue 这对我没有进一步的帮助。
我错过了什么?
编辑:
感谢@Yihui,这现在适用于 LaTeX-> pdf 和(大概 -- 未经测试)html。
我说得对吗,*.odt
或 *.docx
导出不支持 out.width
和 out.height
?
如果是,它们对我不起作用的原因可能是什么?
如果不是,我怎样才能在 *.odt
中实现相同的效果(缩放图)?
(我想导出到 pdf
和 odt
,因此理想情况下任何解决方案都可以(至少)同时涵盖这两个。)
这是一个完整的文档,显示了我在通过 rmarkdown::render("Test_Markdown.Rmd", "all")
处理时遇到的问题。
---
title: Scale plot in Rmd
output:
pdf_document:
latex_engine: xelatex
odt_document:
keep_md: true
---
```{r plottestscaled, fig.path = "./", fig.width = 6, fig.height = 6, out.width = "3in", out.height = "3in", dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```
编辑 2:
我的 'best' 解决方案目前是禁用 odt
输出中的缩放并在办公室手动重新缩放绘图。不是很可重现,虽然....
```{r plottestscaled, fig.path = "./", fig.width = 6, fig.height = 6, out.width=switch(opts_knit$get("rmarkdown.pandoc.to"), latex = "3in", NULL), out.height=switch(opts_knit$get("rmarkdown.pandoc.to"), latex = "3in", NULL), dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
Pandoc 的 Markdown 直到最近的版本才支持指定图像的大小,因此当您指定绘图的宽度时,knitr 必须退回到 HTML,并且 HTML 代码不适用于 LaTeX 或 ODT 输出(仅支持原生 Markdown 代码,但 LaTeX 输出除外,其中也支持原始 LaTeX 代码)。
简短的回答是自己使用 rmarkdown 包而不是 运行 Pandoc。 knitr 会足够聪明,在生成具有宽度属性的图形时切换到 LaTeX 代码。或者更好的是,只需单击 RStudio IDE.
中的 Knit
按钮
如果你愿意,你可以尝试弄清楚幕后的所有技术细节(从 knitr::hook_plot_md
开始),但如果你不熟悉 knitr 和 rmarkdown 在内部工作。
我正在生成一个 Rmd 文档,其中还包含一些图。它应该导出为 otd 和 pdf。一些数字应该足够小,以便在生成的 odt 中将其中两个并排放置。
我通过
编织文档Rscript -e "require(knitr); require(markdown); knit('Test_Markdown.Rmd', 'Test_Markdown.md')"
在 Rmd 中有一个看起来像这样的情节:
```{r plottestnormal, fig.path = ".", fig.width = 6, fig.height = 6, dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```
我希望情节是一半大小 -- 但按比例缩放!
这得到了正确的大小,但不是缩放:
```{r plottestsmall, fig.path = ".", fig.width = 3, fig.height = 3, dpi = 600, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```
我从 the opiton description 中了解到,以下内容应该符合我的意思,但它不会 'work'。
```{r plottestscaled, fig.path = ".", fig.width = 6, fig.height = 6, out.width = 3, out.height = 3, dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```
发生的事情是,这会在生成的 *md 文件中产生一个 html img 标签:
<img src=".plottestscaled-1.png" title="plot of chunk plottestscaled" alt="plot of chunk plottestscaled" width="3" height="3" />
使用
编译时,pdf 和 odt 中均未显示pandoc -f markdown "Test_Markdown.md" -o "Test_Markdown.odt"
pandoc -t latex "Test_Markdown.md" -o "Test_Markdown.pdf"
而且我已经看到 this issue 这对我没有进一步的帮助。
我错过了什么?
编辑:
感谢@Yihui,这现在适用于 LaTeX-> pdf 和(大概 -- 未经测试)html。
我说得对吗,*.odt
或 *.docx
导出不支持 out.width
和 out.height
?
如果是,它们对我不起作用的原因可能是什么?
如果不是,我怎样才能在 *.odt
中实现相同的效果(缩放图)?
(我想导出到 pdf
和 odt
,因此理想情况下任何解决方案都可以(至少)同时涵盖这两个。)
这是一个完整的文档,显示了我在通过 rmarkdown::render("Test_Markdown.Rmd", "all")
处理时遇到的问题。
---
title: Scale plot in Rmd
output:
pdf_document:
latex_engine: xelatex
odt_document:
keep_md: true
---
```{r plottestscaled, fig.path = "./", fig.width = 6, fig.height = 6, out.width = "3in", out.height = "3in", dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
```
编辑 2:
我的 'best' 解决方案目前是禁用 odt
输出中的缩放并在办公室手动重新缩放绘图。不是很可重现,虽然....
```{r plottestscaled, fig.path = "./", fig.width = 6, fig.height = 6, out.width=switch(opts_knit$get("rmarkdown.pandoc.to"), latex = "3in", NULL), out.height=switch(opts_knit$get("rmarkdown.pandoc.to"), latex = "3in", NULL), dpi = 300, dev = "png", dev.args = list(type = "cairo")}
plot(1:10, 1:10)
Pandoc 的 Markdown 直到最近的版本才支持指定图像的大小,因此当您指定绘图的宽度时,knitr 必须退回到 HTML,并且 HTML 代码不适用于 LaTeX 或 ODT 输出(仅支持原生 Markdown 代码,但 LaTeX 输出除外,其中也支持原始 LaTeX 代码)。
简短的回答是自己使用 rmarkdown 包而不是 运行 Pandoc。 knitr 会足够聪明,在生成具有宽度属性的图形时切换到 LaTeX 代码。或者更好的是,只需单击 RStudio IDE.
中的Knit
按钮
如果你愿意,你可以尝试弄清楚幕后的所有技术细节(从 knitr::hook_plot_md
开始),但如果你不熟悉 knitr 和 rmarkdown 在内部工作。