使用 rgeolocate 图在 R 中覆盖世界地图

Overlay worldmap in R with rgeolocate plot

在我之前的问题中,我提出我有 table 个带 IP 的“帖子”,我想对它们进行地理定位。

答案演示了如何使用 rgeolocate 来实现这一点,在学习 R 的一些努力之后,我设法实现了相同的结果:

library(iptools)
library(rgeolocate)
library(tidyverse)
library(readxl)
library(rworldmap)
library(ggmap)
library(rworldxtra)
post <- read_excel("filepath/post.xlsx")
view(post)

## grab my ips and, format them

ips <- unlist(post[,3], use.names=FALSE)

#geolocte them
system.time(
rgeolocate::maxmind(
ips, "~/R/GeoLite2-City.mmdb", c("longitude", "latitude")
) -> xdf
)

#user  system elapsed 
#6.04    0.02    6.05 

xdf %>% 
  count(longitude, latitude) -> pts

#And, plot them:
  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")

此处显示结果:

根据数据,该图准确地显示了我所期望的分组类型。那么成功的一步!

当然,下一个合乎逻辑的步骤是增加分辨率并添加世界地图的叠加层。我一直无法实现这两个目标中的任何一个。

使用这段代码,我可以制作高分辨率的世界地图:

newmap <- getMap(resolution = "high")
plot(newmap)

结果如下所示:

不知何故,我无法实现地图和正在绘制的数据的组合。似乎任何创建地图的尝试都需要我绘制地图本身,而任何向其添加点的尝试都失败了。例如:

newmap <- getMap(resolution = "high")
plot(newmap)
ggmap(newmap) +
  geom_point(data = pts, aes(x = longitude, y = latitude, size=n), 
             shape=21, fill = "steelblue", color = "white", stroke=0.25)

Error: ggmap plots objects of class ggmap, see ?get_map

我一直在尝试根据 http://www.milanor.net/blog/maps-in-r-plotting-data-points-on-a-map/ 的建议工作,但是这个网站专注于欧洲地图,我想在世界地图上显示我的数据。

感谢您的帮助。

library(iptools)
library(rgeolocate)
library(tidyverse)

ips <- ip_random(1000000)

rgeolocate::maxmind(
  ips, "~/Data/GeoLite2-City.mmdb", c("longitude", "latitude")
) -> xdf

xdf %>% 
  mutate(
    longitude = (longitude %/% 5) * 5,
    latitude = (latitude %/% 5) * 5
  ) %>%  
  count(longitude, latitude) -> pts

wrld <- tbl_df(map_data("world"))
wrld <- filter(wrld, region != "Antarctica")

ggplot() +
  geom_map(
    map = wrld, data = wrld, aes(long, lat, map_id=region),
    color = "black", fill ="white", size=0.125
  ) +
  geom_point(
    data = pts, aes(longitude, latitude, size = n), 
    shape=21, fill = "steelblue", color = "white", stroke=0.25
  ) +
  scale_size(name = "# IPs", label=scales::comma) +
  ggalt::coord_proj("+proj=wintri") +
  ggthemes::theme_map() +
  theme(legend.justification = "center") +
  theme(legend.position = "bottom")