我试图绘制德国的等值线图,显示各州的贫困率(受这个问题的启发).
问题是,有些州(例如柏林)完全被其他州(勃兰登堡州)所包围,而且我很难让ggplot认出勃兰登堡的"洞".
此示例的数据在此处.
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()
Run Code Online (Sandbox Code Playgroud)

请注意柏林和勃兰登堡(东北部)的颜色是如何相同的.他们不应该 - 柏林的贫困率远远低于勃兰登堡州.似乎ggplot正在渲染柏林多边形,然后在其上渲染勃兰登堡多边形,没有洞.
如果我geom_polygon(...)按照这里的建议改变呼叫,我可以修复柏林/勃兰登堡问题,但现在三个最北端的状态都被错误地渲染了.
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()
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么??
jlh*_*ard 15
这只是对@ Ista答案的扩展,这并不需要知道哪个州(柏林,不来梅)需要最后呈现.
这种方法利用了fortify(...)生成列的事实,该列hole标识一组坐标是否是一个洞.因此,这使得所有区域(id )在没有孔的区域之前(例如在其下方)具有任何孔.
非常感谢@Ista,没有他的回答,我无法想出这个(相信我,我花了很多时间尝试......)
ggplot(map.df, aes(x=long, y=lat, group=group)) +
geom_polygon(data=map.df[map.df$id %in% map.df[map.df$hole,]$id,],aes(fill=poverty))+
geom_polygon(data=map.df[!map.df$id %in% map.df[map.df$hole,]$id,],aes(fill=poverty))+
geom_path(colour="grey50")+
scale_fill_gradientn(colours=brewer.pal(5,"OrRd"))+
labs(x="",y="")+ theme_bw()+
coord_fixed()
Run Code Online (Sandbox Code Playgroud)

您可以按照ggplot2 wiki上的示例在单独的图层中绘制岛多边形.我已修改您的合并步骤以使其更容易:
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, by="id")
ggplot(map.df, aes(x=long, y=lat, group=group)) +
geom_polygon(aes(fill=poverty), color = "grey50", data =subset(map.df, !Id1 %in% c("Berlin", "Bremen")))+
geom_polygon(aes(fill=poverty), color = "grey50", data =subset(map.df, Id1 %in% c("Berlin", "Bremen")))+
scale_fill_gradientn(colours=brewer.pal(5,"OrRd"))+
labs(x="",y="")+ theme_bw()+
coord_fixed()
Run Code Online (Sandbox Code Playgroud)

作为一种不请自来的传福音行为,我鼓励你考虑类似的事情
library(ggmap)
qmap("germany", zoom = 6) +
geom_polygon(aes(x=long, y=lat, group=group, fill=poverty),
color = "grey50", alpha = .7,
data =subset(map.df, !Id1 %in% c("Berlin", "Bremen")))+
geom_polygon(aes(x=long, y=lat, group=group, fill=poverty),
color = "grey50", alpha= .7,
data =subset(map.df, Id1 %in% c("Berlin", "Bremen")))+
scale_fill_gradientn(colours=brewer.pal(5,"OrRd"))
Run Code Online (Sandbox Code Playgroud)
提供背景和熟悉的参考点.