在knitr中打印动态大小的图表列表

Nan*_*ncy 9 r ggplot2 knitr

我希望能够在knitr中打印出非预定的情节列表.我能够做到这一点,但也有留下来化解一些皱纹.即:

1)如何在每个绘图之前的每个页面上抑制列表索引(如[[2]])?使用echo = FALSE不会做任何事情.

2)是否可以在渲染时为每个绘图设置大小?我已经尝试在块之外设置一个大小变量,但这只允许我使用一个值而不是每个绘图的不同值.

我问这是一个问题,因为他们似乎在讲同一课,即制作一份情节清单.

一些示例代码:

\documentclass{article}
\usepackage[margin=.5in, landscape]{geometry}
\begin{document}

<<diamond_plots, echo = FALSE, results = 'hide'>>==
library(ggplot2)

diamond_plot = function(data, cut_type){
  ggplot(data, aes(color, fill=cut)) + 
    geom_bar() +
    ggtitle(paste("Cut:", cut_type, sep = ""))
}

cuts = unique(diamonds$cut)
plots = list()
for(i in 1:length(cuts)){
    data = subset(diamonds, cut == cuts[i])
    plots[[i]] = diamond_plot(data, cuts[i])
}
height = 3
@

<<print_plots, results='asis', echo=FALSE,  fig.width=10, fig.height=height>>=
plots
@
\end{document}
Run Code Online (Sandbox Code Playgroud)

这些图的PDF看起来像这样:

在此输入图像描述

CL.*_*CL. 11

1)如何在每个绘图之前的每个页面上抑制列表索引(如[[2]])?使用echo = FALSE不会做任何事情.

单独(曲线列表中的每个元素lapply),并隐藏输出lapply(invisible):

invisible(lapply(plots, print))
Run Code Online (Sandbox Code Playgroud)

2)是否可以在渲染时为每个绘图设置大小?我已经尝试在块之外设置一个大小变量,但这只是让我使用一个值而不是每个绘图的不同值.

是.一般情况下,当你通过矢量推测相关的块选择,i元素用于i情节.这适用于那些"身材特定"例如像选择fig.cap,fig.scap,out.widthout.height.

但是,其他图形选项是"特定于设备".要理解这一点,请务必查看该选项 dev:

dev:将被用作图形设备的功能名称,记录重复[...]的选项dev,fig.ext,fig.width,fig.heightdpi可以是向量(较短的将被回收),例如<<foo, dev=c('pdf', 'png')>>=产生用于相同情节两个文件:foo.pdffoo.png

而传递一个矢量到"具体数字"选项out.height具有的后果i元件被用于i 情节,传递一个矢量到"设备特定的"选项具有的后果i正在使用的元素i 设备.

因此,生成动态大小的绘图需要对块进行一些黑客攻击,因为一个块无法生成具有不同fig.height设置的绘图.以下解决方案基于knitr示例`075-knit-expand.Rnwr-bloggers.com上的这篇文章(在SO上解释了这个答案).

解决方案的想法是使用块模板并使用适当的表达式扩展模板值以生成块,然后生成具有正确fig.height设置的块.传递扩展模板knit以评估块:

\documentclass{article}
\begin{document}

<<diamond_plots, echo = FALSE, results = "asis">>==
library(ggplot2)
library(knitr)

diamond_plot = function(data, cut_type){
  ggplot(data, aes(color, fill=cut)) +
    geom_bar() +
    ggtitle(paste("Cut:", cut_type, sep = ""))
}

cuts = unique(diamonds$cut)

template <- "<<plot-cut-{{i}}, fig.height = {{height}}, echo = FALSE>>=
    data = subset(diamonds, cut == cuts[i])
    plot(diamond_plot(data, cuts[i]))
@"

for (i in seq_along(cuts)) {
  cat(knit(text = knit_expand(text = template, i = i, height = 2 * i), quiet = TRUE))
}

@

\end{document}
Run Code Online (Sandbox Code Playgroud)

扩展模板使用该模板用相应的值knit_expand替换表达式{{}}.

对于knit通话,使用非常重要quite = TRUE.否则,knit将使用日志信息污染主文档.

使用cat很重要,以避免隐含print的否则会破坏输出.出于同样的原因,"外部"块(diamond_plots)使用results = "asis".