微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

国会选区作为 R 中的地图?

如何解决国会选区作为 R 中的地图?

目前,我正在使用 United States Congressional District Shapefiles。我想使用 cartogram package 中列出的步骤制作 cartogram。但我似乎无法成功地使用 cartogram_cont 函数将其放入制图对象。

您能提供的任何帮助、建议或见解都将非常有帮助。

请在代码底部指出错误发生的位置。

谢谢!

######################### Library #####################
library(sf)
library(tmap)
library(cartogram)
library(ggplot2)
library(ggmap)
library(maptools)


###################### Get Congress Map ###################
get_congress_map <- function(cong=113) {
  tmp_file <- tempfile()
  tmp_dir  <- tempdir()
  zp <- sprintf("http://cdmaps.polisci.ucla.edu/shp/districts%03i.zip",cong)
  download.file(zp,tmp_file)
  unzip(zipfile = tmp_file,exdir = tmp_dir)
  fpath <- paste(tmp_dir,sprintf("districtShapes/districts%03i.shp",cong),sep = "/")
  st_read(fpath)
}


cd114 <- get_congress_map(114)

################ Create Congressional district ID ###################

State_Dictonary <- rbind(data.frame(state.abb,STATENAME= state.name),data.frame(state.abb= "DC",STATENAME= "district Of Columbia"))

#Add DC
cd114.1 <- merge(State_Dictonary,cd114,by = c("STATENAME"))
unique(cd114$STATENAME)
#**************** Paste Zero infront of Single districts ****************
cd114.1$district_code <- as.character(cd114.1$disTRICT)
cd114.1$district_code[cd114.1$district_code == 98] <- "01" #Account for the weird code for DC
cd114.1$district_code[cd114.1$district_code == 0] <- "01"  #Account for at large districts
cd114.1$district_code[cd114.1$district_code == 1] <- "01"
cd114.1$district_code[cd114.1$district_code == 2] <- "02"
cd114.1$district_code[cd114.1$district_code == 3] <- "03"
cd114.1$district_code[cd114.1$district_code == 4] <- "04"
cd114.1$district_code[cd114.1$district_code == 5] <- "05"
cd114.1$district_code[cd114.1$district_code == 6] <- "06"
cd114.1$district_code[cd114.1$district_code == 7] <- "07"
cd114.1$district_code[cd114.1$district_code == 8] <- "08"
cd114.1$district_code[cd114.1$district_code == 9] <- "09"

#************** Create CD in  Data ****************
cd114.1$CD <- paste(cd114.1$state.abb,cd114.1$district_code,sep = "")


################ Create Fake Data TO Simulate My Own ########################
CD <- unique(cd114.1$CD)
Values <- sample(1:100,436,replace = T)

Df <- data.frame(CD,Values)


################### Merge Shape File to Donor #####################
#******************** Merge Descriptive Stats *********************
Df.2 <- merge(x = Df,y = cd114.1,by = c("CD"),all.y = T)

################### Make SF Object ####################
SF.DF.1 <- st_as_sf(Df.2)
SF.DF.2 <- st_make_valid(SF.DF.1)
class(SF.DF.2)

################### Make cartogram ####################
#Follow Proceedure Laid out: https://cran.r-project.org/web/packages/cartogram/readme/README.html

# I use st_transform instead of spTransform beause I'm using an SF Ojbect
SF.DF.3 <- st_transform(SF.DF.1,CRS("+init=epsg:3395")) 

cartogram_cont(SF.DF.3,"Value",itermax = 5)
#Error in Fij[distance <= radius[j]] <- Fbij[distance <= radius[j]] : 
#NAs are not allowed in subscripted assignments




解决方法

第 87 行中的几何条目为空 (MULTIPOLYGON EMPTY)。您可以通过以下方式解决此问题:

library(dplyr)

SF.DF.3 <- st_transform(SF.DF.1,CRS("+init=epsg:3395")) %>% 
  filter(!st_is_empty(.))

此外,您的 df 中没有列 Value,它是 Values ;)

sf_ncont <- cartogram_ncont(SF.DF.3,"Values")

tm_shape(sf_ncont) + tm_polygons("Values",style = "jenks",legend.show = FALSE) +
  tm_layout(frame = FALSE)

注意,我在下面的情节中过滤掉了阿拉斯加和夏威夷,并使用了 cartogram_ncont 而不是 cartogram_cont,因为前一个操作非常耗时。

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?