在ggplot中对齐和排列图表

时间:2015-01-31 18:35:13

标签: r ggplot2 gtable

我在ggplot中有两个图,在我想对齐的轴上有相似的范围。

使用:

library(grid)
grid.newpage()
grid.draw(rbind(ggplotGrob(g1), ggplotGrob(g2), size = "last"))

其中size='last'确保网格对齐x,我得到如下布局:

enter image description here

对于我想描绘的简单行,顶部图表的垂直范围过大。

我希望图像更符合以下内容:

enter image description here

或者,将g1图表对齐在g2图表的轴下方。 (一般来说,让我们说我希望能够选择,或者甚至在g2之上叠加g1。

(我的原始模型是一个单独的图表,g1组件只是在g2图表中设置为y = 0的图层;但是,图表太杂乱,无法用该布局读取,所以我想我应该移动原始图表y = 0个元素进入一个单独的面板(即g1)。

最小示例:

size=50
df1=data.frame(x=seq(1,size),y=sample(-100:100,size,rep=TRUE))
df2=data.frame(x=seq(1,size),r=replicate(size,paste(sample(c(letters, LETTERS),3),collapse='')))
g1=ggplot(df1)+geom_point(aes(x=x,y=y))
g2=ggplot(df2)+geom_text(aes(x=x,y=0,label=r),angle=45,size=2)
library(grid) 
grid.newpage()
grid.draw(rbind(ggplotGrob(g1), ggplotGrob(g2), size = "last"))

我希望标签条(g2)相对于散点图整齐地定位。 g2条带是原始图表的一部分,位于geom_text()的{​​{1}}元素,但图表太杂乱了,标签也放在那里。

1 个答案:

答案 0 :(得分:4)

你只需要编辑gtable的高度,

library(ggplot2)
library(grid)
g1 <- g2 <- ggplotGrob(qplot(1,1))

g <- rbind(g1,g2,size="last")
id <- g$layout$t[g$layout$name == "panel"]
g$heights[id] <- lapply(c(1,4), "unit", "null")
grid.newpage()
grid.draw(g)

编辑:根据更具体的说明,我建议采用不同的策略:将第一个面板添加到第二个图表的gtable中,

p1 <- ggplot(df1)+geom_point(aes(x=x,y=y))
p2 <- ggplot(df2)+geom_text(aes(x=x,y=0,label=r),angle=45,size=2)
snug <- theme_bw() + theme(plot.margin=unit(c(0.5,0.5,0,0),"line"))

library(gtable)
g1=gtable_filter(ggplotGrob(p1 + snug), pattern = "panel", trim = TRUE, fixed=TRUE)
g2=ggplotGrob(p2 + snug)

g <- g2
g <- gtable_add_rows(g, unit(0.2, "null"), 0)
g <- gtable_add_grob(g, g1, 1, 4)
grid.newpage()
grid.draw(g)

enter image description here