在knitr中从同一块/语句中生成两个图

时间:2013-09-26 21:21:04

标签: r knitr

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

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

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

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

2 个答案:

答案 0 :(得分:14)

我以为没有解决方案,并且即将对@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文件将覆盖第一个png文件,因为图形文件名是相同的。然后我意识到fig.ext也是矢量化的,像large.png这样的文件扩展名并没有真正破坏文件扩展名png;这就是为什么它是一个黑客。

无论如何,通过devfig.extfig.heightfig.width的矢量化版本,您可以将同一图表保存到多个版本。如果你对图形文件扩展名使用确定性模式,我想你也可以编写一些JavaScript代码来自动将奇特的盒子附加到图像上。

答案 1 :(得分: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,而.Rhd适用于html - .Rhtml语法略有不同。)