1

我有一组条形图,我试图将它们放入一个图中。它们在多个图中有不同数量的条形图,我看不到将它们与facet_grid. 相反,我使用gtable了布局,但这使事情变得复杂。我无法弄清楚如何正确对齐 x 轴上的刻度以及强制相同宽度的条形。

我在这里使用了来自 babtiste 的绝妙技巧来对齐 y 轴的宽度。地块的位置是通过反复试验确定的。如果方面内的图是平衡的,这里建议的答案似乎才有效。仅使用scale_x_discrete(expand = c(0,0))似乎会影响左上角的情节并使问题变得更糟。

下面是重现问题的代码。请注意条形宽度的差异以及第 1 列中的行之间“2”和“5”的轻微错位。

在真实数据中,每个图中都有多个组。使用 gtable 不是必需的,只要符合我的要求就行。

library(grid)
library(ggplot2)
library(gtable)
dfTestData <- data.frame(yval = c(5, 7, 8, 7, 9, 6, 5), 
                         type = c("T1", "T1", "T2", "T1", "T3", "T1", "T2"), 
                         pos = factor(c(1, 2, 1, 1, 2, 1, 1)),
                         condition = c("a", "a", "a", "b", "b", "c", "d")
                         )

dfTestData <- split(dfTestData, dfTestData$condition)
p <- ggplot(data.frame(), aes(pos, yval)) + 
     geom_bar(stat = "identity") + 
     facet_grid(~ type, scales = "free_x", space = "free_x")

plots <- lapply(dfTestData, function(x) p %+% x)
plots <- lapply(plots, ggplotGrob)

maxWidth <- grid::unit.pmax(plots$a$widths[2:3], 
                            plots$b$widths[2:3],
                            plots$c$widths[2:3],
                            plots$d$widths[2:3]
                            )

plots$a$widths[2:3] <- as.list(maxWidth)
plots$b$widths[2:3] <- as.list(maxWidth)
plots$c$widths[2:3] <- as.list(maxWidth)
plots$d$widths[2:3] <- as.list(maxWidth)

gt <- gtable(widths=unit(rep(1, 1000), "null"),
             heights=unit(c(1,0.2,1), "null"))

gt2 <- gtable_add_grob(gt, plots, 
                       l=c(5,5,655,655),
                       r=c(605,438,890,890),
                       t=c(1,3,1,3),
                       b=c(1,3,1,3))
grid.newpage()
grid.draw(gt2)
4

0 回答 0