在 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"
非常感谢任何帮助!
使用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
我觉得这个可视化非常好,因为图形是交互式的。还有其他方法可以使它更具可读性吗?
再次感谢您的帮助!
祝一切顺利,
周杰伦
我正在尝试可视化医学院机构之间的联系,但无法根据联系的数量对边缘进行加权和显示得更粗或更细。
我尝试将我在这里找到的答案与 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"
非常感谢任何帮助!
使用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
我觉得这个可视化非常好,因为图形是交互式的。还有其他方法可以使它更具可读性吗?
再次感谢您的帮助! 祝一切顺利, 周杰伦