在ggplot中的等值线图与具有孔的多边形

jlh*_*ard 15 maps r ggplot2

我试图绘制德国的等值线图,显示各州的贫困率(受这个问题的启发).

问题是,有些州(例如柏林)完全被其他州(勃兰登堡州)所包围,而且我很难让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)


Ist*_*sta 9

您可以按照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)

提供背景和熟悉的参考点.