如何使用 ggmap - r 给国家上色
How to color countries using 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
现在我想根据 and/or 移民的难民人数给国家上色。为此,假设我有一个数据集,其中包含(假数字)形式的数据:
> country, #
> United Kingdom 123
> Spain 100
> Turkey 250
> Italy 80
请帮忙。
这是ggmap::get_map
提供的在底图上叠加国家多边形的一种方法:
- 使用
ggmap::get_map
下载所需的背景地图。请注意,此函数返回的结构包括作为属性的边界框,可以作为attr(nMap, "bb")
访问(其中nMap
是get_map
返回的对象)。以后会用到。 - 使用
ggplot2::map_data("world")
获取国家地图数据并连接来自 country-level 数据集的任何其他变量,例如,使用merge
或dplyr
的连接函数。 - 由于某些国家/地区可能部分位于边界框内,因此您需要将多边形裁剪到边界框内。函数
PBSmapping::clipPolys
提供了这种能力。 - 使用
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()