ggplot 中的等值线图,带有孔的多边形 [英] Choropleth map in ggplot with polygons that have holes

查看:23
本文介绍了ggplot 中的等值线图,带有孔的多边形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试绘制显示各州贫困率的德国等值线图(灵感来自 ,我可以解决柏林/勃兰登堡问题,但现在最北端的三个州渲染不正确.

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()

我做错了什么??

解决方案

您可以按照 ggplot2 wiki.我已经修改了您的合并步骤以使其更容易:

mrg.df <- data.frame(id=rownames(map@data),ID_1=map@data$ID_1)mrg.df <-合并(mrg.df,pov, by="ID_1")map.df <- 强化(地图)map.df <-合并(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()

作为一种主动传福音的行为,我鼓励您考虑类似的事情

库(ggmap)qmap("德国", zoom = 6) +geom_polygon(aes(x=long, y=lat, group=group, fill=poverty),颜色 = "grey50", alpha = .7,数据 =subset(map.df, !Id1 %in% c("Berlin", "Bremen")))+geom_polygon(aes(x=long, y=lat, group=group, fill=poverty),颜色 = "grey50", alpha = .7,数据=子集(map.df,Id1 %in% c(柏林",不来梅")))+scale_fill_gradientn(颜色=brewer.pal(5,OrRd"))

提供上下文和熟悉的参考点.

I'm trying to draw a choropleth map of Germany showing poverty rate by state (inspired by this question).

The problem is that some of the states (Berlin, for example) are completely surrounded by other states (Brandenburg), and I'm having trouble getting ggplot to recognize the "hole" in Brandenburg.

The data for this example is here.

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()

Notice how the colors for Berlin and Brandenburg (in the northeast) are identical. They shouldn't be - Berlin's poverty rate is much lower than Brandenburg. It appears that ggplot is rendering the Berlin polygon and then rendering the Brandenburg polygon over it, without the hole.

If I change the call to geom_polygon(...) as suggested here, I can fix the Berlin/Brandenburg problem, but now the three northernmost states are rendered incorrectly.

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()

What am I doing wrong??

解决方案

You can plot the island polygons in a separate layer, following the example on the ggplot2 wiki. I've modified your merging steps to make this easier:

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()

As an unsolicited act of evangelism, I encourage you to consider something like

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"))

to provide context and familiar reference points.

这篇关于ggplot 中的等值线图,带有孔的多边形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆