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

时间:2016-01-24 14:04:28

标签: r ggplot2 data-visualization social-networking

给出如下数据框:

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轴的正确和美观的方式显示结果,并且应清楚地显示边缘之间的关系。边缘'颜色应代表它们所属的组。这意味着同一组中的所有名称都应具有相同的颜色。

希望得到你的帮助!提前谢谢!

2 个答案:

答案 0 :(得分:3)

我也在努力解决这个问题,直到我弄清楚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节点”就会消失。

希望有所帮助 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

答案 1 :(得分: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参数!

谢谢,山姆。