Region polygons not displaying in ggplot2 Choropleth map
我正在尝试使用ggplot2做一个非常基本的地图绘制。我找不到为什么彩色多边形无法显示的原因。看来我的代码与许多教程和本网站已回答的问题没有什么不同。我认为这可能来自于我准备数据的方式(请参见下面的100%可重现的示例)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | library(maptools) library(sp) library(ggplot2) library(rgeos) con <- url("http://biogeo.ucdavis.edu/data/gadm2/R/GHA_adm1.RData") print(load(con)) close(con) ghaDF<-as.data.frame(gadm) ghaDF$prod <- c(12, 26, 12,22,0,11,4,5,4,4) # add values for the regions to be colored with gadm@data$id = rownames(gadm@data) #create an id in the shapefile data ghaMap <- fortify(gadm, region="id") colnames(ghaDF[5])<-"id" ghaMap <- merge(ghaMap, ghaDF) m0 <- ggplot(data=ghaMap) m1 <- m0 + geom_polygon(aes(x=long, y=lat, fill = prod, group=group)) + scale_fill_gradient(low ="light green", high ="dark green") m2 <- m1 + geom_path(aes(x=long, y=lat, group=group),color='gray') + coord_equal() m2 |
在上图(
(R版本3.0.2-平台:x86_64-w64-mingw32 / x64(64位))
您的数据似乎很好。这是使用
1 2 3 4 5 6 7 8 9 | devtools::source_gist("https://gist.github.com/hrbrmstr/33baa3a79c5cfef0f6df") gg <- ggplot() gg <- gg + geom_map(data=ghaMap, map=ghaMap, aes(map_id=id, group=group, x=long, y=lat, fill=prod)) gg <- gg + scale_fill_gradient(low="#99d8c9", high="#00441b") gg <- gg + coord_map() gg <- gg + theme_map() + theme(legend.position="right") gg |
您可以省略
编辑使用简化的多边形
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | library(maptools) library(sp) library(ggplot2) library(rgeos) library(rgdal) # get the shapefile download.file("http://biogeo.ucdavis.edu/data/gadm2/shp/GHA_adm.zip","GHA_adm.zip") unzip("GHA_adm.zip", exdir="GHA_adm") # simplify it setwd("GHA_adm") system("ogr2ogr -simplify 0.001 simple1.shp GHA_adm1.shp") # simplify (500K -> 80K) setwd("..") # read it in gadm <- readOGR("GHA_adm","simple1") # convert it gadm_map <- fortify(gadm, region="NAME_1") # make the values we want to fill with # you can use"ID_1" but folks I've seen generally like using names. works either way prod <- data.frame(id=gadm$NAME_1, value=c(12, 26, 12, 22, 0, 11, 4, 5, 4, 4), stringsAs=FALSE) # merge the data together gadm_map <- merge(gadm_map, prod, all.x=TRUE) # add it right into the fortified data frame # plot it devtools::source_gist("https://gist.github.com/hrbrmstr/33baa3a79c5cfef0f6df") gg <- ggplot() gg <- gg + geom_map(data=gadm_map, map=gadm_map, aes(map_id=id, group=group, x=long, y=lat, fill=value)) gg <- gg + scale_fill_gradient(low="#99d8c9", high="#00441b") gg <- gg + coord_map() gg <- gg + theme_map() + theme(legend.position="right") gg |
(与上述相同的贴图,但边缘细节略有减少)
使用
1 2 3 4 5 6 7 | lsos() ## Type Size Rows Columns ## gadm_map data.frame 275256 5167 9 ## gadm SpatialPolygonsDataFrame 168296 10 9 ## gg gg 34792 9 NA ## prod data.frame 2136 10 3 |
与OP中的相同:
1 2 3 4 5 6 | ## Type Size Rows Columns ## ghaMap data.frame 3689120 31735 18 ## gadm SpatialPolygonsDataFrame 589424 10 11 ## gg gg 34792 9 NA ## ghaDF data.frame 5088 10 12 ## con url 552 1 NA |
您的问题非常简单。变更
1 | colnames(ghaDF[5])<-"id" |
到
1 | colnames(ghaDF)[5]<-"id" |
,您的代码会生成您想要的地图。
上面的第一行将
第二行提取
说了这么多,您的工作流程就有些折磨了。一方面,您要将
1 2 3 4 5 6 7 8 9 10 | load(url("http://biogeo.ucdavis.edu/data/gadm2/R/GHA_adm1.RData")) ghaMap <- fortify(gadm) ghaDF <- data.frame(id=rownames(gadm@data), prod=c(12,26,12,22,0,11,4,5,4,4)) ghaMap <- merge(ghaMap,ghaDF) ggplot(ghaMap, aes(x=long,y=lat,group=group))+ geom_polygon(aes(fill=prod))+ geom_path(color="gray")+ scale_fill_gradient(low ="light green", high ="dark green")+ coord_map() |