我也为此苦苦挣扎,直到我弄清楚 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)我将 linewidth 参数添加到 aes,以便它从 data.frame 映射到绘图。
此外,一旦您为所有节点提供名称,“有 XX 个节点没有节点信息”的警告消息就会消失。
希望有所帮助
编辑:根据要求,我添加了结果输出。由于 geom_net() 每次运行时都会更改布局,因此我包含了两个示例图像
只是为了完成整个 data.frame 构建过程,我在下面包含了一个案例,您有两个单独的 data.frames,您需要将它们合并在一起:第一个 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)