2014-06-10 65 views
0

這是他已經討論過的問題的擴展here代碼沒有運行shp文件

運行

data <- structure(list(Row.Labels = c("Andhra Pradesh", "ASSAM", "Bihar", 
       "Chandigarh", "CHHATTISGARH", "DADRA & NAGAR HAVELI", "DAMAN & DIU", 
       "Delhi", "GOA", "GUJARAT", "Haryana", "Himachal", "Jharkhand", 
       "KARNATAKA", "KERALA", "MAHARASHTRA", "MANIPUR", "MEGHALAYA", 
       "MP", "Odissa", "PONDICHERRY", "Punjab", "Rajasthan", "TAMIL NADU", 
       "TRIPURA", "UP", "Uttrakhand", "WEST BENGAL"), LATITUDE = c(78.3, 
       91.5, 85.13, 76.79855, 81.63, 72.96667, 72.8064, 72.8064, 73.96992, 
       72.4, 75.95947, 75.95947, 85.33, 75.68481, 76.82739, 75.64087, 
       93.58, 91, 93, 77.21067, 79.82803, 75.5, 75.52, 88.4, 91.25, 
       91.25, 78.2, 88.24), LONGITUDE = c(17.200001, 26.09, 25.370001, 
       30.744196, 21.23, 20.266666, 20.25189, 20.25189, 15.384293, 23.030001, 
       29.017748, 29.017748, 23.35, 14.849231, 9.470736, 19.590844, 
       24.440001, 25.299999, 23.299999, 28.623932, 11.937899, 30.4, 
       26.549999, 27.200001, 23.5, 23.5, 30.110001, 22.34), MAJORITY = c("Yes", 
       "No", "No", "No", "No", "Yes", "No", "No", "Yes", "No", "No", 
       "No", "No", "Yes", "Yes", "Yes", "No", "No", "No", "No", "No", 
       "No", "No", "Yes", "No", "No", "No", "No")), .Names = c("Row.Labels", 
       "LATITUDE", "LONGITUDE", "MAJORITY"), class = "data.frame", row.names = c(NA, -28L)) 

library(raster); library(ggplot2) 
india <- getData('GADM', country="IND", level=1) 
f_india <- fortify(india) 
i <- sapply([email protected]$NAME_1, function(x) agrep(x, data$Row.Labels, max.distance=.3, ignore.case=T)[1]) 
[email protected]$maj <- data$MAJORITY[i] 
f_india <- merge(x=f_india, y=unique([email protected]), by.x="id", by.y="ID_1",all.x=T) 
f_india <- f_india[with(f_india, order(id, order)), ] # to prevent this https://stackoverflow.com/questions/24039621/code-not-working-for-other-shp-files 
ggplot(f_india, aes(x=long, y=lat, group=group, fill=maj)) + 
    geom_polygon(colour="black") 

當該圖出來是該代碼:India

當對SHP文件正在運行相同的代碼(從here第一連桿)

出來成爲: enter image description here

這是錯誤的!請使用shp文件幫助我獲得第一張地圖。

回答

2

代碼試圖匹配ID值和行號,這是脆弱的。我懷疑這些ID值是你可以依賴的跨越數據集的「官方」標識符。美國有一套「FIPS」標識符,您可以使用這些標識符在正確編碼的數據集中匹配州和縣等,但我在這裏看不到這樣的事情。 gadm數據有一個可能是某種東西的PID,但是你的數據集或者你指出的shape文件中沒有匹配的PID。

您唯一可以信賴的地方是地區名稱,而那些地區名稱有變化,使得確切匹配變得困難。

此外,不要嘗試強化東西,直到你的地圖對象中有一個額外的列與你想要映射的變量。至少你可以繪製並檢查它是否都在正確的位置。

一旦你與你的地圖和數據,那麼它的那麼容易,因爲對方同意列:

require(rgdal) 
ishape = readOGR(".","india_state") 
ishape$MAJORITY = factor(data$MAJORITY[match(tolower(ishape$NAME), tolower(data$Row.Labels))]) 
spplot(ishape, "MAJORITY") 

enter image description here

有很多空白區域的其中姓名唐即使在我把所有東西都壓縮到小寫之後,它們也不匹配。修復它們並重復。因爲你想要映射的東西已經存在於地圖數據中,所以用ggplot進行映射更直接。

你可以看到哪些是不匹配:

> unique(as.character([email protected][is.na(ishape$MAJORITY),"NAME"])) 
[1] "Daman(Daman&Diu)" "Sikkim"    "Himachalpradesh"  
[4] "Jammu & Kashmir"  "Rajastan"   "Madhya Pradesh"  
[7] "Uttaranchal"   "Uttar Pradesh"  "Mizoram"    
[10] "Arunachal Pradesh" "Nagaland"   "Orissa"    
[13] "Laksha Dweeps"  "Andaman and Nicobar" 

糾正這些(拉賈斯坦/拉賈斯坦邦等),你會得到一個更全面的地圖。

+0

謝謝!工作! – user2458552