循环内的自定义 R Markdown 图大小

custom R Markdown plot size within loop

我正在 R Markdown/knittr 文档中创建带状图。我希望绘图的垂直大小与条形图中的行数成正比。

编辑:最好的解决方案还允许交错表格和图表。参见 Interleaving tables and plots in R Markdown, within loop

在此示例中,配备“3 个化油器”的汽车的 MPG 图与配备“2 个化油器”的汽车的图高度相同,即使 2 个化油器的汽车有三种不同的档位配置并且只有一个用于 3 化油器汽车。

```{r cars, echo=FALSE}
library(ggplot2)

carb.possibilities <- sort(unique(as.character(mtcars$carb)))

filtereds <- lapply(carb.possibilities, function(carb.ct) {
  return(mtcars[ mtcars$carb == carb.ct , ])
})

carb.possibilities <- paste(carb.possibilities, ' Carburetors', sep = '')

names(filtereds) <- carb.possibilities

lapply(carb.possibilities, function(one.possibility) {

  current.possibility <- filtereds[[one.possibility]]

    ggplot(current.possibility, aes(factor(gear), mpg)) + 
    coord_flip() + 
    labs(x = "Gears", title = one.possibility) +
    geom_point(position=position_jitter( width = 0.1, height = 0.1) ) 
})
```

这是一个使用grid.arrange

的解决方案
```{r cars, echo=FALSE, fig.height=30}
library(ggplot2); library(gridExtra)

carb.possibilities <- sort(unique(as.character(mtcars$carb)))

filtereds <- lapply(carb.possibilities, function(carb.ct) {
  return(mtcars[ mtcars$carb == carb.ct , ])
})

carb.possibilities <- paste(carb.possibilities, ' Carburetors', sep = '')

names(filtereds) <- carb.possibilities
p <- list()
k <- 1
heights <- c()
for(one.possibility in carb.possibilities){
  current.possibility <- filtereds[[one.possibility]]
    heights[k] <- length(unique(current.possibility$gear))
    p[[k]] <- ggplot(current.possibility, aes(factor(gear), mpg)) + 
    coord_flip() + 
    labs(x = "Gears", title = one.possibility) +
    geom_point(position=position_jitter( width = 0.1, height = 0.1)) 
    k <- k + 1
}

do.call(grid.arrange, c(p, list(ncol = 1, heights= heights)))

```