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