Как раскрасить страны с помощью ggmap - r

Я использую набор данных о глобальном терроризме из Kaggle и пытаюсь нанести на карту мира (или только Европу и соседние страны). Мне нужно представить террористические атаки в виде точек: размер - количество убитых. Мне также нужно раскрасить страны в соответствии с количеством иммигрантов в них - что мне потребуются данные из другого набора данных. Пока что у меня есть:

df <- read.csv("C:.../globalterrorismdb_0617dist.csv", stringsAsFactors = FALSE)

locs <- data.frame(lon = df$longitude, lat = df$latitude, stringsAsFactors = FALSE)

nMap <- get_map("Vienna, Austria", zoom = 4, maptype = "toner", source = "stamen")

ggmap(nMap) + 
  geom_point(aes(x = locs$lon, y = locs$lat ,color = df$nkill), data = df) + 
  geom_point(size = 6, alpha = 0.3)

что дает мне: Террористические атаки локаций

Важная часть данных об атаках выглядит так:

>    Country,                 latitude,          longitude  
>    United Kingdom           54.59727            -5.930109 
>    Spain                    43.18418            -2.473289 
>    Turkey                   37.95032            27.373266 
>    Italy                    41.89052            12.494249
>    United Kingdom           54.22641            -7.649053

Теперь я хотел бы, как уже упоминалось, раскрасить страны в соответствии с количеством беженцев и / или иммигрантов. Для этого предположим, что у меня есть набор данных, который содержит его в виде (поддельные числа):

>    country,                 # 
>    United Kingdom           123 
>    Spain                    100  
>    Turkey                   250 
>    Italy                    80

Пожалуйста помоги.

1 ответ

Решение

Вот один из подходов для наложения полигонов страны на базовую карту, предоставленный ggmap::get_map:

  1. Загрузите нужную фоновую карту, используя ggmap::get_map, Обратите внимание, что структура, возвращаемая этой функцией, включает в себя ограничивающий прямоугольник как атрибут, к которому можно получить доступ как attr(nMap, "bb") (где nMap это объект, возвращаемый get_map). Это будет необходимо позже.
  2. Получить данные карты страны, используя ggplot2::map_data("world") и присоедините любые дополнительные переменные из набора данных на уровне страны, например, используя merge или же dplyrПрисоединяйтесь к функциям.
  3. Поскольку некоторые страны могут быть частично в ограничительной рамке, вам нужно будет обрезать полигоны в ограничительной рамке. Функция PBSmapping::clipPolys предоставляет эту возможность.
  4. использование geom_polygon наложить полигоны страны на базовую карту.

Пример кода и вывод следуют.

library(ggmap)
library(ggplot2)
library(dplyr)
library(PBSmapping) # to clip polygons
require(ggthemes) # for theme_map, if desired

# define data (a simple dataset is constructed here
# for illustration purposes) and background map
countryData<-data.frame(region=factor(c("France", "Germany", "Libya")), data=c(2, 15, 1))
nMap <- get_map("Vienna, Austria",zoom=4,maptype="toner",source="stamen")

#get country polygon data
mapdata <- map_data("world")
mapdata <- left_join(mapdata, countryData, by="region")

#get bounding box for map
bb<-attr(nMap, "bb");
ylim<-c(bb$ll.lat, bb$ur.lat)
xlim<-c(bb$ll.lon, bb$ur.lon)

#clip polygons to map
colnames(mapdata)[1:6] <- c("X","Y","PID","POS","region","subregion")
mapdata<-clipPolys(mapdata, xlim=xlim, ylim=ylim, keepExtra=TRUE)

#plot map overlay
ggmap(nMap)+coord_map(xlim=xlim,ylim=ylim) +
    geom_polygon(data=mapdata, aes(x=X, y=Y, group=PID, fill=data), alpha=0.5) +
    ggthemes::theme_map()

хороплет выходной

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