1 つの図に収まるようにしようとしているバープロットのセットがあります。複数のプロットで異なる数のバーがあり、それらを に揃える方法がわかりませんfacet_grid
。代わりにgtable
レイアウトに使用しましたが、それは問題を複雑にします。x軸の目盛りを正しく整列させ、バーの幅を同じにする方法がわかりません。
ここで babtiste の優れたトリックを使用して、y 軸の幅を揃えました。プロットの配置は、試行錯誤によって決定されました。ここで提案されている答えは、ファセット内のプロットのバランスが取れている場合にのみ機能するようです。onlyを使用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)