Reubicación de Alaska y Hawai en el mapa temático de EE. UU. Con ggplot2

Estoy tratando de crear un mapa temático que muestre los 50 estados de EE. UU., Pero tengo problemas para reubicar Alaska y Hawái de manera confiable. Tengo un par de ideas pero ninguna de ellas funciona bien. Los demostraré ahora.

Primero necesitamos importar los datos; usando los datos en elmaps el paquete no es suficiente porque no incluye Hawai y Alaska.

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

Ahora definimos una estética de la trama:

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

Ahora eliminamos todos los fondos, etc., para que no se confundan cuando se superponen los estados no contiguos:

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

La primera idea que tuve fue usar viewports:

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)

Esto se ve bien, pero no es satisfactorio porque es muy sensible a pequeños cambios en la figura, por ejemplo, cambio de tamaño o cambios en el tamaño y la forma de la leyenda.

Moviendo manualmente Alaska y Hawaii
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

Esto no es satisfactorio porque, por lo general, Alaska no está a escala en la mayoría de los mapas de los EE. UU. Además, la reubicación de Alaska y Hawai cambia la distorsión introducida por la proyección del mapa.

Pregunta

¿Alguien tiene mejores enfoques?

Respuestas a la pregunta(3)

Su respuesta a la pregunta