4

SOですでに回答されている部分的な解決策を組み込むために質問を更新しました

私は、ggplot2いくつかのプロットを作成gridExtraし、それらのプロットを 1 つの列にまとめた複数のパネルを含む 1 つの図に結合するために使用しています。私の問題は、ドット プロットの行間のスペースを両方のプロットで一致させることができないことです。

ここに画像の説明を入力

library(ggplot2)
# data
  dat1 <- data.frame(VARIABLES=c("Item 1", "Item 2 is a little longer"),
                     est=c(.3, .5),
                     min=c(.2, .4),
                     max=c(.4, .7))
  dat2 <- data.frame(VARIABLES=c("Item 3", 
                                 "Item 4 is even longer if you can believe it",
                                 "And there is a third item",
                                 "And a fourth item"),
                     est=c(.3, .5, .3, .5),
                     min=c(.2, .4, .2, .4),
                     max=c(.4, .7, .4, .7))
  dat <- c("dat1", "dat2")
  labs <- c("Plot 1", "Plot2")
# create plots
  count <- 1
  for (i in dat) {
    p <- ggplot(get(i), aes(x=reorder(as.character(VARIABLES), est), 
                              y=est)) +
    geom_pointrange(aes(ymin=min,
                        ymax=max),
                    linetype="dashed") +
    geom_point(size=3) +
    ylim(-1,1) +
    theme_bw() +
    labs(title = labs[count]) +
    theme(legend.position="none") +
    coord_flip()
    assign(paste(i, "plot", sep="."), p)
    count <- count+1
  }
# combine plots
  library(gridExtra)
  # approach suggested by @baptise
  # http://stackoverflow.com/questions/13294952/left-align-two-graph-edges-ggplot
  gA <- ggplotGrob(dat1.plot)
  gB <- ggplotGrob(dat2.plot)
  maxWidth = grid::unit.pmax(gA$widths[2:5], gB$widths[2:5])
  gA$widths[2:5] <- as.list(maxWidth)
  gB$widths[2:5] <- as.list(maxWidth)
  grid.arrange(gA, gB, ncol=1)
4

3 に答える 3

9
library(gridExtra)
library(grid)

gb1 <- ggplot_build(dat1.plot)
gb2 <- ggplot_build(dat2.plot)

# work out how many y breaks for each plot
n1 <- length(gb1$layout$panel_params[[1]]$y.labels)
n2 <- length(gb2$layout$panel_params[[1]]$y.labels)

gA <- ggplot_gtable(gb1)
gB <- ggplot_gtable(gb2)

g <- rbind(gA, gB)

# locate the panels in the gtable layout
panels <- g$layout$t[grepl("panel", g$layout$name)]
# assign new (relative) heights to the panels, based on the number of breaks
g$heights[panels] <- unit(c(n1,n2),"null")

grid.newpage()
grid.draw(g)

ここに画像の説明を入力

于 2014-05-26T17:43:59.400 に答える