2014-03-19 47 views
2

我正在嘗試創建一個除以州(沒有阿拉斯加和夏威夷)的美國地圖。每個國家都應該根據一個簡單的標準進行着色。 我有一個數據集與所有國家和價值表明投資。這是我的數據的第一原糖:着色我們狀態的錯誤[R]

  states investment 
    1  AL 5500000 
    2  AR 5000000 
    3  AZ 54947100 
    4  CA 3285330900 
    5  CO 135520000 
  • 如果投資等於0 (表示該數據集的缺失值),相應的國家應在白色着色。
  • 如果投資大於0且小於5500000,則相應的州應爲藍色。
  • 如果投資大於5500000,相應的州 應爲綠色。

我的數據組是上的excel文件,所以我使用了XLConnetc包在ř加載數據。然後,我創建了創建一個新的列來存儲顏色

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 

這只是2個錯誤顏色匹配的例子。 你對我可能錯了什麼有什麼建議嗎?

回答

1

問題是R中的內置數據庫有63個多邊形,而你的dati數據幀只有50個(或更少的??)行。因此,當您使用col=dati$colR時,會在行數不足時回收dati$col。不僅如此,dati中的行的順序按照州縮寫字母順序排列,而state數據庫中的多邊形順序按照州名的字母順序排列(或多或少)。所以你得到和你一樣多的協議純屬偶然。

polys <- map('state',plot=F,namesonly=T) 
length(polys) 
# [1] 63 
head(polys,5) 
# [1] "alabama"  "arizona"  "arkansas" "california" "colorado" 

注意,第一3行的dati是:AL,AR,AZ,這是從第一三個多邊形不同的順序

那麼爲什麼有63個多邊形?一些州擁有(大)島嶼,這些島嶼被視爲獨立的多邊形。這會產生一個新問題,因爲具有多個多邊形的狀態的「名稱」是非標準的。例如:

polys[substr(polys,1,8)=="new york"] 
# [1] "new york:manhattan" "new york:main" "new york:staten island" "new york:long island" 

因此,要創建合併字段,您需要解析這些奇怪的名稱。要做到這一點

一種方法是創建一個行的數據幀在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包,並與ggplot繪製的原因。