1

我正在尝试匹配垂直排列的两个图的绘图区域的宽度(两个图上的数据范围相同)。我尝试使用 gtable 将它们放在一起,然后操纵边距进行调整。看起来,由于底部图没有轴刻度或标签,设置相同的边距会使图稍微错位。我不清楚绘图区域左侧区域的总宽度是如何计算的。似乎文本标签的宽度以某种方式添加到其中,我无法计算出它的宽度。(我可以通过实验来匹配宽度,但我需要生成许多这样的图,我希望解决方案可以处理任意数据。)我尝试了 ,plot.marginpanel.margin各种margin组合axis.text.y和(已弃用)axis.ticks.margin.y但无济于事。这是一个最小的工作示例:

library(ggplot2)
library(grid)
library(gtable)

ex <- data.frame(xmin=1, xmax=100, ymin=0, ymax=15)

p <- ggplot(ex, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax)) +
  theme_minimal() +
  theme(plot.margin=margin(l=2.0, unit="cm"),
    panel.margin=margin(l=2.0, r=0, unit="cm"),
    panel.grid.major.x=element_blank(), panel.grid.minor.x=element_blank(),
    panel.border=element_blank(), panel.background = element_blank(),
    axis.text.y=element_text(margin=margin(l=0.0, r=0.0, unit="cm")),
    axis.ticks=element_line(size = 0.25),
    axis.ticks.x=element_line(), axis.ticks.y=element_line(),
    axis.ticks.length=unit(0.1, units="cm")) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  geom_rect()

ex_ann <- data.frame(xmin=10, xmax=50, ymin=0, ymax=1)

ann <- ggplot(ex_ann, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax)) +
  theme_minimal() +
  theme(plot.margin=margin(l=2.0, unit="cm"),
    panel.margin=margin(l=2.0, unit="cm"),
    panel.background=element_rect(fill="grey", colour="white"),
    panel.grid.major.x=element_blank(), panel.grid.minor.x=element_blank(),
    panel.grid.major.y=element_blank(), panel.grid.minor.y=element_blank(),
    panel.border = element_blank(), panel.background = element_blank(),
    # axis.text.y=element_text(margin=margin(r=0, l=0.5)), panel.margin=unit(0, units="cm"),
    axis.ticks=element_line(size = 0.25),
    axis.ticks.x=element_line(), axis.ticks.y=element_blank(),
    axis.text.y=element_blank(),
    axis.ticks.length=unit(0.0, units="cm")) +
  scale_x_continuous(limits=c(1, 100), expand = c(0, 0)) +
  scale_y_continuous(limits=c(0, 1), expand = c(0, 0)) +
  geom_rect()

gr <- ggplotGrob(p)
gr_ann <- ggplotGrob(ann)

g_joint <- rbind(gr, gr_ann, size="first") # stack the two plots
g_joint$widths <- unit.pmax(gr$widths, gr_ann$widths) # use the largest widths

g_joint$layout[grepl("guide", g_joint$layout$name),c("t","b")] <- c(1,nrow(g_joint))
grid.newpage()
grid.draw(g_joint)

g <- gtable(widths=unit(c(1), "null"), heights=unit(c(1, 0.1), "null"))
g <- gtable_add_grob(g, list(gr, gr_ann), t=c(1, 2), l=c(1, 1), r=c(1, 1), b=c(1, 2))

grid.newpage()
grid.draw(g)

我在网上找到了这个解决方案:https ://github.com/hadley/ggplot2/wiki/Align-two-plots-on-a-page 。它适用于简单的示例,但我的实际情节变得乱码。我对 ggplot2 内部结构的了解不足,无法解决问题所在。此解决方案的另一个限制是,在示例中,两个图的高度相同,我希望底部图的高度约为顶部图的 1/10。

4

0 回答 0