着色我们状态错误[R]

时间:2014-03-19 12:41:42

标签: r map colors

我试图创建一个按州划分的Us地图(没有阿拉斯加和夏威夷)。应根据简单标准对每个国家进行着色。 我有一个包含所有州的数据集和一个表明投资的值。这是我数据的第一个原始数据:

         states investment   
    1      AL    5500000  
    2      AR    5000000  
    3      AZ   54947100 
    4      CA 3285330900 
    5      CO  135520000
  • 如果投资等于0 (表示数据集缺失值),则相应的状态应为白色。
  • 如果投资大于0且小于5500000,则 相应的国家应涂成蓝色。
  • 如果投资大于550万,则对应国家 应该用绿色着色。

我的数据集位于 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

这只是错误配色的两个例子。 你对我可能出错的地方有什么建议吗?

1 个答案:

答案 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}}进行绘图的原因。