Umzug von Alaska und Hawaii auf die thematische Karte der USA mit ggplot2
Ich versuche, eine thematische Karte mit allen 50 US-Bundesstaaten zu erstellen, habe jedoch Probleme, Alaska und Hawaii zuverlässig zu verlagern. Ich habe ein paar Ideen, aber keine davon funktioniert gut. Ich werde sie jetzt demonstrieren.
Zuerst müssen wir die Daten importieren. unter Verwendung der Daten in dermaps
Paket ist nicht genug, weil es Hawaii und Alaska nicht enthält.
setwd(tempdir())
download.file("https://dl.dropbox.com/s/wl0z5rpygtowqbf/states_21basic.zip?dl=1",
"usmapdata.zip",
method = "curl")
# This is a mirror of http://www.arcgis.com/home/item.html?
# id=f7f805eb65eb4ab787a0a3e1116ca7e5
unzip("usmapdata.zip")
require(rgdal)
all_states <- readOGR("states_21basic/", "states")
require(ggplot2); require(maptools); require(rgeos); require(mapproj);
all_states <- fortify(all_states, region = "STATE_NAME")
Nun definieren wir eine Handlungsästhetik:
p <- ggplot() + geom_polygon(
aes(x=long, y=lat, group = group, fill = as.numeric(as.factor(id))),
colour="white", size = 0.25
) + coord_map(projection="azequalarea") +
scale_fill_gradient(limits = c(1,50))
Jetzt entfernen wir alle Hintergründe usw., damit sie nicht kollidieren, wenn wir die nicht zusammenhängenden Zustände überlappen:
p <- p + theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
plot.background=element_blank())
Ansichtsfenster verwendenDie erste Idee, die ich hatte, war die Verwendung von Ansichtsfenstern:
AK <- p %+% subset(all_states, id == "Alaska") + theme(legend.position = "none")
HI <- p %+% subset(all_states, id == "Hawaii") + theme(legend.position = "none")
contiguous <- p %+% subset(all_states, id != "Alaska" & id != "Hawaii")
grid.newpage()
vp <- viewport(width = 1, height = 1)
print(contiguous, vp = vp)
subvp1 <- viewport(width = 0.25, height = 0.25, x = 0.18, y = 0.33)
print(AK, vp = subvp1)
subvp2 <- viewport(width = 0.12, height = 0.12, x = 0.32, y = 0.27)
print(HI, vp = subvp2)
Dies sieht gut aus, ist jedoch nicht zufriedenstellend, da es sehr empfindlich auf geringfügige Änderungen in der Figur reagiert, z. B. Größenänderung oder Änderung der Größe und Form der Legende.
Alaska und Hawaii manuell bewegenall_states_AKHImoved <- within(all_states, {
lat[id == "Alaska"] <- lat[id == "Alaska"] - 45
long[id == "Alaska"] <- long[id == "Alaska"] + 40
lat[id == "Hawaii"] <- lat[id == "Hawaii"] + 0
long[id == "Hawaii"] <- long[id == "Hawaii"] + 70
})
p %+% all_states_AKHImoved
Dies ist nicht zufriedenstellend, da Alaska auf den meisten US-Karten normalerweise nicht maßstabsgetreu ist und daher sehr groß aussieht. Durch die Verlagerung von Alaska und Hawaii ändert sich auch die durch die Kartenprojektion verursachte Verzerrung.
FrageHat jemand bessere Ansätze?