等值线在ggplot中映射有孔的多边形 [英] Choropleth map in ggplot with polygons that have holes

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

问题描述

我试图画出德国的全州地图,显示各州的贫困率(灵感来源于,我可以解决柏林/勃兰登堡问题,但是现在三个最北端的州都出现了错误。

  ggplot(map.df,aes(x = long,y = lat,group = group))+ 
geom_polygon(aes(group =贫穷,填充=贫穷))+
geom_path =grey50)+
scale_fill_gradientn(colors = 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< - 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 =贫穷),color =grey50,data = subset(map.df,!Id1%in%c(Berlin,Bremen)) )+
geom_polygon(aes(fill =贫穷),color =grey50,data = subset(map.df,%c(Berlin,Bremen))+
scale_fill_gradientn(colors = brewer.pal(5,OrRd))+
labs(x =,y =)+ theme_bw()+
coord_fixed()



作为一种不请自来的传福音行为,我鼓励你考虑类似于

  library(ggmap)
qmap(germany,zoom = 6)+
geom_polygon(aes(x = long,y =拉丁语,组=组,填充=贫穷),
color =grey50,alpha = .7,
data = subset(map.df,!Id1%in%c(Berlin, Bremen)))+
geom_polygon(aes(x = long,y = lat,group = group,fill =贫穷),
color =grey50,alpha = .7,
data = subset(map.df,%1%(柏林,不来梅))+
scale_fill_gradientn(colors = brewer.pal(5,OrRd))
code>

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


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天全站免登陆