对R映射有疑问,特别是在R的等值区域图中。
我有一个分配给一个和一些相关数据的邮政编码数据集(数据集是here)。
我的最终数据格式是:区域ID,ZIP,概率值,客户计数,区域概率和区域客户总数。我试图通过在地图上绘制面积概率和面积客户总数来呈现此数据。我试图通过使用人口普查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
答案 0 :(得分:7)
有几个关于使用R制作地图的示例和教程,但大多数都非常通用,不幸的是,大多数地图项目都有细微差别,会产生难以理解的问题。你的就是一个很好的例子。
我遇到的最大问题是美国人口普查局的邮政编码区域形状文件对于整个美国来说是巨大的:~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 Spatial对象。在您的情况下,我们将多边形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
)相关联。然后我们使用两个数据框中的ZIP字段将您的Sample.csv
与结果合并。然后我们将其结果合并到map.df
。这可以用3行代码完成。
绘制地图涉及告诉ggplot要使用的数据集(map.df),用于x和y(long和lat)的列以及如何按多边形(group = group)对数据进行分组。 long
中的lat
,group
和map.df
列都是通过调用fortify(...)
创建的。对geom_polygon(...)
的调用告诉ggplot使用map.df$Probability_1
中的信息绘制多边形并填充。对geom_path(...)
的调用告诉ggplot创建一个具有状态边界的图层。对scale_fill_gradientn(...)
的调用告诉ggplot使用基于颜色酿造者“Reds”调色板的配色方案。最后,对coord_equal(...)
的调用告诉ggplot对x和y使用相同的比例,因此地图不会失真。
注意:状态边界层使用US States TIGER file。
答案 1 :(得分:2)
我会建议如下。
readOGR
包中的rgdal
而不是readShapeSpatial
。ggplot2
用于外观漂亮的地图 - 许多示例都使用此功能。