1

この変更された、しかし恥知らずに汚されたコードを検討してください

library(ggplot2)
library(gtable)
library(gridExtra)
p1 <- ggplot(
  data.frame(
    x=c("a","b","longer"),
    y=c("happy","sad","ambivalent about")),
  aes(x=factor(0),fill=x)) + 
  geom_bar() +
  geom_point(aes(y=seq(3),color=y))
p2 <- ggplot(
  data.frame(
    x=c("a","b","c"),
    y=c("happy","sad","ambivalent about life")),
    aes(x=factor(0),fill=y)) + 
geom_bar()

# Get the widths
gA <- ggplot_gtable(ggplot_build(p1))
gB <- ggplot_gtable(ggplot_build(p2))

# The parts that differs in width
leg1 <- with(gA$grobs[[8]], grobs[[1]]$widths[[4]])
leg2 <- with(gB$grobs[[8]], grobs[[1]]$widths[[4]])

# Set the widths
gA$widths <- gB$widths

# Add an empty column of "abs(diff(widths)) mm" width on the right of 
# legend box for gA (the smaller legend box)
gA$grobs[[8]] <- gtable_add_cols(gA$grobs[[8]], unit(abs(diff(c(leg1, leg2))), "mm"))

# Arrange the two charts
grid.newpage()
grid.arrange(gA, gB, nrow = 2)

これらの条件下では、gA$grobs[[8]]2 つのエントリがあり、コードが最初のエントリに明示的にアクセスして、必要な凡例の調整を決定するため、凡例の配置が意図したとおりに機能しません。

それに応じてやりたいことは、すべてのエントリを反復処理してgA$grobs[[8]]、使用する最大幅を見つけることです。

ところで:

library(gtable)
a <- gtable(unit(1:3, c("cm")), unit(5, "cm"))
a # See, "TableGrob" exists (somewhat) ;)

これで私が何をしようとしているのかが明確になることを願っています。

ご指摘ありがとうございます、ジョー

4

1 に答える 1