使用视口覆盖两个图形

时间:2013-04-28 11:32:12

标签: r graph ggplot2 viewport

我一直在尝试(知道我不应该知道的所有原因)将两个图叠加在一起。我记得当我过去使用视口时,两个图像会叠加在一起。所以grid不会用另一个覆盖一个图形。在下面的MWE中,当我尝试打印第二个图形时,会删除一个图形。

我做错了什么?感谢

library(grid)
library(ggplot2)

date=seq(as.Date('2012-04-01',"%Y-%m-%d"),as.Date('2013-03-27','%Y-%m-%d'),1)
tp1=data.frame(Date=date,bond=rnorm(361,100,2),equity=rnorm(361,60,15))
vp=viewport(x=0.5,y=0.5,height=1,width=1)
a = ggplot(tp1,aes(Date,bond)) + geom_line(colour=I("blue")) + xlim(range(tp1$Date))
b = ggplot(tp1,aes(Date,equity)) + geom_line(colour=I("red")) + xlim(range(tp1$Date))
print(a,vp=vp)
print(b,vp=vp)

1 个答案:

答案 0 :(得分:4)

我没有看到如何使用视口来覆盖2 ggplot2图。也许你使用一些简单的网格图形来做到这一点,而不是复杂的ggplot2图(很多视口都有很多细节)。视口只是您基本上定义绘图的尺寸/比例的上下文。

Here,一个做你想做的事的代码。我只需添加一小部分并使用您的绘图说明进行调整。

enter image description here

所有代码是:

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

grid.newpage()

# two plots
a = ggplot(tp1,aes(Date,bond)) + geom_line(colour=I("blue")) + xlim(range(tp1$Date))
b = ggplot(tp1,aes(Date,equity)) + 
  geom_line(colour=I("red")) + 
  theme(panel.background = element_rect(fill = NA))

# extract gtable
g1 <- ggplot_gtable(ggplot_build(a))
g2 <- ggplot_gtable(ggplot_build(b))

# overlap the panel of 2nd plot on that of 1st plot
pp <- c(subset(g1$layout, name == "panel", se = t:r))
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t, 
                     pp$l, pp$b, pp$l)

## what I dd is to plot a new viewports.
vp=viewport(x=0.5,y=0.5,height=0.5,width=0.5)
pushViewport(vp)
grid.draw(g)
upViewport()