Создание взвешенных ребер в igraph вместо нескольких отдельных соединений - PullRequest
2 голосов
/ 18 мая 2019

Я пытаюсь визуализировать связи между учреждениями на медицинском факультете и просто не могу получить грани, которые будут взвешиваться и отображаться более толстыми или более тонкими в зависимости от количества соединений.

Я имеюпопытался объединить ответы, которые я нашел здесь, играя с 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 строит сеть, в которой показано каждое отдельное соединение.Некоторые учреждения имеют множество связей друг с другом, что делает график совершенно непривлекательным для просмотра. Для этой картины использовалась только часть таблицы

Мои данные выглядят примерно так и имеют около 1500 строк:

"1","NEUROLOGIE","MEDINF" 

мои данные

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Большое спасибо за вашу помощь !!Мне это нигде не было близко. Чтобы сделать его более читабельным, я уменьшил толщину краев и заменил имена на цифры, это код:

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

Я нахожу эту визуализацию довольно хорошей, потому что график является интерактивным.Есть ли другие способы сделать его еще более читабельным?

Еще раз спасибо за помощь!Всего наилучшего, Джей

0 голосов
/ 18 мая 2019

Использование 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

(Я немного изменил ваше утверждение для улучшения читаемости.)

...