Добавьте несколько кривых между графиками ggplot2

У меня есть два графика ggplot2, и я хочу нарисовать серию (10-100) немного разных кривых между ними. То есть у меня будет двухпанельный макет и я хочу провести соединительные линии от левого графика к правому. До сих пор я пытался сделать это, конвертируя вещи в grob и используя пакет gtable для добавления кривых.

Для иллюстрации у меня есть что-то вроде:

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)

создание такого сюжета:

выход

что почти правильно, за исключением того, что показан только последний из объектов curveGrob. Я пробовал играть с z-индексом для добавленных grobs, и последний нанесенный на график всегда перезаписывал другие. Я хочу, чтобы мой график выглядел одинаково, за исключением того, что он должен отображать все 10 кривых между двумя областями графика, а не только ту, которая отображается в моем существующем коде.

Итак, как мне изменить существующий код, чтобы показать все 10 кривых, или добиться того же эффекта, используя другой метод? Я застрял, используя ggplot2 для основных сюжетов, так как они значительно сложнее, чем показанный игрушечный пример.


person user1356855    schedule 21.04.2016    source источник
comment
Возможный дубликат ggplot, рисующий линию между точками по граням   -  person jaimedash    schedule 21.04.2016
comment
Я не думаю, что это дубликат, потому что проблема здесь заключается в том, чтобы отображать несколько кривых при добавлении в одни и те же координаты 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.   -  person eipi10    schedule 22.04.2016


Ответы (1)


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))

введите здесь описание изображения

person baptiste    schedule 22.04.2016
comment
Я не знаю, как вы это решили, но это точно решило мою проблему. Благодарю вас! - person user1356855; 25.04.2016