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

Create Weighted edges in igraph instead of multiple single connections

我正在尝试可视化医学院机构之间的联系,但无法根据联系的数量对边缘进行加权和显示得更粗或更细。

我尝试将我在这里找到的答案与 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

非常感谢任何帮助!

使用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)

(我稍微修改了您的情节陈述以提高可读性。)

非常感谢您的帮助!!我离那个还很远。为了让它更易读,我减少了边缘的厚度并用数字替换了名称,这是代码:

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

我觉得这个可视化非常好,因为图形是交互式的。还有其他方法可以使它更具可读性吗?

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