如何使用ggmap -r为国家着色

时间:2018-02-24 22:30:48

标签: r ggplot2 ggmap

我正在使用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)

给了我: Terror attacks locations

攻击数据的重要部分如下:

>    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 个答案:

答案 0 :(得分:3)

以下是在ggmap::get_map提供的基本地图上覆盖国家多边形的一种方法:

  1. 使用ggmap::get_map下载所需的背景地图。请注意,此函数返回的结构包括边界框作为属性,可以将其作为attr(nMap, "bb")访问(其中nMapget_map返回的对象)。稍后将需要它。
  2. 使用ggplot2::map_data("world")获取国家/地区地图数据,并加入国家/地区级数据集中的任何其他变量,例如,使用mergedplyr的联接功能。
  3. 由于某些国家/地区可能部分位于边界框中,因此您需要将多边形剪切到边界框。函数PBSmapping::clipPolys提供此功能。
  4. 使用geom_polygon覆盖基本地图上的国家多边形。
  5. 示例代码和输出如下。

    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()
    

    choropleth output