R igraph Визуализация взвешенных соединений

Я играл с igraph в R, и у меня возникли проблемы с использованием весов при визуализации сети. Я читал, что это может работать не со всеми типами макетов, но должно работать с Fruchterman-Reingold.

Мой код и вывод ниже (я попробовал две разные версии функции макета, я думаю, что они делают одно и то же, но на всякий случай попробовал обе)

Я ожидаю, что Сесил и Боб будут очень близки в первой версии из-за большого веса их отношений, но, похоже, этого не происходит. Это происходит только тогда, когда я создаю дополнительные строки для Боба и Сесила (версия 2), но это будет проблемой для того, что я действительно хочу сделать с гораздо большим набором данных.

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

Любые идеи? Заранее спасибо.

Код:

#vers1
library(igraph)


relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",
                               "David", "Esmeralda"),
                        to=c("Alice", "Bob", "Alice", "Alice", "Bob",
                             "Alice"),

                        weight=c(1,100,1,1,1,1)) 




graph<-graph_from_data_frame(relations, directed=F)


coords1<-layout_with_fr(graph, weights=E(graph)$weight)
coords2 <- layout.fruchterman.reingold(graph, weights=E(graph)$weight);

plot(graph,layout=coords1)
plot(graph,layout=coords2)

#vers2
library(igraph)


relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",
                               "David", "Esmeralda",
                               "Cecil",
                               "Cecil",
                               "Cecil",
                               "Cecil",
                               "Cecil"),
                        to=c("Alice", "Bob", "Alice", "Alice", "Bob",
                             "Alice",
                             "Bob",
                             "Bob",
                             "Bob",
                             "Bob", 
                             "Bob"),

                        weight=c(1,1,1,1,1,1,1,1,1,1,1)) 




graph<-graph_from_data_frame(relations, directed=F)


coords1<-layout_with_fr(graph, weights=E(graph)$weight)
coords2 <- layout.fruchterman.reingold(graph, weights=E(graph)$weight);

plot(graph,layout=coords1)
plot(graph,layout=coords2)

person Josh Gredvig    schedule 22.07.2015    source источник
comment
привет, Джош, этот ответ поможет тебе " title="как удлинить края в макете сетевого графика igraph fruchterman reingold"> stackoverflow.com/questions/5968612/ ?   -  person bjoseph    schedule 22.07.2015
comment
Спасибо Бьосеф. Я не думаю, что это совсем то, что я ищу. Кажется, что это разбивает весь график, я пытаюсь убедиться, что люди с отношениями с более высоким весом ближе друг к другу по сравнению с отношениями с меньшим весом.   -  person Josh Gredvig    schedule 22.07.2015
comment
извините :(, никогда не использовал igraph, но я смог контролировать веса в этом пакете christophergandrud.github.io/ сетьD3   -  person bjoseph    schedule 22.07.2015
comment
В зависимости от того, какую версию igraph вы используете, вы могли столкнуться с этим: github.com/igraph/ igraph/вопросы/839   -  person Gabor Csardi    schedule 22.07.2015


Ответы (1)


Вот версия, использующая библиотеки sna и network. Я перекодировал ваше значение 100 в 3, чтобы сделать его физически не невозможным. Но вы можете использовать значения журнала или что-то в этом роде. Уведомление также необходимо для преобразования значений сходства в расстояния.

library(sna)
library(network)

# recode the desired distances to something more reasonable
# (can't phiscally have one distance 100X the others)
relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",
                               "David", "Esmeralda"),
                        to=c("Alice", "Bob", "Alice", "Alice", "Bob",
                             "Alice"),

                        weight=c(1,3,1,1,1,1)) 

# convert to network object including edge weights
relNet<-network(relations,ignore.eval = FALSE,names.eval='weight',matrix.type='edgelist',directed=FALSE)
# valued construct adjacency matrix
adjMat<-as.matrix(relNet,attrname='weight')
# convert from distances to similarities
adjMat[adjMat!=0]<-4-adjMat[adjMat!=0]
# construct an appropriate geodesic distance matrix from the similarities
distMat<-geodist(adjMat,ignore.eval=FALSE,inf.replace = sqrt(network.size(relNet)))$gdist
# compute coords using distance matrix and kk algorithm
coords<-network.layout.kamadakawai(relNet,layout.par=list(elen=distMat))
# plot using precomputed coords
plot(relNet,displaylabels=TRUE,coord=coords,edge.label='weight',edge.lwd='weight')

введите здесь описание изображения

person skyebend    schedule 26.08.2015