在RMarkdown/knitr中绘制边距

7

在RStudio中,我的图表看起来非常完美,但是当我通过“knit HTML”按钮生成HTML时,我的边缘被裁剪了。

我正在使用基本图形包创建一个简单的条形图。

我有一个大的下边缘来容纳沿x轴的垂直标签,以及一个宽的左边缘来保持y轴标题在一些大数字的左侧,例如:

```{r set-graph-options}
par(mar = c(12, 6, 4, 2) + 0.1, mgp = c(4, 1, 0), las = 2)
```

默认情况下,x轴和y轴的标签和标题都会受到影响。使用默认的mgp设置,我的ylab设置看起来很好,但是如果使用更大的值,它似乎被推出了“画布”(或者在R中术语是什么)。我还注意到,knitr/rmarkdown不会识别全局设置的par()选项。例如,在设置以上内容后,barplot(injury_top12, ylab = "Injuries")将不会识别marmgplas选项,但是如果我将这些选项复制到barplot()调用本身中,las = 2mgp = c(4, 1, 0)开始工作,但mar仍然无法识别。我尝试使用命令R -e "rmarkdown::render('Readme.Rmd')"从命令行生成HTML,但存在相同的问题。我使用的是R Studio 0.98.1103,knitr为1.11,rmarkdown为0.8,操作系统为ubuntu linux。
```{r echo = F, example-set-par}
library(knitr)
opts_knit$set(cache = FALSE, verbose = TRUE, global.par = TRUE)
par(mar = c(12, 6, 4, 2) + 0.1, mgp = c(4, 1, 0), las = 2)
d <- c("This is a longer than usual label" = 355,
       "Another quite long label" = 144,
       "A third longish label for a barplot" = 222)
```

Plot one depends on values set by `par()`:

```{r echo = F, example-plot-using-par}
barplot(d, ylab = "Arbitrary numbers")
```

Plot two explicitly sets options:

```{r echo = F, example-plot-with-explicit-options}
barplot(d, ylab = "Arbitrary numbers", mar = c(12, 6, 4, 2) + 0.1, mgp = c(4, 1, 0), las = 2)
```

当我编织这个Rmd文档时,第一个图表没有使用在par()中设置的lasmgp选项。第二个图表确实使用了这些选项,但是x轴标签被截断,并且y轴标题几乎完全被推出了框架之外(y的尾部略微可见)。

example image


1
通常情况下,当你编织一个文档时,R代码会在新的会话中被评估,因此如果你设置了par选项,你需要在文档内部进行设置。也许你可以给出一个可重现的例子? - Gregor Thomas
谢谢,@Gregor。当然我是在文档中设置par()。我添加了一个Example.Rmd和输出的截图。 - Kenneth D.
感谢@Yihui,我编辑了我的帖子以反映Example.Rmd的当前状态,在添加“opts_knit$set(global.par = TRUE)”后没有任何变化。我尝试了几次并验证了没有缓存参与,只是为了让自己相信这不是我愚蠢的问题。 - Kenneth D.
@Yihui,它们在不同的代码块中,还是我理解有误?第一个代码块设置了opts_knit$set(global.par = TRUE)并使用par()设置了一些选项,对barplot()的调用位于另外两个代码块中。 - Kenneth D.
@Yuhui,啊哈!当我把它们分开时,它确实可以工作。非常感谢!X轴标签中最长的部分仍然有点被切掉了,但我可以接受。如果你想创建一个答案,我会批准它。 - Kenneth D.
显示剩余3条评论
1个回答

6

如果你想直接查看评论和推文中隐藏的答案,那么你的.Rmd文件应该如下所示:

---
title: exemple
header of your Rmd
---

```{r}
library(knitr)
opts_knit$set(global.par = TRUE)
```
The important think in the previous chunk is  to put global.par=TRUE 

Plot one depends on values set by `par()`:

```{r}
par(mar=c(5,5,0,0)) #it's important to have that in a separate chunk
``` 
Now we just plot a point with the good margin set by the global `par()`

```{r}
plot(1,1,main="a plot with the margin as set globally")
```

如果您不想在输出中包含用于设置全局边距的代码,请添加以下内容:
```{r,include=FALSE}
par(mar=c(5,5,0,0))
``` 

在您不想包含的数据块中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接