在ggplot2中设置分面的绝对大小

15

我正在为一份报告创建多个分面图。每个图的分面数量在2到8之间变化。理想情况下,我希望每个分面(跨图)的绝对大小相同(例如4x4厘米),这样更容易比较它们(而且看起来更好看)。

这可能吗?

df1 <- structure(list(group1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,1L, 1L, 1L, 1L, 1L), .Label = c("S1", "S2"), class = "factor"), group = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C", "D", "E"), class = "factor"), value = 1:12), class = "data.frame", row.names = c(NA, -12L), .Names = c("group1", "group", "value"))

df2 <- structure(list(group1 = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("S1", "S2"), class = "factor"), group = structure(c(4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L), .Label = c("A", "B", "C", "D", "E"), class = "factor"), value = 13:20), class = "data.frame", row.names = c(NA, -8L), .Names = c("group1", "group", "value"))

library(ggplot2)

plot1 <- ggplot(df1) + geom_histogram(aes(x=value)) + facet_wrap(~group)
plot2 <- ggplot(df2) + geom_histogram(aes(x=value)) + facet_wrap(~group)

这里输入图片描述 这里输入图片描述

1个回答

14
我已经使用以下函数实现了这个目的,
set_panel_size <- function(p=NULL, g=ggplotGrob(p), file=NULL, 
                           margin = unit(1,"mm"),
                           width=unit(4, "cm"), 
                           height=unit(4, "cm")){

  panels <- grep("panel", g$layout$name)
  panel_index_w<- unique(g$layout$l[panels])
  panel_index_h<- unique(g$layout$t[panels])
  nw <- length(panel_index_w)
  nh <- length(panel_index_h)

if(getRversion() < "3.3.0"){

   # the following conversion is necessary
   # because there is no `[<-`.unit method
   # so promoting to unit.list allows standard list indexing
   g$widths <- grid:::unit.list(g$widths)
   g$heights <- grid:::unit.list(g$heights)

   g$widths[panel_index_w] <-  rep(list(width),  nw)
   g$heights[panel_index_h] <- rep(list(height), nh)

} else {

   g$widths[panel_index_w] <-  rep(width,  nw)
   g$heights[panel_index_h] <- rep(height, nh)

}

  if(!is.null(file))
    ggsave(file, g, 
           width = grid::convertWidth(sum(g$widths) + margin, 
                                unitTo = "in", valueOnly = TRUE),
           height = grid::convertHeight(sum(g$heights) + margin,  
                                  unitTo = "in", valueOnly = TRUE))

  g
}

g1 <- set_panel_size(plot1)
g2 <- set_panel_size(plot2)
gridExtra::grid.arrange(g1,g2)

enter image description here


1
谢谢,虽然我仍然不知道如何在不收到错误消息的情况下使用此函数。您能否通过展示如何使用我的示例数据获得所需结果来扩展您的答案? - erc
我刚刚在R Devel中尝试了一下,这行代码对我不起作用:g$widths[panel_index_w] <- rep(list(width), nw)。我需要使用这个:g$widths[panel_index_w] <- rep(grid:::unit.list(width), nw) - Claus Wilke
1
回复我之前的评论:应该将g$widths[panel_index_w] <- rep(list(width), nw)这一行替换为g$widths[panel_index_w] <- rep(width, nw)。然后就可以正常工作了。 - Claus Wilke
1
set_panel_size 也可以在 @baptiste 的包 egg 中找到。 - jan-glx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接