我有一组条形图,我试图将它们放入一个图中。它们在多个图中有不同数量的条形图,我看不到将它们与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)