我还想将一个R markdown转换成html和.docx/.odt格式,并且要求图片的尺寸和分辨率都很好。目前为止,我发现最好的方法是在.md文档中明确定义图形的分辨率和大小(dpi、fig.width和fig.height选项)。如果这样做,你就可以得到适合出版的好图形,并且odt/docx文件也可以使用。但是,如果你使用比默认的72dpi更高的dpi,那么在html文件中图形会看起来太大。以下是我处理这个问题的三种方法(注意,我使用带有spin()语法的R脚本):
1)在knitr选项中使用out.extra ='WIDTH="75%"'。这将强制所有html图形占用窗口宽度的75%。这是一个快速解决方案,但如果你有不同大小的绘图,则不是最优解。(注意:我更喜欢使用厘米而不是英寸,因此每个地方都有/2.54)
library(knitr)
opts_chunk$set(echo = FALSE, dev = c("png", "pdf"), dpi = 400,
fig.width = 8/2.54, fig.height = 8/2.54,
out.extra ='WIDTH="75%"'
)
data(iris)
summary(iris)
boxplot(iris[,1:4])
par(mar = c(2,2,2,2))
pairs(iris[,-5])
2) 使用 out.width 和 out.height 在 html 文件中指定图形的像素大小。我使用一个常量“sc”来缩小绘图大小以适应 html 输出。这是更准确的方法,但问题在于每个图形都必须定义 fig.witdth/height 和 out.width/height,这真的很无聊!理想情况下,您应该能够在全局选项中指定例如 out.width = 150*fig.width(其中 fig.width 从块到块变化)。也许有类似的东西是可能的,但我不知道如何做。
library(knitr)
sc <- 150
opts_chunk$set(echo = FALSE, dev = c("png", "pdf"), dpi = 400,
fig.width = 8/2.54, fig.height = 8/2.54,
out.width = sc*8/2.54, out.height = sc*8/2.54
)
data(iris)
summary(iris)
boxplot(iris[,1:4])
par(mar = c(2,2,2,2))
pairs(iris[,-5])
请注意,对于这两个解决方案,我认为您不能直接使用pandoc将您的md文件转换为odt(图形不包括在内)。 我将md转换为html,然后将html转换为odt(没有尝试过docx)。
类似这样(如果以前的R脚本名为“figsize1.R”):
library(knitr)
setwd("/home/gilles/")
spin("figsize1.R")
system("pandoc figsize1.md -o figsize1.html")
system("pandoc figsize1.html -o figsize1.odt")
3) 只需编译两次您的文档,一次使用低dpi值(约96)用于html输出,一次使用高分辨率(约300)用于odt / docx输出。这是我现在偏爱的方式。主要缺点是必须进行两次编译,但对我来说这不是真正的问题,因为我通常只需要在工作的最后阶段才提供给最终用户odt文件。我经常使用Rstudio中的html笔记本按钮定期编译html。
library(knitr)
opts_chunk$set(echo = FALSE, dev = c("png", "pdf"),
fig.width = 8/2.54, fig.height = 8/2.54
)
data(iris)
summary(iris)
boxplot(iris[,1:4])
par(mar = c(2,2,2,2))
pairs(iris[,-5])
然后使用以下脚本编译这两个输出(注意,您可以直接将md文件转换为html):
library(knitr)
setwd("/home/gilles")
opts_chunk$set(dpi=96)
spin("figsize3.R", knit=FALSE)
knit2html("figsize3.Rmd")
opts_chunk$set(dpi=400)
spin("figsize3.R")
system("pandoc figsize3.md -o figsize3.odt")
knitr
中渲染较小的图像。 - daroczigknitr
内部的大小,因为这些大小在输出的HTML文件中很好。 - Stéphane Laurent