我试图创建一个按州划分的Us地图(没有阿拉斯加和夏威夷)。应根据简单标准对每个国家进行着色。 我有一个包含所有州的数据集和一个表明投资的值。这是我数据的第一个原始数据:
states investment
1 AL 5500000
2 AR 5000000
3 AZ 54947100
4 CA 3285330900
5 CO 135520000
我的数据集位于 excel 文件中,因此我使用XLConnetc
包在 R 中加载数据。然后我创建了一个脚本,用于创建一个新列来存储颜色
dati["col"] <- NA
for (i in 1:48){
if(dati$investment[i] >0 && dati$investment[i] <= 5500000){
dati$col[i] <- "blue"
}
if(dati$investment[i] > 5500000){
dati$col[i] <- "green"
}
if(dati$investment[i] == 0){
dati$col[i] <- "white"
}
}
我的新数据集现在是:
states investment col
1 AL 5500000 blue
2 AR 5000000 blue
3 AZ 54947100 green
4 CA 3285330900 green
现在,我使用新列(名为dati$col
)来为地图着色。要创建地图我使用
map("state", lty=1, lwd=1, fill=TRUE, boundary=TRUE, col = dati$col)
我注意到地图有些问题。例如:格鲁吉亚应该是绿色的,而在我的地图中是蓝色的;或者南卡罗来纳州应该是绿色的,而不是在地图上是白色的
states investment col
9 GA 46008000 green
38 SC 14000000 green
这只是错误配色的两个例子。 你对我可能出错的地方有什么建议吗?
答案 0 :(得分:1)
问题是R中的state
内置数据库有63个多边形,而你的dati
数据框只有50(或更少??)行。因此,当用完col=dati$col
时,如果用完dati$col
R再循环dati
。不仅如此,state
中行的顺序按州名缩写为字母顺序,而polys <- map('state',plot=F,namesonly=T)
length(polys)
# [1] 63
head(polys,5)
# [1] "alabama" "arizona" "arkansas" "california" "colorado"
数据库中多边形的顺序按州名(或多或少)按字母顺序排列。因此,你得到的协议与你所做的一样纯粹是偶然的。
dati
请注意,polys[substr(polys,1,8)=="new york"]
# [1] "new york:manhattan" "new york:main" "new york:staten island" "new york:long island"
的前3行是:AL,AR,AZ,它们与前三个多边形的顺序不同。
那么为什么有63个多边形?有些州有(大)岛屿,被视为单独的多边形。这会产生一个新问题,因为&#34; name&#34;具有多个多边形的状态是非标准的。例如:
state
因此,要创建合并字段,您需要解析这些奇怪的名称。
执行此操作的一种方法是为dati
数据库中的所有多边形创建一个包含行的数据框,根据公共字段将其与library(maps)
# example only: create df with state abbr, name, and population
dati <- data.frame(state=state.abb,
name=tolower(state.name),
population=state.x77[,"Population"],
stringsAsFactors=F)
dati[dati$population<1000,]$population <- 0 # artificial zeros
# color by population, similar to OP's use case
dati$col <- "green" # most populous
dati[dati$population < 5000,]$col <- "blue" # moderately populous
dati[dati$population == 0,]$col <- "white" # least populous
polygons <- data.frame(polyName=map("state",plot=F,namesonly=T))
polygons$id <- 1:nrow(polygons) # need this to restore original order
polygons$name <- gsub("(:+[a-z\ \']+)","",polygons$polyName)
polygons <- merge(polygons,dati, all.x=T) # append color info
polygons <- polygons[order(polygons$id),] # restore original order
map('state',fill=T,col=polygons$col)
合并,将结果归入原始顺序,并将其用于颜色。这是一个巨大的头痛。
rgdal
这正是我建议将实际shapefile与ggplot
包一起使用,并使用{{1}}进行绘图的原因。