R: создание карты сети мира

Я хотел бы создать карту сети мира в R, аналогичную приведенной ниже на этой странице.

введите описание изображения здесь

Я искал пакет R, который позволил бы мне сделать это, но я не смог найти один. Есть D3 JavaScript Network Graphs от R, но я не смог найти пример карты мировой сети.
Как я могу создать нечто подобное в R?

2 ответа

Хорошо, FWIW: вот один быстрый и грязный способ нанести вершины ("города") на карту и соединить края между вершинами стрелками:

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)

Вот решение с использованием geosphere а также maps пакет. С использованием gcIntermediate Вы можете использовать "промежуточные точки на большом круге между двумя точками, которые используются для определения большого круга".

Вот пример, показывающий количество рейсов из аэропорта JKF (примеры данных из nycflights13 пакет отфильтрован 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")

Это основано на учебнике, размещенном в моем блоге.

Другие вопросы по тегам