В пакете igraph для R я изо всех сил пытаюсь построить социальную сеть, используя координаты широты/долготы как макет графика.Использование геокоординированных координат в координатах вершин в igraph r-пакете
Представьте себе этот простой пример: сеть с 4-мя узлами которого вы знаете, географическое местоположение и соединений:
df<-data.frame("from" = c("Bob", "Klaus", "Edith", "Liu"), "to"= c("Edith", "Edith", "Bob", "Klaus"))
Здесь у вас есть мета-данные для узлов, так что Боб живет в Нью-Йорке, Клаус в Берлине Эдит в Париже и Лю в Пекине:
meta <- data.frame("name"=c("Bob", "Klaus", "Edith", "Liu"), "lon"=c(-74.00714, 13.37699, 2.34120, 116.40708), "lat"=c(40.71455, 52.51607, 48.85693, 39.90469))
Мы делаем г объект igraph ...
g <- graph.data.frame(df, directed=T, vertices=meta)
... и мы определяем нашу раскладку как долгота/широта координаты
lo <- layout.norm(as.matrix(meta[,2:3]))
plot.igraph(g, layout=lo)
Если запустить этот пример с этими (реальными) гео-координатами, вы увидите, что это «относительно» точная в что места являются правильными относительно друг друга. Однако, если я нарисую много таких координат, карта карт мира выглядит «растянутой».
Есть ли способ, которым я могу на самом деле построить свои узлы на карте мира, чтобы координаты были на 100% правыми, и я вижу связи между моими узлами? Я действительно хочу продолжать использовать пакет igraph, поскольку он предлагает множество функций, которые мне могут понадобиться позже, когда я захочу проанализировать связи между узлами.
Вы рассмотрели возможность создания кадра данных из узлов igraph и последующего построения их по карте с помощью подсистемы ggplot? – hrbrmstr
В предложении @ hrbrmstr это создает карту мира, но наложение или интеграция ребер и возможностей igraph превосходят меня. требующие (карты) страны <- map_data ("world") страны <- подмножество (страны, регион! = "Антарктида") ggplot (meta, aes (x = lon, y = lat)) + geom_point (форма = 22, fill = "red", size = 6) + geom_polygon (data = countries, aes (x = long, y = lat, group = group), col = "grey30", fill = "transparent", lwd = 0) – lawyeR
Вы должны вызвать здесь 'igraph :: plot()' с параметром 'rescale = FALSE', в противном случае он пересказывает координаты вдоль обоих измерений в' [-1; 1] 'интервал. – deeenes