将nest / ggplot2生成的图像列表以一致的比例加入两列

总而言之,我想将使用 nest ggplot2 创建的图的列表分为两列。我在方法中遇到的问题是,由于子图中的高度不同(每个组中元素的数量不同,可能不包括x轴标签等),所以不同子图中的元素最终会或多或少地导致尺寸不一致。

下面的示例代码使用主要的tidyverse软件包。我首先使用 mtcars 生成一些虚拟数据;将汽车分成随机的组,每辆车都分配一个组内位置。

dummy <- mtcars %>% 
    mutate(group = sample(1:10,n(),replace = TRUE)) %>%
    filter(group < 6) %>%
    group_by(group) %>%
    mutate(position = 1:n()) 

实际代码会生成子图列表(图)以及有关每个组中元素数量(高度)的信息。

## install patchwork via:
## devtools::install_github("thomasp85/patchwork")

plots <- dummy %>%
    nest(-group,.key = "data") %>%
    mutate(plots = map(data,~ggplot(data = .x,aes(x = position,y = hp)) +
                                      geom_bar(stat="identity") +
                                coord_flip()),heights = purrr::map(data,~ nrow(.)) %>% unlist())
g.plot <- patchwork::wrap_plots(plots$plots,ncol = 1,heights = plots$heights)

功能 wrap_plots 能够使用有关高度的信息(包括图像面板A)来生成漂亮的单面板图像。当绘图中有大量图像时,单列绘图是不实际的。因此,请问如何将上述代码(面板A)的输出转换为希望的输出(面板B)的帮助。 C面板夸大了我使用不同的图像串联方法产生的问题性影响。

当前输出和希望的输出

将nest / ggplot2生成的图像列表以一致的比例加入两列

qq4714167 回答:将nest / ggplot2生成的图像列表以一致的比例加入两列

您可以尝试将面板尺寸设置为固定尺寸,然后将gtable排列在一起,

library(egg)
library(gridExtra)
lg <- purrr::map2(plots$plots,plots$heights,function(p,h) gtable_frame(ggplotGrob(p),height =unit(h/10,'npc'),#tweak
                                             width =unit(0.7,'npc')))  #tweak

grid.arrange(gtable_rbind(lg[[1]],lg[[2]],egg::.dummy_gtable),gtable_rbind(lg[[3]],lg[[4]],ncol=2)

(已通过set.seed(12)测试;我不知道sample() OP的功能)

本文链接:https://www.f2er.com/3166722.html

大家都在问