使用 R 中的 geom_net 时显示不正确

4

给定以下数据框:

v1     v2     v3     v4
Tom     A     Jim     B
Gary    A     Shirly  A
Shirly  B     Jack    B
Tom     A     Jack    B
...

v2和v4分别表示v1和v3中的名称所属的组。Tom属于A组,Jim属于v4组。 我想用geom_net绘制一个社交网络图,如果两个人在同一行,则用线连接它们,例如TomJim。边缘的大小应该与它们在V3中出现的次数成比例,即Jack的边缘应该是JimShirly的两倍大。

我尝试过

ggplot(df, aes(from_id = V1,to_id = V3)) +geom_net()

但是结果非常糟糕:enter image description here 同时还会产生一个警告:
In f(..., self = self) :
There are 35 nodes without node information:
#And the below are all the values in V1 and V3
Tom, Shirly, ....
Did you use all=T in merge?

我想知道如何以不显示x轴或y轴的方式展示结果,并清晰地显示边缘之间的关系。边缘的颜色应表示它们所属的组。这意味着同一组中的所有名称应具有相同的颜色。希望能得到您的帮助!提前感谢!

你好。你解决了这个问题吗?如果是,怎么解决的? - hackR
@hackR 不,我最终使用了igraph。 - user5779223
2个回答

3

我也曾经为此苦恼,直到我弄清楚了 geom_net 包所需的正确数据框结构。基本上,你需要一个有两个部分的数据框:第一部分描述边缘(绘制的线条),提供 FROM 和 TO 列。可选地,在单独的列中可以提供其他信息,例如 linewidth。

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)

但是你会注意到,一些节点(顶点)没有标签。因此,数据框的第二部分非常重要。在第二部分中,您需要提供要标记的节点的名称。这是因为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中添加了linewidth参数,使其从数据框映射到绘图。一旦为所有节点提供名称,警告消息“存在XX个节点没有节点信息”就会消失。
希望这有所帮助。 enter image description here 编辑:根据要求,我添加了结果输出。由于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)

enter image description here


我还没有尝试过,但我认为你的解决方案恰好是我问题的正确解决方案,因为我在igraph中得到的结果形状与geom_net中的非常相似。但是,在V1中没有出现的名称都会丢失。顺便问一下,你能上传一下你得到的图吗?谢谢! - user5779223

0

我是geomnet的维护者。如果可能的话,请将未来的问题发布到github.com/sctyner/geomnet/issues。@hackR的想法是正确的,在文档中有几个示例。这个想法是:你有一个边缘数据框,它有一个from_id和一个to_id列(+其他列),还有一个顶点数据框,它有一个id列(+其他列)。然后你将它们合并:

network_data <- merge(edges, vertices, by.x = "from_id", by.y = "to_id", all = T)

别忘了加上 all = T 参数!

谢谢,Sam。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接