Наложение карты мира на R с сюжетом rgeolocate - PullRequest
0 голосов
/ 07 ноября 2018

В моем предыдущем вопросе я представил, что у меня есть таблица «записей» с IP-адресами, и что я хочу их геолокации. Геолокация большого количества сообщений на основе IP-адресов. (880 000 строк)

Ответ продемонстрировал, как использовать 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")

Результат показан здесь:

plot of ips

Этот график показывает именно ту группу, которую я ожидал, основываясь на данных. Итак, один шаг к успеху!

Конечно, следующий логический шаг - увеличить разрешение и добавить наложение карты мира. Мне не удалось достичь ни одной из этих целей.

Используя этот код, я могу создать карту мира с высоким разрешением:

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

И результат показан здесь:

worldmap no points

Каким-то образом я просто не могу получить комбинацию карты И данных, которые наносятся на график. Кажется, что любая попытка создать карту требует от меня построения самой карты, и любая попытка добавить точки к этому провалу. Например:

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)

Ошибка: ggmap строит объекты класса ggmap, видите? Get_map

Я пытался работать, основываясь на совете http://www.milanor.net/blog/maps-in-r-plotting-data-points-on-a-map/, но этот сайт посвящен карте Европы, и я хочу показать свои данные на карте мира.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 08 ноября 2018
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")

enter image description here

...