有几个使用 R 制作地图的示例和教程,但大多数都非常笼统,不幸的是,大多数地图项目都有细微差别,会产生难以理解的问题。你的就是一个例子。
我遇到的最大问题是整个美国的美国人口普查局邮政编码制表区域 shapefile 很大:~800MB。使用readOGR(...)
R SpatialPolygonDataFrame 对象加载时大约为 913MB。fortify(...)
至少在我的系统上尝试处理这种大小的文件(例如,使用 转换为数据框)会导致类似于您在上面确定的错误。因此,解决方案是根据数据中实际存在的邮政编码对文件进行子集化。
这张地图:

是使用以下代码从您的数据中生成的。
library(rgdal)
library(ggplot2)
library(stringr)
library(RColorBrewer)
setwd("<directory containing shapfiles and sample data>")
data <- read.csv("Sample.csv",header=T) # your sample data, downloaded as csv
data$ZIP <- str_pad(data$ZIP,5,"left","0") # convert ZIP to char(5) w/leading zeros
zips <- readOGR(dsn=".","tl_2013_us_zcta510") # import zip code polygon shapefile
map <- zips[zips$ZCTA5CE10 %in% data$ZIP,] # extract only zips in your Sample.csv
map.df <- fortify(map) # convert to data frame suitable for plotting
# merge data from Samples.csv into map data frame
map.data <- data.frame(id=rownames(map@data),ZIP=map@data$ZCTA5CE10)
map.data <- merge(map.data,data,by="ZIP")
map.df <- merge(map.df,map.data,by="id")
# load state boundaries
states <- readOGR(dsn=".","gz_2010_us_040_00_5m")
states <- states[states$NAME %in% c("New York","New Jersey"),] # extract NY and NJ
states.df <- fortify(states) # convert to data frame suitable for plotting
ggMap <- ggplot(data = map.df, aes(long, lat, group = group))
ggMap <- ggMap + geom_polygon(aes(fill = Probability_1))
ggMap <- ggMap + geom_path(data=states.df, aes(x=long,y=lat,group=group))
ggMap <- ggMap + scale_fill_gradientn(name="Probability",colours=brewer.pal(9,"Reds"))
ggMap <- ggMap + coord_equal()
ggMap
解释:
该rgdal
包有助于从 ESRI shapefile 创建 R 空间对象。在您的情况下,我们将多边形 shapefile 导入 R 中的 SpatialPolygonDataFrame 对象。后者有两个主要部分:多边形部分,其中包含将连接起来以在地图上创建多边形的纬度和经度点,以及数据部分其中包含有关多边形的信息(因此,每个多边形一行)。例如,如果我们调用 Spatial 对象map
,那么这两个部分可以引用为map@polygons
和map@data
。制作等值线地图的基本挑战是将Sample.csv
文件中的数据与相关的多边形(邮政编码)相关联。
所以基本的工作流程如下:
1. Load polygon shapefiles into Spatial object ( => zips)
2. Subset if appropriate ( => map).
3. Convert to data frame suitable for plotting ( => map.df).
4. Merge data from Sample.csv into map.df.
5. Draw the map.
步骤 4 是导致所有问题的步骤。首先,我们必须将邮政编码与每个多边形相关联。然后我们必须Probability_1
与每个邮政编码相关联。这是一个三步过程。
空间数据文件中的每个多边形都有一个唯一的 ID,但这些 ID不是邮政编码。多边形 ID 作为行名存储在map@data
. 邮政编码存储在map@data
, 列中ZCTA5CE10
。因此,首先我们必须创建一个将map@data
行名称 ( id
) 与map@data$ZCTA5CE10
( ZIP
) 相关联的数据框。然后,我们Sample.csv
使用两个数据帧中的 ZIP 字段将您的结果与结果合并。然后我们将结果合并到map.df
. 这可以在 3 行代码中完成。
绘制地图涉及告诉 ggplot 使用什么数据集(map.df),哪些列用于 x 和 y(long 和 lat)以及如何按多边形对数据进行分组(group=group)。long
、lat
和group
in列map.df
都是由对 的调用创建的fortify(...)
。调用geom_polygon(...)
告诉 ggplot 绘制多边形并使用map.df$Probability_1
. 调用geom_path(...)
告诉 ggplot 创建一个具有状态边界的层。调用scale_fill_gradientn(...)
告诉 ggplot 使用基于颜色 brewer "Reds" 调色板的配色方案。最后,调用coord_equal(...)
告诉 ggplot 对 x 和 y 使用相同的比例,这样地图就不会失真。
注意:州边界层,使用美国国家 TIGER 文件。