4

对使用 R 进行映射有疑问,特别是围绕 R 中的等值线图。

我有一个分配给一个地区的邮政编码数据集和一些相关数据(数据集在这里)。

我的最终数据格式是:区域 ID、邮政编码、概率值、客户数量、区域概率和区域客户总数。我试图通过在地图上绘制区域概率和区域客户总数来呈现这些数据。我曾尝试通过使用人口普查 TIGER Shapefiles 来做到这一点,但我猜 R 无法处理完整的国家/地区。

我对统计功能感到满意,现在我正在将我的所有映射从第三方 GIS 重点应用程序转移到在 R 中进行所有映射。有没有人有任何关于如何从 R 中实现这一点的指针?

更详细一点,这里是 R 停止工作的地方 -

shapes <- readShapeSpatial("tl_2013_us_zcta510.shp")

(其中 shp 文件是人口普查/TIGER)形状文件。

编辑 - 提供更多详细信息。我正在尝试首先阅读 TIGER shapefile,希望将这个空间数据集与我的数据结合起来并最终绘制。尝试读取形状文件时,我一开始就遇到问题。下面是带有输出的代码

require(maptools)
shapes<-readShapeSpatial("tl_2013_us_zcta510.shp")

Error: cannot allocate vector of size 317 Kb
4

2 回答 2

8

有几个使用 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@polygonsmap@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)。longlatgroupin列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 文件

于 2013-12-25T18:55:59.073 回答
2

我会建议以下。

  • readOGR从包中使用rgdal而不是readShapeSpatial.
  • 考虑使用ggplot2好看的地图 - 许多示例都使用它。
  • 请参阅现有的创建 choropleth 的示例之一,例如示例以获取概览。
  • 从一个简单的等值线开始,逐渐添加自己的数据;不要试图一下子搞定。
  • 如果您需要更多帮助,请使用 SMALL 假数据集和相关 shapefile 的链接创建一个可重现的示例。这个想法是,您可以轻松地帮助我们帮助您,而不是通过在您的问题中不提供代码和数据来阻止我们。
于 2013-12-25T21:51:30.470 回答