我正在尝试在R中创建一个地图,它传达底层几何体的形状(即物理边界)和对象在相关值方面的相对重要性。< / p>
为了具体,我想专注于复制(一个版本)以下地图*(形状,而不是颜色,因为我可以'找到轮询数据):
我也不想打扰让阿拉斯加和夏威夷出现在美国以下,而不是在他们的地理位置正确的位置。
我只是将数据与权重合并,例如如下所示:
library(maptools)
library(data.table) #not strictly necessary but I prefer it
#US states downloaded (500k resolution) from:
#https://www.census.gov/geo/maps-data/data/cbf/cbf_state.html
us.states<-
readShapePoly("~/Desktop/cb_2014_us_state_5m.shp")
setDT(us.states@data)
#for getting rid of territories, AK, HI
states<-sprintf("%02d",1:59)
ak.hi<-c("02","15")
us.states.contig<-
us.states[us.states@data$STATEFP %in%
setdiff(states,ak.hi),]
#Unadorned plot
plot(us.states.contig)
text(coordinates(us.states.contig),
us.states.contig@data[,paste0(STUSPS)],
cex=.7)
#scraped from government page
library(rvest) #only necessary to scrape table
electoral.college.url<-
paste0("http://www.archives.gov/federal-register/",
"electoral-college/allocation.html")
electoral.college.dt<-
(html(electoral.college.url) %>%
html_nodes("table"))[[5]] %>%
html_table()
setDT(electoral.college.dt)
setnames(electoral.college.dt,c("State","Votes"))
#merge into geodata
us.states.contig@data<-
copy(us.states.contig@data)[
electoral.college.dt,electoral.votes:=i.Votes,
on=c(NAME="State")]
#plot, coloring each state by size
states.ranked<-
us.states.contig@data[,rank(electoral.votes,
ties.method="first")]
cols<-colorRampPalette(c("red","blue"))(51)[states.ranked]
plot(us.states.contig,col=cols)
这一切都很好 - 瞥一眼这张地图,我们可以看出哪些州有高和低。选举团的代表性较低。但是如果(在我们的目标地图中)我们想要用状态颜色表示另一个变量呢?
#scrape again
#2012 Election Results by State
election.wiki<-
paste0("https://en.wikipedia.org/wiki/",
"United_States_presidential_election,_2012")
results<-
html(election.wiki) %>%
html_node(xpath='//*[@id="mw-content-text"]/div[22]/table') %>%
html_table()
#eliminate second header row, delete final row,
# keep only the important columns
results.trim<-results[2:(nrow(results)-1),c(1,4,21)]
colnames(results.trim)<-c("name","pct","abbr")
results.dt<-setDT(results.trim)
#data idiosyncrasies, see Wiki page
results.dt<-results.dt[!grepl("–",abbr)|grepl("a",abbr)]
results.dt[grepl("–",abbr),abbr:=gsub("–.*","",abbr)]
results.dt[,"pct":=as.numeric(gsub("%","",pct))]
#merge
us.states.contig@data<-
copy(us.states.contig@data
)[results.dt,vote.pct:=i.pct,
on=c(STUSPS="abbr")]
pcts<-us.states.contig@data[,vote.pct]
cols<-c("red","blue")[(pcts>=50)+1L]
tx.col<-c("white","black")[(cols=="red")+1L]
plot(us.states.contig,col=cols)
text(coordinates(us.states.contig),
us.states.contig@data[,paste0(STUSPS)],
col=tx.col)
最后一张图解决了问题的症结所在。从我们可以从地图的红色与蓝色的百分比来看,无论共和党人还是民主党赢了,我们可以感觉到第一张图表是非常优越的;最后一张地图具有误导性,因为大多数共和党国家也是人口最少的国家。
有没有办法制作这张地图的扭曲版本,它传达了每个州在选举团中的相对重要性?我在网上找不到任何帮助,可能主要是因为我不知道这种类型的图表是否有标准名称。
*找到了这张地图here;我以前见过类似尺寸失真的地图,例如在The Economist。它似乎是基于Dr. Sam Wang at Princeton's Election Consortium的工作,由Drew Thaler生成。
答案 0 :(得分:3)
根据软件包维护者@chkaiser的建议,我已经找到并最终在R中发现了一种方法。This blog post是一个巨大的帮助,getcartr
软件包非常棒。
首先,从GitHub获取Rcartogram
和getcartr
个包:
library(devtools)
install_github("omegahat/Rcartogram")
install_github('chrisbrunsdon/getcartr', subdir='getcartr')
library(Rcartogram)
library(getcartr)
现在简单地插上&amp;突突:
us.states.contig.carto <-
quick.carto(us.states.contig,
us.states.contig@data$electoral.votes)
plot(us.states.contig.carto, col = cols)
text(coordinates(us.states.contig.carto),
us.states.contig@data[ , paste0(STUSPS)],
col = tx.col)
就像我们有了我们的制图: