为不同的多面 ggplot 图形设置相同的面板大小

问题描述 投票:0回答:1

我有几个列表,每个列表都包含不同数量的数据集(下面列表的最小示例):

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
,但结果与第一次尝试在块中使用大小选项类似。

那么,如何才能使具有不同数量面板的图形中每个面板的尺寸相同,而不使图形彼此相距如此之远?

提前致谢!

ggplot2 size facet egg ggh4x
1个回答
0
投票

一种选择是使用子文档来渲染绘图,我坚持使用

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")
```

gg-child.Rmd

```{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"))
```

© www.soinside.com 2019 - 2024. All rights reserved.