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
Кто-нибудь видит, что я делаю не так? Помощь приветствуется.
2 ответа
Я знаю, что для ОП уже слишком поздно, но для других, кто сталкивался с этой же проблемой (как и я).
Могу ли я предложить следующие пять изменений в исходном коде учебника:
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
Работает нормально сейчас.
Обнаружено, что учебник на самом деле не так. Если вы строите ту же сеть каратэ, используя plot
по сравнению с использованием plotly
Есть много связей в plot
которые не в plotly
,
Я отказался от попыток заставить это работать, visNetwork - отличная альтернатива, с которой мне было гораздо легче разобраться. Рекомендую для тех, кто с подобной проблемой, читая это.