Vi genererer nogle IP-adresser, geolokaliserer dem og plotter dem:
library(iptools)
library(rgeolocate)
library(tidyverse)
Generer en million (alt for ensartet fordelt) tilfældige IPv4-adresser:
ips <- ip_random(1000000)
Og geolokaliser dem:
system.time(
rgeolocate::maxmind(
ips, "~/Data/GeoLite2-City.mmdb", c("longitude", "latitude")
) -> xdf
)
## user system elapsed
## 5.016 0.131 5.217
5s til 1m IPv4s. 👍🏼
Nu på grund af ensartetheden vil boblerne være dumme små, så bare for dette eksempel vil vi runde dem lidt op:
xdf %>%
mutate(
longitude = (longitude %/% 5) * 5,
latitude = (latitude %/% 5) * 5
) %>%
count(longitude, latitude) -> pts
Og plot dem:
ggplot(pts) +
geom_point(
aes(longitude, latitude, size = n),
shape=21, fill = "steelblue", color = "white", stroke=0.25
) +
ggalt::coord_proj("+proj=wintri") +
ggthemes::theme_map() +
theme(legend.justification = "center") +
theme(legend.position = "bottom")
Du kan se, hvad jeg mener med "for ensartet". Men du har "rigtige" IPv4'er, så du burde være gtg.
Overvej at bruge scale_size_area()
, men ærlig talt, overvej slet ikke at plotte IPv4'er på et geo-kort. Jeg laver research på internet-skala til livets ophold, og påstandene om nøjagtighed lader meget tilbage at ønske. Jeg går sjældent under tilskrivning på landeniveau af den grund (og vi betaler for "rigtige" data).