43

我有一个 .Rmd 文件,我正在尝试通过函数 pandoc 创建一个 .docx 文件。

我想要一个最终分辨率为 504x504 像素的图形(即 7x7 英寸和 72dpi)。不幸的是,默认的 72 dpi 质量太差,我想在不改变最终分辨率的情况下将其增加到 150 dpi(因此它在 .docx 文件中已经具有正确的大小)。如果我保留选项 fig.width 和 fig.height=7 并设置 dpi=150,我会得到我想要的质量,但最终分辨率会增加,并且数字会超出 .docx 边距。我尝试使用参数 out.width 和 out.height,但是当我包含这些参数时,它不会在最终的 .docx 中绘制任何内容。

想法?

.Rmd 代码示例:

My title
-------------------------

*(this report was produced on: `r as.character(Sys.Date())`)*  

That's my plot

```{r echo=FALSE}
    plot(0,0,type="n",xlim=c(0,500), ylim=c(-12,0), las=1)
    color  <-  rainbow(500)
    text(380,-1,"Test",pos=4)
    lseq   <-  seq(-6,-2,length.out=500)
    for(j in seq_along(lseq)) {
        lines(c(400,450), rep(lseq[j], 2), col=color[j])
    }
    polygon(c(400,450,450,400), c(-6,-6,-2,-2), lwd=1.2)
```

转换为 .docx

library(knitr)
library(markdown)
knit("example.Rmd")  # produces the md file
pandoc("example.md", format = "docx") #prodces the .docx file

如果我尝试重新调整图形,它就不起作用。以下:

My title
-------------------------

*(this report was produced on: `r as.character(Sys.Date())`)*  

That's my plot

```{r echo=FALSE, dpi=150, fig.width=7, fig.height=7, out.width=504, out.height=504}
    plot(0,0,type="n",xlim=c(0,500), ylim=c(-12,0), las=1)
    color  <-  rainbow(500)
    text(380,-1,"Test",pos=4)
    lseq   <-  seq(-6,-2,length.out=500)
    for(j in seq_along(lseq)) {
        lines(c(400,450), rep(lseq[j], 2), col=color[j])
    }
    polygon(c(400,450,450,400), c(-6,-6,-2,-2), lwd=1.2)
```
4

3 回答 3

31

很可能自从提出这个问题以来,软件已经改进了。我来这个问题是为了寻找如何提高绘图的分辨率。我发现 OP 的原始方法对我来说是开箱即用的。

因此,在块的参数中设置dpi=300(因为dpi=150没有产生足够明显的差异)产生了更高质量的图像,而无需修改 Word 中图像的物理大小。

```{r, echo=FALSE, dpi=300, fig.width=7, fig.height=7}
plot(0,0,type="n",xlim=c(0,500), ylim=c(-12,0), las=1)
color  <-  rainbow(500)
text(380,-1,"Test",pos=4)
lseq   <-  seq(-6,-2,length.out=500)
for(j in seq_along(lseq)) {
    lines(c(400,450), rep(lseq[j], 2), col=color[j])
}
polygon(c(400,450,450,400), c(-6,-6,-2,-2), lwd=1.2)
```

但是,完全设置out.widthout.height删除图像的生成,并显示警告“Word 输出不支持 fig.align、out.width、out.height、out.extra”。

于 2016-03-14T04:27:05.300 回答
22

保持简单,将所有卡盘设置为 300 dpi 并使它们更宽。

运行这第一件事:

```{r setup, include=FALSE}
knitr::opts_chunk$set(dpi=300,fig.width=7)
```
于 2018-10-10T17:31:13.113 回答
13

这是利用 knitr 内置的输出类型动态自定义功能的好时机。这是用两个输出目标测试的......

````{r img-setup, include=FALSE, cache=FALSE}
out.format <- knitr::opts_knit$get("out.format")
img_template <- switch( out.format,
                     word = list("img-params"=list(fig.width=6,
                                                   fig.height=6,
                                                   dpi=150)),
                     {
                       # default
                       list("img-params"=list( dpi=150,
                                               fig.width=6,
                                               fig.height=6,
                                               out.width="504px",
                                               out.height="504px"))
                     } )

knitr::opts_template$set( img_template )
````

如果您不想对生成的每个图像都使用 img_template ,则可以不调用 set 函数而是添加opts.label="img_template"到要使用它的块的参数中,或者通过为块显式指定参数来覆盖 img_template .

于 2014-12-05T17:20:27.583 回答