使用ggplot2在wordmap中绘制子区域

时间:2016-09-01 18:14:20

标签: r maps

我正在尝试从名为class C的数据框中绘制这些国家/地区:

data

我正在使用worldmap和ggplot库:

               country value        lon        lat
1              Denmark    12   9.501785  56.263920
2     UK:Great Britain    13  -1.174320  52.355518
3               France    15   2.213749  46.227638
4              Germany    17  10.451526  51.165691
5      China:Hong Kong    18 114.174695  22.278315
6          Netherlands    31   5.291266  52.132633
7          New Zealand    32 174.885971 -40.900557
8  UK:Northern Ireland    33  -6.492314  54.787715
9               Norway    34   8.468946  60.472024
10        Saudi Arabia    40  45.079162  23.885942
11              Serbia    41  21.005859  44.016521
12           Singapore    42 103.819836   1.352083
13     Slovak Republic    43 101.724578   3.153870
14            Slovenia    44  14.995463  46.151241
15        South Africa    45  22.937506 -30.559482

我可以绘制除library(maps) # Provides functions that let us plot the maps library(ggplot2) # Generic graphis engine map = map_data("world") map = subset(map, region!="Antarctica") #Remove Antarctica from map Countries = ggplot() + geom_polygon(data = map, aes(x=long, y = lat, group = group), fill = NA, colour="darkgray", size=0.5)+ geom_map(data=data,map=map,aes(map_id=country, x=lon, y=lat),fill = "cornflowerblue", colour = "gray") + coord_equal() Countries UK:Great Britain以外的所有国家/地区,实际上所有其他国家/地区和子区域由"分隔:":

Country map

我对如何使用world_map和ggplot绘制China: Hong Kong进行了设想。你们有没有类似的问题,或者可以想到一个解决方案?提前谢谢。

2 个答案:

答案 0 :(得分:3)

这可以达到你想要的效果,但我不确定它是非常有用的地图

library(ggplot2)
library(data.table)
library(magrittr)

map_dat <- subset(map_data("world"), region!="Antarctica")
setDT(map_dat)

# the countries you need to translate to region:subregion
colon_countries <-
  grep(':', data$country, value=T) %>%
    sub(':.*$', '', .) %>%
    unique

# change region to region:subregion, 
# for countries of interest, for rows with a value of subregion
map_dat[region %in% colon_countries, 
        region := ifelse(!is.na(subregion),
                         paste0(region, ':', subregion),
                         region)]
ggplot() + 
  geom_polygon(data = map_dat,
               aes(x=long, y = lat, group = group),
               fill = NA, colour="darkgray", size=0.5)+
  geom_map(data = data, map = map_dat,
           aes(map_id = country),
           fill = "cornflowerblue", colour = 'gray') +
  # probably not the projection you really want, but leaving it to match your post above
  coord_equal()

enter image description here

答案 1 :(得分:0)

geom_map将匹配数据$ country中的条目以映射$ region。不幸的是,map_data按第一个冒号分割区域,所以你得到的“UK”与数据$ country中的“UK:Great Britain”不匹配。

可能的手动修复是这样纠正的:

map$region[which(map$subregion == "Great Britain")] <- "UK:Great Britain"
map$region[which(map$subregion == "Northern Ireland")] <- "UK:Northern Ireland"
map$region[which(map$subregion == "Hong Kong")] <- "China:Hong Kong"