tipos resueltos para niños longitud leer latitud geograficas ejercicios ejemplos definicion coordenadas como cartograficas r geolocation igraph network-analysis

resueltos - Usar coordenadas geográficas como coordenadas de vértice en el igraph r-package



definicion de coordenadas geograficas (1)

En el paquete igraph para R, estoy luchando por trazar una red social usando coordenadas de latitud / longitud como el diseño del gráfico.

Imagina este simple ejemplo: una red con 4 nodos de la que conoces la ubicación geográfica y las conexiones:

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

Aquí tienes los metadatos para los nodos, para que Bob viva en Nueva York, Klaus en Berlín, Edith en París y Liu en 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))

Hacemos g el objeto igraph ...

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

... y definimos nuestro diseño como las coordenadas de longitud / latitud

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

Si ejecuta este ejemplo con estas geo-coordenadas (reales), verá que es "relativamente" preciso en el sentido de que las ubicaciones son correctas entre sí. Sin embargo, si trazado muchas coordenadas como esta, el mapa cartesiano de mundos parece "estirado".

¿Hay alguna manera de poder trazar mis nodos en un mapa mundial para que las coordenadas sean 100% correctas y pueda ver las conexiones entre mis nodos? Realmente quiero seguir usando el paquete igraph ya que ofrece muchas funcionalidades que podría necesitar más adelante cuando quiera analizar los enlaces entre nodos.


Un elemento de la solución es sin duda el parámetro igraph::plot() rescale = FALSE para igraph::plot() como sugerí en el comentario. OP preguntó por qué ey tiene una trama vacía con esto? Es porque el área de trazado todavía está limitada a [-1; 1] [-1; 1] intervalo a lo largo de ambos ejes xey. Esto es predeterminado de igraph::plot() . Entonces necesitamos dar los xlim = c(-180, 180) y ylim = c(-90, 90) . Esto ya le da un posicionamiento correcto. Sin embargo, si nuestro objetivo es producir una figura con el mapa del mundo, tal vez sea mejor escribir el diagrama de igraph en un dispositivo SVG de cairo. Entonces, podremos colocar el mapa detrás del gráfico en cualquier editor SVG (por ejemplo, Inkscape es una gran solución), y aún así podemos escalar y editar el gráfico y las etiquetas. Para hacer esto, igraph.plotting necesario establecer algunos otros parámetros de igraph.plotting , pero esto ya es acerca de las proporciones y la estética. Aquí está el código que utilicé para producir la salida 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()

Cuando el SVG producido por igraph se ve bien, podemos abrirlo en Inkscape. Luego importe ( Ctrl+i ) el mapa en caso de que sea pixmap; o abrir si se trata de gráficos vectoriales (por ejemplo, PDF, SVG). Escale y coloque manualmente el mapa para establecer la misma escala que el gráfico en el SVG (es decir, hasta que los puntos lleguen a su lugar correcto); para escalar proporcionalmente, mantenga presionada la Ctrl en Inkscape. Este es el resultado de este método:

(La imagen del mapa está disponible para uso público no comercial por Wikimedia Commons).

Creo que igraph es capaz de producir cifras como esta, pero este no es el objetivo principal de este software, por lo que tiene sus limitaciones. En algún momento puede considerar utilizar algún software del Sistema de Información Geográfica (GIS) que esté diseñado exactamente para hacer cosas como esta. No tengo experiencia con ellos, pero probablemente valga la pena echarle un vistazo.