R Markdown:当排版为 PDF 时,循环内的绘图超出边距
R Markdown: plots within a loop going out of margin when typesetting to PDF
将 R Markdown 文档排版为 PDF 时,如果函数绘制多个图,这些图通常会并排显示,只有第一个图完全位于页面的边缘。
最小的 R Markdown 示例:
---
title: "Example re plotting problem"
author: "Daniel E. Weeks"
date: "May 3, 2016"
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Multiple plots within a loop
```{r}
plots <- function() {
plot(rnorm(100))
hist(rnorm(100))
}
for (i in 1:3) {
plots()
}
```
这是生成的 PDF 第 2 页的屏幕截图
这说明了问题。我在网上搜索过,但还没有找到解决这个问题的方法。
谢谢。
user2554330提出的plot hook方案简单,效果不错。所以这段代码在生成的 PDF 的边距内绘制了所有图:
---
title: "Example re plotting problem"
author: "Daniel E. Weeks"
date: "May 3, 2016"
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Multiple plots within a loop
```{r}
plots <- function() {
plot(rnorm(100))
hist(rnorm(100))
}
```
## Call plotting function
```{r}
my_plot_hook <- function(x, options)
paste("\n", knitr::hook_plot_tex(x, options), "\n")
knitr::knit_hooks$set(plot = my_plot_hook)
for (i in 1:3) {
plots()
}
```
问题是生成的 .tex 文件在 \includegraphics{} 调用之间没有空格。 LaTeX 会给出关于水平盒过满的警告,因为图形不够大,不能单独放在一行上,而当它在每行上放两个时又太大了。
你可以通过添加
告诉 LaTeX(真正的 TeX)输出错误的行而不用在每行上放两个数字
\pretolerance=10000
在代码块之前的文本中。您可能希望将其设置回默认值
\pretolerance=100
在代码块之后,否则 LaTeX 之后不会尝试断字,文本看起来真的很难看。
解决此问题的另一种方法是强制每个数字都在其自己的段落中。您可以通过添加此代码来完成此操作
my_plot_hook <- function(x, options)
paste("\n", knitr::hook_plot_tex(x, options), "\n")
knitr::knit_hooks$set(plot = my_plot_hook)
在你做你的绘图之前进入一个代码块。这会放置一个空行
每个数字前后。
将 R Markdown 文档排版为 PDF 时,如果函数绘制多个图,这些图通常会并排显示,只有第一个图完全位于页面的边缘。
最小的 R Markdown 示例:
---
title: "Example re plotting problem"
author: "Daniel E. Weeks"
date: "May 3, 2016"
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Multiple plots within a loop
```{r}
plots <- function() {
plot(rnorm(100))
hist(rnorm(100))
}
for (i in 1:3) {
plots()
}
```
这是生成的 PDF 第 2 页的屏幕截图
这说明了问题。我在网上搜索过,但还没有找到解决这个问题的方法。
谢谢。
user2554330提出的plot hook方案简单,效果不错。所以这段代码在生成的 PDF 的边距内绘制了所有图:
---
title: "Example re plotting problem"
author: "Daniel E. Weeks"
date: "May 3, 2016"
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Multiple plots within a loop
```{r}
plots <- function() {
plot(rnorm(100))
hist(rnorm(100))
}
```
## Call plotting function
```{r}
my_plot_hook <- function(x, options)
paste("\n", knitr::hook_plot_tex(x, options), "\n")
knitr::knit_hooks$set(plot = my_plot_hook)
for (i in 1:3) {
plots()
}
```
问题是生成的 .tex 文件在 \includegraphics{} 调用之间没有空格。 LaTeX 会给出关于水平盒过满的警告,因为图形不够大,不能单独放在一行上,而当它在每行上放两个时又太大了。
你可以通过添加
告诉 LaTeX(真正的 TeX)输出错误的行而不用在每行上放两个数字\pretolerance=10000
在代码块之前的文本中。您可能希望将其设置回默认值
\pretolerance=100
在代码块之后,否则 LaTeX 之后不会尝试断字,文本看起来真的很难看。
解决此问题的另一种方法是强制每个数字都在其自己的段落中。您可以通过添加此代码来完成此操作
my_plot_hook <- function(x, options)
paste("\n", knitr::hook_plot_tex(x, options), "\n")
knitr::knit_hooks$set(plot = my_plot_hook)
在你做你的绘图之前进入一个代码块。这会放置一个空行 每个数字前后。