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")
Это основано на учебнике, размещенном в моем блоге.