我有几个列表,每个列表都包含不同数量的数据集(下面列表的最小示例):
library(tidyverse)
mylist = list()
mylist[[1]] = mtcars
mylist[[2]] = mtcars |> filter(carb %in% 1:2)
mylist[[3]] = mtcars |> filter(carb == 1)
对于列表中的每个数据集,我想制作一个单独的图形来显示分面数据,并将 RMarkdown 或 Quarto 文档中的所有图形呈现为 html。为此,我使用循环来生成所有图形,并且为了使所有图形中的所有面板具有相同的大小,我首先尝试使用适当的数字在相应的块中配置
fig.width
和 fig.height
矢量,以便每个图形的总大小取决于它包含的面板数量。但是,我未能使所有图形的面板尺寸相同:
{r, fig.width= c(2,4,6), fig.height= c(3,3,6)}
library(ggplot2)
for(i in 1:length(mylist)){
p1 = ggplot(mylist[[i]], aes(group= gear, y = wt)) +
geom_boxplot() +
facet_wrap(~carb)
print(p1)
cat("\n \n")
}
然后我尝试了
set_panel_size
包中的 egg
。虽然看起来很有效,但数字之间相差太远。我还收到一些关于我不希望在 html 文档中显示的 grobs 的文本:
```{r}
library(egg)
for(i in 1: length(mylist)){
p1 = ggplot(mylist[[i]], aes(group= gear, y = wt)) +
geom_boxplot() +
facet_wrap(~carb, ncol = 3)
print( grid.arrange(grobs = list(set_panel_size(p = p1,
g = ggplot2::ggplotGrob(p1),
width = unit(2, "in"),
height = unit(5,"cm")))))
}
```
我接下来尝试了
force_panelsizes
包中的 ggh4x
,并且在图形之间的距离方面遇到了类似的问题:
library(ggh4x)
for(i in 1:length(mylist)){
p1 = ggplot(mylist[[i]], aes(group= gear, y = wt)) +
geom_boxplot() +
facet_wrap(~carb) +
force_panelsizes(rows = unit(5, "cm"), cols = unit(2, "in"))
print(p1)
}
我还尝试了同一个包中的
facet_wrap2
,但结果与第一次尝试在块中使用大小选项类似。
那么,如何才能使具有不同数量面板的图形中每个面板的尺寸相同,而不使图形彼此相距如此之远?
提前致谢!
一种选择是使用子文档来渲染绘图,我坚持使用
ggh4x
方法来修复面板尺寸。这样做可以将每个图放在一个单独的块中,并具有单独的图高度。
---
title: gg-loop
output: html_document
date: "2024-01-17"
---
```{r include=FALSE}
library(tidyverse)
library(ggh4x)
mylist <- list()
mylist[[1]] <- mtcars
mylist[[2]] <- mtcars |> filter(carb %in% 1:2)
mylist[[3]] <- mtcars |> filter(carb == 1)
```
```{r results='asis', echo = FALSE}
res <- lapply(seq_along(mylist), \(i) {
knitr::knit_child("gg-child.Rmd", envir = environment(), quiet = TRUE)
})
cat(unlist(res), sep = "\n")
```
```{r echo=FALSE, fig.height= 6.5 * (if (i == 1) 2 else 1) / 2.54}
ggplot(mylist[[i]], aes(group = gear, y = wt)) +
geom_boxplot() +
facet_wrap(~carb) +
force_panelsizes(rows = unit(5, "cm"), cols = unit(2, "in"))
```