我也为此苦苦挣扎,直到我弄清楚 geom_net 包的正确 data.frame 结构是什么。基本上,您需要的是一个包含两部分的 data.frame:在第 1 部分中,您通过提供 FROM 和 TO 列来描述边缘(绘制的线)。或者,可以在单独的列中提供附加信息,例如线宽
ans <- read.table(text ="
from to linewidth
Tom Jim 0.1
Gary Shirly 1
Shirly Jack 0.5
Tom Jack 2
", sep = " ", stringsAsFactors = FALSE, header=TRUE)
p <- ggplot(data = ans, aes(from_id = from, to_id = to))
p + geom_net(label = TRUE, vjust=-1)
但您会注意到某些节点(顶点)没有标记。所以这就是 data.frame 的第 2 部分很重要的地方。在第 2 部分中,您提供要标记的节点的名称。这是因为 geom_net 仅标记 FROM 节点而不是 TO 节点,因此您至少需要提供不用作 FROM 点的节点的名称。
ans <- read.table(text ="
from to linewidth
Tom Jim 0.1
Gary Shirly 1
Shirly Jack 0.5
Tom Jack 2
Helen Jack 3
Jim NA NA
Jack NA NA
", sep = " ", stringsAsFactors = FALSE, header=TRUE, na.strings = "NA")
p <- ggplot(data = ans, aes(from_id = from, to_id = to, linewidth = linewidth))
p + geom_net(label = TRUE, vjust=-1)
上面发生的几件事:1)我添加了“Jim NA NA Jack NA NA”作为未标记节点的标签,2)还添加了 na.strings =“NA”以确保 read.table() 正确解释 NA 值, 3)我将线宽参数添加到 aes 中,以便它从 data.frame 映射到绘图。
此外,一旦您提供了所有节点的名称,警告消息“有 XX 个节点没有节点信息”就会消失。
Hope that helps
edit: as requested I added the resultant output. Since geom_net() changes the layout each time it is run, I have included two example images
为了完成整个 data.frame 构建过程,我在下面介绍了一种情况,其中您有两个单独的 data.frame,并且需要将它们合并在一起:第一个 data.frame 用于线(边缘),第二个是节点(顶点)。
lines <- read.table(text ="
from to linewidth
Tom Ivy 0.1
Gary Ivy 1
Shirly Ivy 0.5
Tom Helen 2
Helen Ivy 3
", sep = " ", stringsAsFactors = FALSE, header=TRUE, na.strings = "NA")
nodes <- read.table(text ="
name
Tom
Jim
Gary
Shirly
Jack
Helen
Susan
Joel
Ivy
", sep = " ", stringsAsFactors = FALSE, header=TRUE,na.strings = "NA")
df <- merge(lines, nodes, by.x = "from", by.y = "name", all = TRUE)
p <- ggplot(data = df, aes(from_id = from, to_id = to, linewidth = linewidth))
p + geom_net(label = TRUE, vjust=-1)