在"中为#34;绘制不同大小的几张图片。环

时间:2014-12-01 17:08:40

标签: r ggplot2 markdown knitr r-markdown

我是knitr和markdown的新手,这是我提出的第一个问题。也许这个问题有一个我无法找到的简单答案。

我有一个for循环,可以创建3个ggplots。根据数据输入,循环运行300到400次。我想将这3张图片的大小定义为:

第一张照片:宽度= 7,身高= 3

第二张图片:宽度= 7,高度= 3

第3张图片:宽度= 7,身高= 12

到目前为止,我使用以下代码:

```{r calc, echo=FALSE, warning=FALSE, message=FALSE, results='asis', fig.show='asis',fig.height=3}
for(x.PS in 1:length(trace.input)) 
{
# some data transformation by self-written functions

# create and save plot for the normalised version
ggp.PS.norm <- ggplot(print.PS.norm, aes(x = Time, y = Voltage, col = Pulse))
fig.PS.norm <- ggp.PS.norm + geom_line()

# create and save plot for the modified version
ggp.PS.smooth <- ggplot(print.PS.smooth, aes(x = Time, y = Voltage, col = Pulse))
fig.PS.smooth <- ggp.PS.smooth + geom_line()

# create and save plot for the modified version as facet grid
fig.PS.smooth.single <- ggp.PS.smooth + geom_line() + facet_grid(FigCol ~ FigRow)

print(fig.PS.norm)
print(fig.PS.smooth)
print(fig.PS.smooth.single)
}
```

最后,我希望得到一个包含3 x 300到400张图片的大型PDF文件

我希望即使没有任何硬数据,这段代码也是可以理解的。

最佳paj

3 个答案:

答案 0 :(得分:3)

我不知道这是否是犹太教,但这是一种方法:

adapted from here

我正在使用rmarkdown,因为这是你的问题,但这可以适应乳胶

---
output: 
  html_document:
    css: ~/knitr.css
---

```{r, include=FALSE}
library(knitr)
opts_knit$set(progress = FALSE, verbose = FALSE)
opts_chunk$set(warning=FALSE, message=FALSE, echo=FALSE)

## this function is basically creating chunks within chunks, and then
## I use results='asis' so that the html image code is rendered 
kexpand <- function(ht, cap) {
  cat(knit(text = knit_expand(text = 
     sprintf("```{r %s, fig.height=%s, fig.cap='%s'}\n.pl\n```", cap, ht, cap)
)))}

library(ggplot2)
```


```{r, results='asis', fig.width=7}
for (ii in 1:2) {
  ## do some stuff

  cat('<br />')
  cat(paste0('Page', ii))

  ## all plots should be saved as .p1 and then use kexpand
  .pl <- qplot(mpg, wt, data=mtcars)
  kexpand(3, 'fig1')

  .pl <- qplot(mpg, wt, data=mtcars, colour=cyl)
  kexpand(3, 'fig2')

  .pl <- qplot(mpg, wt, data=mtcars, size=cyl)
  kexpand(7, 'fig3')

  cat('<br /><br />')
}
```

这是我的输出

enter image description here enter image description here enter image description here

答案 1 :(得分:0)

您可以在特定尺寸的视口中打印

library(grid)
print_size = function(p, width=7, height=3) 
    print(p, vp=viewport(width=unit(width,"inch"), height=unit(height, "in")))

for(ii in 1:3)
   print_size(qplot(1,1), height = c(3,3,12)[ii])

答案 2 :(得分:0)

我最终的解决方案:

在某些时候,我在我的父脚本

中调用此块
<<test_child,results='asis'>>=
    knit.out <- NULL
    for(x.PS in 1:length(trace.input)) {
      knit.out <- c(knit.out,
                    knit_child("rawCAP_child_0-2.Rnw",
                           quiet = TRUE,
                           envir = globalenv()
                           )
      )
    }
    cat(paste(knit.out, collapse = '\n'))
@

子脚本执行一些计算并创建像这样的数字

    <<,echo=FALSE>>=
# some functions creating the figures, for example the one below
ggp.PS.smooth <- ggplot(print.PS.smooth, aes(x = Time, y = Voltage, col = Pulse))
fig.PS.smooth <- ggp.PS.smooth + 
  geom_line() +
  scale_x_continuous(
    limits = c(len.1,len.total)
    ) + 
  scale_y_continuous(
    limits = c(-4,4)
    ) +
  labs(
    #title = "Data smoothed by a value of XX",
    x = "Time [sec.]",
    y = "Voltage [mV]")
@

这些块打印出不同高度的图形,也有一个表格。

<<,fig.height=2,fig.width=7,fig.align='center'>>=
print(fig.PS.smooth)
@

<<,echo=FALSE,results='asis',fig.align='center'>>=

xtable(table.PS.CAP.stat[c(2:5,13:16)],
       caption = "Statistics about all Pulses")
@

<<,fig.height=3,fig.width=7,fig.align='center'>>=
print(fig.PS.CAP)
@


<<,fig.height=12,fig.width=7,fig.align='center'>>=
print(fig.PS.smooth.single)
@

我对此解决方案非常满意,因为您可以在没有解决方法的情况下设置几乎所有内容

如需进一步的帮助,请查看Yihui's page,尤其是here,也可以here (this is stackoverflow)。 Yihui似乎也在堆栈溢出。

最佳paj