【问题标题】:custom R Markdown plot size within loop循环内的自定义 R Markdown 绘图大小
【发布时间】:2016-09-29 20:38:31
【问题描述】:

我正在 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) ) 
})
```

【问题讨论】:

    标签: r plot rstudio knitr r-markdown


    【解决方案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)))
    
    ```
    

    【讨论】:

    • 谢谢,我明天试试。也许我应该说我计划在每个情节之间交错一些文本和表格。您认为这与您的解决方案兼容吗?
    • 是的...只需将 grid.arrange 与 height 参数一起使用,例如grid.arrange(p[[1]], heights = height[1])。你可以做多个绘图,比如 grid.arrange(p[1:2], heights = height[1:2])。
    • 就比例身材高度而言,这个解决方案是完美的。从报告到报告,绘图的数量不会保持不变,所以我将图形高度与(fig.height=length(unique(as.character(mtcars$carb))) * 2 ) 成比例。我认为我不理解您对我关于交错文本的观点的回应......如果我将print(one.possibility) 添加到循环中,所有打印语句都会在顶部聚集在一起,但这也发生在我现有的代码中。我想我需要发布另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2016-04-04
    相关资源
    最近更新 更多