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