Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为美国国家[R]着色时出错_R_Map_Colors - Fatal编程技术网

为美国国家[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,则相应的州 应该是绿色的
我的数据集位于一个excel文件中,因此我使用
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)