我有一个按时间顺序的成对交互列表。我想绘制这些交互的时间网络,看起来像下图。
我的数据如下所示。 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)
根据这个StackOverflow question,我可以看到在ggplot中可以在y轴上的位置之间绘制垂直线。这是通过将数据重新整形为长格式来实现的。当每个时间值只有一对时,这很好,但是当一次有多个交互对时则不行。例如,在我的虚拟数据中,在时间= 2时,有三对(在图中我将通过叠加具有降低的不透明度的线来显示这些对)。
我的问题是,如何以ggplot能够在指定时间点绘制潜在的多个交互对的方式组织这些数据?
我一直在尝试通过为同时发生的多对中的每一对分配额外的标识符来重新组织数据。我想象数据表看起来像this,但我还没有弄清楚如何在R中做出这个...在这个例子中,时间= 2的三个交互是通过额外的分组来识别的1,2或3.即使我可以安排这个,我仍然不确定如何让ggplot阅读它。
最终,我试图在这个scientific paper中创建看起来像图2的内容。
任何帮助将不胜感激!
答案 0 :(得分:6)
您可以在不重新整理数据的情况下执行此操作,只需在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()
输出:
答案 1 :(得分:1)
库:
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)