2014-06-10 135 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