2016-06-14 164 views
3

我正在尝试创建美国县的分区地图,其中两个数据集通过FIPS代码连接。我现在用的是mapscountycounty.fips数据,结合成这样一个data.table(可能不是FIPS数据集成的最优雅的方式):geom_map“map_id”参考问题

library(ggplot2) 
    library(maps) 
    library(data.table) 
    county <- map_data("county")  
    data(county.fips) 
    county.fips <- as.data.table(county.fips) 
    county.fips$polyname <- as.character(county.fips$polyname)  
    county.fips[, paste0("type", 1:2) := tstrsplit(polyname, ",")] 
    names(county.fips) <- c("FIPS","polyname","region","subregion") 
    county <- merge(county, county.fips, by=c("region", "subregion"), all=T) 
    county <- county[,1:7] 
    county <- as.data.table(county) 
    county <- na.omit(county) 
    setkey(county, order) 
    county[region=="washington" & subregion=="san juan", FIPS := 53055] 
    county[region=="washington" & subregion=="pierce", FIPS := 53053] 
    county[region=="florida" & subregion=="okaloosa", FIPS := 12091] 
    county[region=="louisiana" & subregion=="st martin", FIPS := 22099] 
    county[region=="north carolina" & subregion=="currituck", FIPS := 37053] 
    county[region=="texas" & subregion=="galveston", FIPS := 48167] 
    county[region=="virginia" & subregion=="accomack", FIPS := 51001] 

我想用county数据集在这里作地图并使用具有相应FIPS列的不同数据集来填写相应的县。当使用geom_map并且特别是map_id参数时,问题就出现了。

以下代码返回错误Error in unit(x, default.units) : 'x' and 'units' must have length > 0当我map_id=FIPS

ggplot() + 
    geom_map(data=county, map=county, 
      aes(x=long, y=lat, map_id=FIPS)) 

运行它。然而,与map_id=region返回正常映射map_id=subregion运行它运行它与约2返回一个地图出3国家失踪。我找到的最接近的答案是this,这表明map_id需要设置为regionid,但更改FIPS列名称没有帮助。

任何人都可以解释这里发生了什么?我的理解是,map_id仅作为另一个df$column的关键;那我不正确吗?我非常希望能在我的第二个数据集,以配合,通过FIPS列,例如:

ggplot() + 
    geom_map(data=county, map=county, 
      aes(x=long, y=lat, map_id=FIPS)) + 
    geom_map(data=DT2, map=county, 
      aes(fill=Revenue, map_id=FIPS)) 
+0

也许[这个博客帖子(https://www.datascienceriot.com/mapping-us-counties-in-r-with-fips/kris/)可能是有用的 –

回答

0

有两件事情会在这里。首先,我在上面的例子中注意到,它在某些FIPS代码上切断了前导零。所有FIPS都需要五位数字。您可以通过将此行添加到数据准备的末尾来添加前导零。

county$FIPS <- formatC(county$FIPS, width = 5, format = "d", flag = "0") 

至于ggplot,你在你的AES失踪group=group()。这很难重现,因为我不知道你使用的是什么的等值线填充,但下面应该工作:

ggplot(county, aes(long, lat, group = group)) + 
geom_polygon(aes(fill = YOUR_FILL_DATA), colour = alpha("white", 1/2), size = 0.2) 

编辑:我产生的随机数列作为填充率使用方法:

county$new.row <- sample(100, size = nrow(county), replace = TRUE) 

并从上面运行相同的ggplot代码。

enter image description here

+1

'geom_map'没有按不需要'group = group'参数(请参阅文档)。我使用'geom_map'作为共享密钥列而不是'geom_polygon',因为我不想将我的''县'数据集合并到我的数据数据集中(如上面所做的那样),因为这会导致它不合理地大(〜我的其他数据集用于“县”80k行〜8k行)。 – moman822