Sam*_* D. 1 plot network-programming r ggplot2 reshape
我有一个按时间顺序的成对交互列表.我想绘制这些交互的时间网络,看起来像下图.
我的数据如下所示.id1和id2值是个体的唯一标识符.时间表示这些个体之间的相互作用何时发生.所以在时间= 1时,我想绘制个体-1和个体-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)
Run Code Online (Sandbox Code Playgroud)
根据这个StackOverflow问题,我可以看到在ggplot中可以在y轴上的位置之间绘制垂直线.这是通过将数据重新整形为长格式来实现的.当每个时间值只有一对时,这很好,但是当一次有多个交互对时则不行.例如,在我的虚拟数据中,在时间= 2时,有三对(在图中我将通过叠加具有降低的不透明度的线来显示这些对).
我的问题是,如何以ggplot能够在指定时间点绘制潜在的多个交互对的方式组织这些数据?
我一直试图通过为同时发生的多对中的每一对分配额外的标识符来重新组织数据.我想象数据表看起来像这样,但我还没弄清楚如何在R中做到这一点......在这个例子中,时间= 2的三个交互由一个额外的1,2或3分组来识别.即使我可以安排这个,我仍然不确定如何让ggplot阅读它.
最后,我试图在这篇科学论文中创建一个看起来像图2的东西.
任何帮助,将不胜感激!
你可以做到这一点没有改变着数据,只设置一个id,以y和其他id对yend中geom_curve:
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()
Run Code Online (Sandbox Code Playgroud)
输出: