一个用ggmap和ggplot2绘制的国家行政区地图

18

我可以用以下代码制作美国各州的失业率图表。

library(XML)
library(ggplot2)
library(plyr)
library(maps)

unemp <-
  readHTMLTable('http://www.bls.gov/web/laus/laumstrk.htm',
    colClasses = c('character', 'character', 'numeric'))[[2]]

names(unemp) <- c('rank', 'region', 'rate')
unemp$region <- tolower(unemp$region)

us_state_map <- map_data('state')
map_data <- merge(unemp, us_state_map, by = 'region')

map_data <- arrange(map_data, order)

states <- data.frame(state.center, state.abb)

p1 <- ggplot(data = map_data, aes(x = long, y = lat, group = group))
p1 <- p1 + geom_polygon(aes(fill = cut_number(rate, 5)))
p1 <- p1 + geom_path(colour = 'gray', linestyle = 2)
p1 <- p1 + scale_fill_brewer('Unemployment Rate (Jan 2011)', palette  = 'PuRd')
p1 <- p1 + coord_map()
p1 <- p1 + geom_text(data = states, aes(x = x, y = y, label = state.abb, group = NULL), size = 2)
p1 <- p1 + theme_bw()
p1

enter image description here

现在我想为巴基斯坦制作类似的图表。我的几次尝试结果如下:

data(world.cities)
Pakistan <- data.frame(map("world", "Pakistan", plot=FALSE)[c("x","y")])

p <- ggplot(Pakistan, aes(x=x, y=y)) +
     geom_path(colour = 'green', linestyle = 2) +
     coord_map() + theme_bw()
p <- p + labs(x=" ", y=" ")
p <- p + theme(panel.grid.minor=element_blank(), panel.grid.major=element_blank())
p <- p + theme(axis.ticks = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank())
p <- p + theme(panel.border = element_blank())
print(p)

输入图像描述

library(mapproj)

Country <- "Pakistan"

Get_Map_Country <-
  get_map(
      location = Country
    , zoom = 5
    , scale = "auto"
    , maptype = "roadmap"
    , messaging = FALSE
    , urlonly = FALSE
    , filename = "ggmapTemp"
    , crop = TRUE
    , color = "color"
    , source = "google"
    , api_key
    )

Country1 <-
  ggmap(
      ggmap = Get_Map_Country
    , extent = "panel"
  #  , base_layer
    , maprange = FALSE
    , legend = "right"
    , padding = 0.02
    , darken = c(0, "black")
    )

Country1 <- Country1 + labs(x="Longitude", y="Latitude")
print(Country1)

在此输入图片描述

Country2 <- Country1 + geom_polygon(data = Pakistan
                    , aes(x=x, y=y)
                    , color = 'white', alpha = .75, size = .2)

print(Country2)

enter image description here

问题

我想知道如何获得巴基斯坦行政区域的地图,例如美国。 我知道我们需要行政边界的经度和纬度。 我想知道如何获取一个国家行政边界的经度和纬度。 我尝试过全球行政区域,但没有成功。


1
你提到你无法使用全球行政区域数据。这是因为数据不符合你的需求,还是因为你在将其导入R时遇到了困难? - user666993
2个回答

47

我不知道您需要的行政区域的空间级别,但以下是两种从全球行政区域(gadm.org)读取shapefile数据和.RData格式的方法,并将它们转换为数据框以供在ggplot2中使用。此外,为了复制美国地图,您需要绘制位于多边形重心处的行政区域名称。

library(ggplot2)
library(rgdal)

方法一:以 .RData 格式存储的 SpatialPolygonDataFrames

# Data from the Global Administrative Areas
# 1) Read in administrative area level 2 data

load("/Users/jmuirhead/Downloads/PAK_adm2.RData")
pakistan.adm2.spdf <- get("gadm")

方法二:使用rgdal::readOGR读取Shapefile格式文件

pakistan.adm2.spdf <- readOGR("/Users/jmuirhead/Downloads/PAK_adm", "PAK_adm2", 
 verbose = TRUE, stringsAsFactors = FALSE)

例如,从spatialPolygonDataframes创建一个data.frame,并将其与包含失业信息的data.frame合并。

pakistan.adm2.df <- fortify(pakistan.adm2.spdf, region = "NAME_2")

# Sample dataframe of unemployment info
unemployment.df <- data.frame(id= unique(pakistan.adm2.df[,'id']),
  unemployment = runif(n = length(unique(pakistan.adm2.df[,'id'])), min = 0, max = 25))

pakistan.adm2.df <- merge(pakistan.adm2.df, unemployment.df, by.y = 'id', all.x = TRUE)

提取行政区域的名称和质心以进行绘图
# Get centroids of spatialPolygonDataFrame and convert to dataframe
# for use in plotting  area names. 

pakistan.adm2.centroids.df <- data.frame(long = coordinates(pakistan.adm2.spdf)[, 1], 
   lat = coordinates(pakistan.adm2.spdf)[, 2]) 

# Get names and id numbers corresponding to administrative areas
pakistan.adm2.centroids.df[, 'ID_2'] <- pakistan.adm2.spdf@data[,'ID_2']
pakistan.adm2.centroids.df[, 'NAME_2'] <- pakistan.adm2.spdf@data[,'NAME_2']

创建带有行政区标签的ggplot

p <- ggplot(pakistan.adm2.df, aes(x = long, y = lat, group = group)) + geom_polygon(aes(fill = cut(unemployment,5))) +
geom_text(data = pakistan.adm2.centroids.df, aes(label = NAME_2, x = long, y = lat, group = NAME_2), size = 3) + 
labs(x=" ", y=" ") + 
theme_bw() + scale_fill_brewer('Unemployment Rate (Jan 2011)', palette  = 'PuRd') + 
coord_map() + 
theme(panel.grid.minor=element_blank(), panel.grid.major=element_blank()) + 
theme(axis.ticks = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank()) + 
theme(panel.border = element_blank())

print(p)

Sample output for Pakistan unemployment


谢谢@Jim。我正在尝试安装rgdal,但是收到了以下消息:“包‘rgdal’不可用(适用于R版本3.1.2)”。你有什么想法如何获取最新版本吗? - Shambho
2
@Shambho:这个消息通常意味着你使用的平台没有可用的二进制版本。有关从源代码安装rgdal的说明,请参见:http://stackoverflow.com/questions/7168345/problems-installing-rgeos-and-rgdal-on-mac-os-x-lion - user666993
1
提示:1.您可以使用相同的坐标添加geom_path来添加边框;2.如果您看到一堆杂乱的直线或丑陋的三角形穿过地图,那是因为您忘记使用“group”美学,并将其映射到您正在使用的行政级别变量。 “group”基本上告诉ggplot对变量的每个级别使用不同的路径/多边形,否则它将连接单个线中的每个坐标,因此会出现虚假的线条。在您的示例中,我认为在ggplotaes函数中,应该读取group = NAME_2而不是group = group - ggll

3

您是否尝试过http://www.diva-gis.org/gdata?那里可以提供巴基斯坦的州/地区边界Shapefiles。

maptools软件包有函数,可以让您读取和转换Shapefiles为数据框架,用于布置边界多边形。


感谢@JConnor的回答。您能否详细说明如何在R中读取Shapefiles?谢谢。 - MYaseen208
1
我对maptools的经验不是很丰富,所以我更愿意指向gis.stackexchange上的这个问题,以及hadley在github上使用ggplot和Shapefiles的页面。 - JConnor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接