iGraph + Plotly создает случайные соединения

Я пытаюсь использовать пример кода для создания iGraph сетевых графиков в plotly и обувную ложку в моем собственном data.frames вместо того, чтобы использовать пример данных клуба карате. Когда граф строится, кажется, что он игнорирует список ребер, и создается множество случайных соединений. Я думаю, что либо метки, либо края неверны, но я не могу сказать.

library(igraph)
library(plotly)

setwd('C:/Users/Andrew Riffle/Documents/MEGAsync/code/R/link_analysis')

ID <- c(1:50)
nodes <- data.frame(ID)

Source <- c(23, 24, 36, 20, 36, 41, 12, 8, 18, 28)
Target <- c(5, 7, 9, 35, 23, 12, 38, 29, 33, 45)
links <- data.frame(Source, Target)

net <- graph_from_data_frame(d=links, vertices=nodes, directed=FALSE)

net <- simplify(net, remove.multiple = F, remove.loops = T)

tkplot(net, vertex.label=nodes$id, vertex.label.color='white', layout=layout.fruchterman.reingold)

#####Begin plotly example code unmodified unless commented#####

G <- upgrade_graph(net) #put my iGraph object instead of the karate club one
L <- layout.circle(G)

vs <- V(G)
es <- as.data.frame(get.edgelist(G))

Nv <- length(vs)
Ne <- length(es[1]$V1)

Xn <- L[,1]
Yn <- L[,2]

network <- plot_ly(x = ~Xn, y = ~Yn, mode = "markers", text = vs$name, hoverinfo = "text")

edge_shapes <- list()
for(i in 1:Ne) {
  v0 <- es[i,]$V1
  v1 <- es[i,]$V2

  edge_shape = list(
    type = "line",
    line = list(color = "#030303", width = 0.3),
    x0 = Xn[v0],
    y0 = Yn[v0],
    x1 = Xn[v1],
    y1 = Yn[v1]
  )

  edge_shapes[[i]] <- edge_shape
}

axis <- list(title = "", showgrid = FALSE, showticklabels = FALSE, zeroline = FALSE)

p <- layout(
  network,
  title = 'Test Network', #Changed the title
  shapes = edge_shapes,
  xaxis = axis,
  yaxis = axis
)

p #added a call to display p instead of upload to plot.ly

Когда я запускаю это, я получаю этот красивый iGraph, построенный Plotly. Однако края неправильные. Похоже, что подключаются только идентификаторы 1-10 и только другие идентификаторы меньше 10. Ни одно из этих соединений не находится в списке краев, который находится ниже.

   Source Target
1      24     35
2      12     23
3      41     12
4      23      7
5      18      5
6      20      9
7      28     29
8      36     45
9       8     33
10     36     38

Кто-нибудь видит, что я делаю неправильно? Помощь приветствуется.


person jamzsabb    schedule 15.08.2017    source источник


Ответы (2)


Обнаружил, что учебник на самом деле неправильный. Если вы построите одну и ту же сеть карате, используя plot, по сравнению с использованием plotly, в plot будет много связей, которых нет в plotly.

Я отказался от попыток заставить это работать, visNetwork - отличная альтернатива, которую мне было намного легче понять. Рекомендую всем, у кого есть похожая проблема, читающим это.

person jamzsabb    schedule 17.08.2017
comment
Спасибо за предложение visNetwork, работает как шарм. Были похожие проблемы с сюжетным примером, эта часть учебника проблематична. x0 = Xn[v0], y0 = Yn[v0] Он пытается найти имя вершины в числовом векторе, что приводит к странным результатам. - person DMU; 13.09.2017

Я знаю, что для ОП уже слишком поздно, но для других, кто наткнулся на эту же проблему (как и я).

Могу ли я предложить следующие пять изменений в исходном коде учебника:

G <- upgrade_graph(net)
L <- layout.circle(G)
rownames(L) <- get.vertex.attribute(G)$name           #added line (#1 out of 5)

vs <- V(G)
es <- as.data.frame(get.edgelist(G))

Nv <- length(vs)
Ne <- length(es[1]$V1)

Xn <- L[,1]
Yn <- L[,2]

network <- plot_ly(x = ~Xn, y = ~Yn, mode = "markers", text = vs$name, hoverinfo = "text")

edge_shapes <- list()
for(i in 1:Ne) {
  v0 <- es[i,]$V1
  v1 <- es[i,]$V2

  edge_shape = list(
    type = "line",
    line = list(color = "#030303", width = 0.3),
    x0 = L[which(v0==rownames(L)),][1],               #changed line (#2 out of 5)                
    y0 = L[which(v0==rownames(L)),][2],               #changed line (#3 out of 5)
    x1 = L[which(v1==rownames(L)),][1],               #changed line (#4 out of 5)
    y1 = L[which(v1==rownames(L)),][2]                #changed line (#5 out of 5)
  )

  edge_shapes[[i]] <- edge_shape
}

axis <- list(title = "", showgrid = FALSE, showticklabels = FALSE, zeroline = FALSE)

p <- layout(
  network,
  title = 'Test Network', #Changed the title
  shapes = edge_shapes,
  xaxis = axis,
  yaxis = axis
)

p

Теперь работает нормально.

person Emile Zäkiev    schedule 10.01.2018