10

是否可以让绘图生成代码从.Rmd文档中以不同大小输出同一图形的两个版本?通过块选项(我没有看到任何直接在这里工作的东西),或者通过自定义knitr钩子?优选地,这将通过该png设备来完成。

我的动机:我希望能够输出一种尺寸的图形,它可以内嵌在编译的 HTML 文档中,以及用户可以在单击后显示的另一个图形(想想fancybox)。我想我将能够处理完成这项工作所需的脚本;但是,首先我需要说服 R /knitr输出该图的两个版本。

虽然我确信有解决方法,但最好有某种方法让它在幕后“正常工作”,例如通过knitr钩子。这样,我们不必对块中的 R 代码做任何特别的事情,我们只需修改我们解析/评估该块的方式。

或者,可以使用可以很好地缩放的 SVG 图形,但是我们失去了对绘图标签的良好尺寸的良好推断,并且矢量图形不适用于具有许多点的绘图。

4

2 回答 2

16

我认为没有解决方案,并且正要对@baptiste 说不,但我很快就想到了一个黑客。下面是一个 R Markdown 示例:

```{r test, dev='png', fig.ext=c('png', 'large.png'), fig.height=c(4, 10), fig.width=c(4, 10)}
library(ggplot2)
qplot(speed, dist, data=cars)
```

See the [original plot](figure/test.png) and
a [larger version](figure/test.large.png).

我认为矢量化版本dev不起作用的原因是:对于dev=c('png', 'png'),第二个 png 文件将覆盖第一个,因为图形文件名相同。然后我意识到fig.ext也是矢量化的,并且像文件扩展名这样的文件扩展名large.png并没有真正破坏文件扩展名png;这就是为什么它是一个黑客。

无论如何,通过、、 和的矢量化版本dev,您可以将同一个图保存到多个版本。如果您对图形文件扩展名使用确定性模式,我认为您还可以编写一些 JavaScript 代码来自动将精美的框附加到图像上。fig.extfig.heightfig.width

于 2013-09-27T02:57:01.170 回答
0

如果您需要大小数字,您可以这样做:

<<plotSmall, fig.height=6, fig.width=8, out.width='.1\\textwidth'>>=
plot(...)
@
<<plotBig, fig.height=6, fig.width=8, out.width='.99\\textwidth'>>=
plot(...)
@

或者更简单地说:

<<plotBoth, fig.height=6, fig.width=8, out.width=c('.1\\textwidth', '.9\\textwidth')>>=
plot(...)
plot(...)
@

(当然你知道这一点,但 .Rmd 用于 LaTeX,而 .Rhtml 用于 html - .Rhtml 语法略有不同。)

于 2013-09-27T00:59:35.180 回答