我有一套条形图,我试图融入一个人物。他们在多个图中有不同数量的条形图,我没有看到将它们与facet_grid
对齐的方法。相反,我使用gtable
进行布局,但这使问题变得复杂。我无法弄清楚如何正确对齐x轴上的刻度线和强制相同的条形宽度。
我使用了来自babtiste here的优秀技巧来对齐y轴的宽度。通过反复试验确定地块的位置。
建议here的答案似乎只有在方面内的情节平衡时才有效。使用scale_x_discrete(expand = c(0,0))
似乎只会影响左上角的情节并使问题变得更糟。
以下是重现问题的代码。注意杆的宽度差异以及" 2"的轻微错位。和" 5"在第1列的行之间。
在实际数据中,每个图中都有多个组。使用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)