Использование гео-координат в качестве координат вершин в R-пакете igraph

в пакете igraph для R я изо всех сил пытаюсь построить социальную сеть, используя координаты широты/долготы в качестве макета графика.

представьте себе этот простой пример: сеть с 4 узлами, из которых вы знаете географическое местоположение и соединения:

df<-data.frame("from" = c("Bob", "Klaus", "Edith", "Liu"), "to"= c("Edith", "Edith", "Bob", "Klaus"))

здесь у вас есть метаданные для узлов, так что Боб живет в Нью-Йорке, Клаус в Берлине, Эдит в Париже и Лю в Bejing:

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))

мы делаем g играф объект...

g <- graph.data.frame(df, directed=T, vertices=meta)

...и мы определяем наш макет как координаты долготы / широты

lo <- layout.norm(as.matrix(meta[,2:3]))
plot.igraph(g, layout=lo)

если вы запустите этот пример с этими (реальными) гео-координатами, вы увидите, что он "относительно" точен в том смысле, что местоположения правильны относительно друг друга. Однако, если я построю много таких координат, декартовая карта миров выглядит "растянутой".

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

1 ответов


одним из элементов решения является, несомненно, до igraph::plot() Как я предложил в комментарии. ОП спросил, почему ey получает пустой участок с этим? Это потому, что область построения все еще ограничена [-1; 1] интервал вдоль осей x и Y. Это значение по умолчанию igraph::plot(). Поэтому нам нужно дать xlim = c(-180, 180) и ylim = c(-90, 90) параметры. Это уже дает правильное позиционирование. Однако, если наша цель состоит в том, чтобы создать фигуру с картой мира, возможно, лучше всего написать сюжет igraph на устройство Cairo SVG. Тогда мы сможем разместить карту позади графика в любом редакторе SVG (например,Inkscape - отличное решение), и мы по-прежнему можем масштабировать и редактировать график и метки. За это кто-то другой igraph.plotting параметры необходимо установить, но это уже о пропорциях и эстетике. Вот код, который я использовал для получения вывода SVG:

#!/usr/bin/Rscript

require(igraph)
require(Cairo)

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))

g <- graph.data.frame(df, directed = TRUE, vertices = meta)

lo <- layout.norm(as.matrix(meta[,2:3]))

dpi = 1.0
Cairo(file = 'map-graph.svg', type = "svg", 
    units = "in", 
    width = 4 / dpi, 
    height = 2 / dpi, 
    dpi = dpi)

plot.igraph(g, 
    layout = lo, 
    xlim = c(-180, 180), 
    ylim = c(-90, 90), 
    rescale = FALSE, 
    edge.curved = TRUE, 
    edge.arrow.size = 10 / dpi, 
    edge.arrow.width = 0.5 / dpi, 
    vertex.label.dist = 50 / dpi, 
    vertex.label.degree = 90 / dpi, 
    vertex.size = 200 / dpi, 
    vertex.label.cex = 21 / dpi,
    vertex.frame.color = NA, 
    vertex.label.color = '#FFFF00', 
    edge.color = '#FFFFFF',
    vertex.label.family = 'sans-serif',
    edge.width = 16 / dpi)

dev.off()

когда SVG произведенный igraph выглядит отлично, мы можем открыть его в Inkscape. Затем импорт (Ctrl+i) карта в случае, если это pixmap; или открыть, если это векторная графика (например, PDF, SVG). Вручную масштабируйте и позиционируйте карту, чтобы установить тот же масштаб, что и график в SVG (т. е. до тех пор, пока точки не достигнут своего правильного места) – для пропорционального масштабирования удерживайте Ctrl в Inkscape. Вот результат этого метода:

enter image description here

(изображение карты доступно для некоммерческого общественного использования Wikimedia Commons).

Я думаю, что графика это способен производить такие цифры, но это не основная цель этого программного обеспечения, поэтому у него есть свои ограничения. В какой-то момент Вы можете использовать программное обеспечение географической информационной системы (ГИС), которое предназначено именно для таких вещей. У меня нет опыта с ними, но в QGIS наверное стоит взглянуть на.