在igraph中创建加权边,而不是多个单个连接

时间:2019-05-18 14:04:57

标签: r igraph edges weighted

我试图使医学系中各机构之间的联系形象化,只是无法根据连接的数量对边缘进行加权和粗细显示。

我尝试将在这里找到的答案与edge.width = E(g)$weight一起尝试并尝试graph.strength(g)。但说实话,我不知道我在做什么。这是我第一次使用R,而且我没有任何编程经验。

library(igraph)
D3 <- read.csv(file.choose(),header=TRUE,row.names = 1)
g <- graph.data.frame(D3, directed=FALSE)
plot(g, 
     vertex.size=20, 
     vertex.label.dist=1, 
     vertex.label.degree=-pi/2, 
     layout=layout_with_kk)

Igraph绘制了一个网络,其中显示了每个连接。一些机构彼此之间具有多个连接,这使得该图看起来没有吸引力。 Only a Part of the table was used for this picture

我的数据看起来像这样,大约有1500行:

"1","NEUROLOGIE","MEDINF" 

my data

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

使用edge.width = E(g)$weight是正确的主意,但是您需要获得正确的体重。 graph.strength(g)是顶点的属性,但是您需要为边缘指定权重。我不知道直接计算两个顶点之间有多少条边的函数,但是写一个并不难。

首先,获得图的一个版本,每对连接的顶点之间只有一个边。

g2 = simplify(g)

现在,我们需要为g2的边缘获得正确的权重。如果一条边连接两个顶点,则连接这两个顶点的所有最短路径将是单个边,因此对于简化g2的每个边,我们需要找到原始g中这些顶点之间的最短路径(边)数。然后我们可以绘图。

E(g2)$weight = sapply(E(g2), function(e) { 
    length(all_shortest_paths(g, from=ends(g2, e)[1], to=ends(g2, e)[2])$res) } )
plot(g2, 
     vertex.size=15, 
     vertex.label.dist=0.5, 
     vertex.label.cex=0.8,
     vertex.label.degree=-pi/2, 
     edge.width=E(g2)$weight,
     layout=layout_with_kk,
     margin=-0.2)

Graph with varying edge width

(我对您的plot语句进行了一些修改,以提高可读性。)

答案 1 :(得分:0)

非常感谢您的帮助!!我离那儿很近。.为了使其更易读,我减小了边缘的厚度,并用数字代替了名称,这是代码:

library(igraph)
D3 <- read.csv(file.choose(),header=TRUE,row.names = 1)
g <- graph.data.frame(D3, directed=FALSE)
g2 = simplify(g)

E(g2)$weight = sapply(E(g2), function(e) { 
    length(all_shortest_paths(g, from=ends(g2, e)[1], to=ends(g2, e)[2])$res) } )

tkplot(g2,
       vertex.color= "gold",
       vertex.label.color="red",
       vertex.size=10, 

       vertex.label.cex=1,


       edge.width=E(g2)$weight*0.15,
       edge.color="grey",
       layout=layout.reingold.tilford,
       asp = .5,
       margin=-0.95)

创建: Reingold.tilford

我发现这种可视化效果很好,因为图形是交互式的。还有其他方法可以使其更具可读性吗?

再次感谢您的帮助! 祝一切顺利, 杰伊