2016-04-21 436 views
3

我有两个ggplot2图,我想在它们之间绘制一系列(10-100)略微不同的曲线。也就是说,我将有一个双面板布局,并希望从左侧的情节向右侧的情节绘制连接线。到目前为止,我已经尝试通过将事物转换为grob's并使用gtable包来添加曲线。在ggplot2图之间添加多条曲线

为了说明这一点,我有这样的:

library(ggplot2) 
library(gtable) 
library(grid) 
library(gridExtra) 
p1 = ggplot(data.frame(x=1:10,y=1:10),aes(x=x,y=y))+geom_point() 
p2 = ggplot(data.frame(x=1:10,y=1:10),aes(x=x,y=y))+geom_point() 
g1 = ggplotGrob(p1) 
g2 = ggplotGrob(p2) 
gt = gtable:::cbind.gtable(g1,g2,size='first') 
gt$heights = unit.pmax(g1$heights,g2$heights) 
for(i in 1:10) { 
    gt = gtable_add_grob(gt,curveGrob(0,0.5,1,0.5,ncp=5,square=FALSE,curvature=i/10),l=5,r=8,b=3,t=3) 
} 
grid.newpage() 
grid.draw(gt) 

生产的情节是这样的:

output

这几乎是正确的,但只有最后的curveGrob对象的显示。我已经尝试使用z-index来增加grobs,而最后一个绘制的总是会覆盖其他的。我希望我的情节看起来是一样的,只是它应该显示两个情节区域之间的所有10条曲线,而不是仅显示现有代码所显示的那条曲线。

那么我该如何修改我现有的代码来显示所有10条曲线,或者使用不同的方法实现相同的效果?我被困在使用ggplot2的主要情节,因为它们比所示的玩具例子复杂得多。

+0

的可能的复制[ggplot,拉丝面两端点之间的线路(http://stackoverflow.com/questions/31690007/ggplot-drawing-line-between-points-across-facets) – jaimedash

+1

我不认为它是重复的,因为这里的问题是在相同的l,r,b和t坐标。事实上,这在for循环中起作用:'gt = gtable_add_grob(gt,curveGrob(0,0.5,1,0.5,ncp = 5,square = FALSE,curvature = i/10),l = 5,r = 8, b = 3,T = 3 + I/11)'。我不确定为什么略微改变t位置,而原始代码没有。这不是剪报问题AFAICT。 – eipi10

回答

2

gtable希望为grobs是在同一位置上的唯一名称

gt = gtable_add_grob(gt,curveGrob(0,0.5,1,0.5,ncp=5,square=FALSE,curvature=i/10), 
      l=5,r=8,b=3,t=3, name=paste(i)) 

enter image description here

+0

我不知道你是如何解决这个问题的,但是这完全解决了我的问题。谢谢! – user1356855