Использование гео-координат в качестве координат вершин в 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. Вот результат этого метода:
(изображение карты доступно для некоммерческого общественного использования Wikimedia Commons).
Я думаю, что графика это способен производить такие цифры, но это не основная цель этого программного обеспечения, поэтому у него есть свои ограничения. В какой-то момент Вы можете использовать программное обеспечение географической информационной системы (ГИС), которое предназначено именно для таких вещей. У меня нет опыта с ними, но в QGIS наверное стоит взглянуть на.