为美国国家[R]着色时出错
我正在尝试创建一个按州划分的美国地图(没有阿拉斯加和夏威夷)。每个状态都应该基于一个简单的标准进行着色。 我有一个包含所有州的数据集和一个指示投资的值。这是我的第一份数据:为美国国家[R]着色时出错,r,map,colors,R,Map,Colors,我正在尝试创建一个按州划分的美国地图(没有阿拉斯加和夏威夷)。每个状态都应该基于一个简单的标准进行着色。 我有一个包含所有州的数据集和一个指示投资的值。这是我的第一份数据: states investment 1 AL 5500000 2 AR 5000000 3 AZ 54947100 4 CA 3285330900 5 CO 135520000
states investment
1 AL 5500000
2 AR 5000000
3 AZ 54947100
4 CA 3285330900
5 CO 135520000
- 如果投资等于0(表示数据集缺少值),则相应的状态应为白色李>
- 如果投资大于0且小于5500000,则 相应的状态应为蓝色
- 如果投资大于5500000,则相应的州 应该是绿色的
xlconnect
包在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"
}
}
现在,我使用新列(称为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
这只是两个错误配色的例子。
您对我可能的错误有什么建议吗?问题是,R中的
状态
内置数据库有63个多边形,而您的dati
数据框只有50行(或更少??)。因此,当您使用col=dati$col
R时,当数据行用完时,它会回收dati$col
。不仅如此,dati
中的行顺序是按州缩写字母顺序排列的,而state
数据库中的多边形顺序是按州名称字母顺序排列的(或多或少)。所以,你得到这么多的一致意见纯粹是偶然的
polys <- map('state',plot=F,namesonly=T)
length(polys)
# [1] 63
head(polys,5)
# [1] "alabama" "arizona" "arkansas" "california" "colorado"
因此,要创建合并字段,需要解析这些奇数名称
一种方法是为状态
数据库中的所有多边形创建一个包含行的数据框,基于公共字段将其与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)
库(地图)
#仅示例:使用状态缩写、名称和填充创建df
达蒂
polys[substr(polys,1,8)=="new york"]
# [1] "new york:manhattan" "new york:main" "new york:staten island" "new york:long island"
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)