使用 ggplot 绘制重叠的垂直线

Plot overlapping vertical lines with ggplot

我有一个按时间排序的成对交互列表。我想绘制这些交互的时间网络,如下图所示。

我的数据如下例所示。 id1 和 id2 值是个人的唯一标识符。时间指示这些人之间的交互发生的时间。所以在时间 = 1 时,我想绘制 individual-1 和 individual-2 之间的连接。

id1 <- c(1, 2, 1, 6, 2, 2, 1)
id2 <- c(2, 4, 5, 7, 3, 4, 5)
time <- c(1, 2, 2, 2, 3, 4, 5)
df <- data.frame(id1, id2, time)

根据这个Whosebug question,我可以看到可以在 ggplot 中的 y 轴上的位置之间绘制垂直线。这是通过将数据重塑为长格式来实现的。当每个时间值只有一对时,这很好,但当一次有多个交互对时,就不行了。例如,在我的虚拟数据中,在时间 = 2 时,有三对(在图中,我将通过降低不透明度的叠加线来显示它们)。

我的问题是,如何以 ggplot 能够在指定时间点绘制潜在的多个交互对的方式组织这些数据?

我一直在尝试通过为同时出现的多对中的每一对分配一个额外的标识符来重新组织数据。我想象数据 table 看起来像 this,但我还没有弄清楚如何在 R 中做到这一点......在这个例子中,时间 = 2 的三个交互由一个额外的分组标识1、2 或 3 之一。即使我可以安排这个,我仍然不确定如何让 ggplot 阅读它。

最终,我试图在 scientific paper.

中创建类似于图 2 的内容

如有任何帮助,我们将不胜感激!

您可以在不重塑数据的情况下执行此操作,只需在 geom_curve 中将一个 id 设置为 y,将另一个 id 设置为 yend

ggplot(df, aes(x = time, y = id1)) +
    geom_curve(aes(xend = time, yend = id2), curvature = 0.3) +
    geom_hline(yintercept = 1:7, colour = scales::muted("blue")) +
    geom_point(size = 3) +
    geom_point(aes(y = id2), size = 3) +
    coord_cartesian(xlim = c(0, max(df$time) + 1)) +
    theme_bw()

输出:

图书馆:

library('ggplot2')
library('data.table')

数据:

id1 <- c(1, 2, 1, 6, 2, 2, 1)
id2 <- c(2, 4, 5, 7, 3, 4, 5)
time <- c(1, 2, 2, 2, 3, 4, 5)
df <- data.frame(id1, id2, time)
setDT(df)
df1 <- melt.data.table( df, id.vars = c('time'))

剧情:

p <- ggplot( df1, aes(time, value)) + 
  geom_point() + 
  geom_curve( mapping = aes(x = time, y = id1, xend = time, yend = id2, colour = "curve"), 
              data = df, 
              curvature = 0.2 )
print(p)