Choropleth map in ggplot with polygons that have holes

ggplot2, maps, r

Solution

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.

Problem

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??

Original source

Related problems