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 verwenden

Die 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 bewegen
all_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.

Frage

Hat jemand bessere Ansätze?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage