我正在尝试绘制德国的分区统计图,显示各州的贫困率(灵感来自这个问题 https://stackoverflow.com/questions/21651985/shapefile-to-produce-a-linked-micromap-in-r/21747782#21747782).
问题是某些州(例如柏林)完全被其他州(勃兰登堡)包围,并且我无法让 ggplot 识别勃兰登堡的“洞”。
这个例子的数据是here https://www.dropbox.com/s/c43k755aadvu2z6/germany.rar.
library(rgdal)
library(ggplot2)
library(RColorBrewer)
map <- readOGR(dsn=".", layer="germany3")
pov <- read.csv("gerpoverty.csv")
mrg.df <- data.frame(id=rownames(map@data),ID_1=map@data$ID_1)
mrg.df <- merge(mrg.df,pov, by="ID_1")
map.df <- fortify(map)
map.df <- merge(map.df,mrg.df[,c("id","poverty")], by="id")
ggplot(map.df, aes(x=long, y=lat, group=group)) +
geom_polygon(aes(fill=poverty))+
geom_path(colour="grey50")+
scale_fill_gradientn(colours=brewer.pal(5,"OrRd"))+
labs(x="",y="")+ theme_bw()+
coord_fixed()
请注意柏林和勃兰登堡(位于东北部)的颜色是如何相同的。他们不应该这样——柏林的贫困率比勃兰登堡低得多。看来 ggplot 正在渲染柏林多边形,然后在其上渲染勃兰登堡多边形,没有孔。
如果我将呼叫更改为geom_polygon(...)
按照建议here https://stackoverflow.com/questions/12033560/use-ggplot-to-plot-polygon-with-holes-in-a-city-map,我可以修复柏林/勃兰登堡问题,但现在最北端的三个州渲染不正确。
ggplot(map.df, aes(x=long, y=lat, group=group)) +
geom_polygon(aes(group=poverty, fill=poverty))+
geom_path(colour="grey50")+
scale_fill_gradientn(colours=brewer.pal(5,"OrRd"))+
labs(x="",y="")+ theme_bw()+
coord_fixed()
我究竟做错了什么??