ggplot 中的等值线图,其中包含有孔的多边形

2024-03-15

我正在尝试绘制德国的分区统计图,显示各州的贫困率(灵感来自这个问题 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()

我究竟做错了什么??


这只是 @Ista 答案的扩展,它不需要知道哪些州(柏林、不莱梅)需要最后渲染。

这种方法利用了以下事实:fortify(...)生成一个列,hole它标识一组坐标是否是一个洞。所以这呈现all区域(id)与any在没有孔的区域之前(例如下面)有孔。

非常感谢@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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ggplot 中的等值线图,其中包含有孔的多边形 的相关文章

随机推荐