ggplot2,geom_bar,在多个图中对齐条形大小

时间:2015-02-12 15:01:07

标签: r ggplot2 grid gtable

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

0 个答案:

没有答案