R: creating a map of the world network

I would like to create a global network map in R, similar to below than on this page .

enter image description here

I was looking for an R package that would allow me to do this, but I could not find it. There is D3 JavaScript Network Graphs from R , but I could not find an example of a map of the global network.
How can I create something like this in R?

+6
source share
2 answers

Well, FWIW: here is one quick and dirty way to draw vertices ("cities") on a map and connect the edges between the vertices with arrows:

library(maps) library(diagram) library(plotrix) palette(rainbow(20)) data("world.cities") pdf(tf <- tempfile(fileext = ".pdf"), width = 40, height = 20) map('world', fill = TRUE, col = "lightgray", mar = rep(0, 4)) nodes <- transform(with(world.cities, world.cities[pop > 5e6,]), country.etc = as.factor(country.etc)) with(nodes, points(long, lat, col=country.etc, pch=19, cex=rescale(pop, c(1, 8)))) set.seed(1) edges <- subset(data.frame(from = sample(nodes$name, 20, replace = TRUE), to = sample(nodes$name, 20, replace = TRUE), stringsAsFactors = F), from != to) edges <- merge(merge(edges, nodes[, c("name", "long", "lat")], by.x = "from", by.y = "name"), nodes[, c("name", "long", "lat")], by.x = "to", by.y = "name") edges$col <- as.integer(nodes$country.etc[match(edges$from, nodes$name)]) apply(edges[, -(1:2)], 1, function(x) curvedarrow(to=x[3:4], from=x[1:2], lcol=x[5], curve=.1, arr.pos = 1, lwd=.5)) dev.off() shell.exec(tf) 

enter image description here

+3
source

Here is a solution using the geosphere package and maps . Using the gcIntermediate function, you can "intermediate points on a large circle between two points used to define a large circle."

Here is an example showing air traffic from JKF airport (sample data from nycflights13 packet filtered with dplyr ):

 library(maps) library(geosphere) library(dplyr) library(nycflights13) usairports <- filter(airports, lat < 48.5) usairports <- filter(usairports, lon > -130) usairports <- filter(usairports, faa!="JFK") jfk <- filter(airports, faa=="JFK") map("world", regions=c("usa"), fill=T, col="grey8", bg="grey15", ylim=c(21.0,50.0), xlim=c(-130.0,-65.0)) for (i in (1:dim(usairports)[1])) { inter <- gcIntermediate(c(jfk$lon[1], jfk$lat[1]), c(usairports$lon[i], usairports$lat[i]), n=200) lines(inter, lwd=0.1, col="turquoise2") } points(usairports$lon,usairports$lat, pch=3, cex=0.1, col="chocolate1") 

enter image description here

This is based on a tutorial published on my blog .

+3
source

All Articles