【发布时间】:2013-08-28 16:24:57
【问题描述】:
我正在使用ggplot2 创建人口密度等值线。它目前适用于单个州,但不适用于多个州。似乎各个县(通常具有相同名称)的密度混淆了,有时甚至不匹配的县也会在州之间混淆。例如,“New Jersey”给出了正确的密度,但“New Jersey”、“New York”告诉我新泽西州人口众多的埃塞克斯县的密度
library(stringr)
library(ggplot2)
library(scales)
library(maps)
popdensitymap <- function(...){
path <- "U:/maps-county2011.csv"
states <- list(...)
countydata <- read.csv(path, sep=",")
countydata <- data.frame(countydata$X, countydata$Population.Density)
names(countydata) <- c("fips", "density")
data(county.fips)
cdata <- countydata
cdata$fips <- gsub("^0", "", cdata$fips)
countyinfo <- merge(cdata, county.fips, by.x="fips", by.y="fips")
countyinfo <- data.frame(countyinfo, str_split_fixed(countyinfo$polyname, ",", 2))
names(countyinfo) <- c('fips', 'density', 'polyname', 'state', 'county')
countyshapes <- map_data("county", states)
countyshapes <- merge(countyshapes, countyinfo, by.x="subregion", by.y="county")
choropleth <- countyshapes
choropleth <- choropleth[order(choropleth$order), ]
choropleth$density_d <- cut(choropleth$density, breaks=c(0,30,100,300,500,1000,3000,5000,100000))
state_df <- map_data("state", states)
density_d <- choropleth$density_d
choropleth <- choropleth[choropleth$state %in% tolower(states),]
p <- ggplot(choropleth, aes(long, lat, group=group))
p <- p + geom_polygon(aes(fill=density_d), colour=alpha("white", 1/2), size=0.2)
p <- p + geom_polygon(data = state_df, colour="black", fill = NA)
p <- p + scale_fill_brewer(palette="PuRd")
p
}
使用,
popdensitymap("New Jersey")
popdensitymap("New York", "New Jersey")
Here is the csv. 很丑,但是我现在没有文件共享系统。
这是一个输出示例。如您所见,纽约市人口众多的埃塞克斯县的代表不准确。
编辑:Here is my version of the CSV. 抱歉,保管箱延迟。
【问题讨论】:
-
您的 csv 文件没有正确读入。它似乎有一个标题标题 (?!),即使将其删除,字段名称也不正确。
-
@geotheory 这很奇怪,它对我来说很好用。我删除了直到
,,,2010,2011,Number,Percent,Number,Percent,Population Density,Area (Square Miles),,,,行和底部行的所有内容。 -
不可重现。如果我使用
popdensitymap("New Jersey")复制、粘贴和运行,我会得到Error in data.frame(countydata$X, countydata$Population.Density) : arguments imply differing number of rows: 3284, 0。一方面,看起来你的breaks参数中有一个错字cut,最后一个值应该是10000而不是100000?出于兴趣,如果将代码从函数中剥离出来,代码是否有效?我整理了一个等值线来检查,人口数据和地图多边形都很好,所以这绝对是你的代码。 -
@SlowLearner 我添加了 CSV 的裁剪版本。它仍然可以重现吗?