垂直に配置された 2 つのプロットのプロット領域の幅を一致させようとしています (両方のプロットのデータの範囲は同じです)。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 つの制限は、この例では両方のプロットの高さが同じであり、下のプロットの高さを上のプロットの約 1/10 にしたいことです。