descargar - Reubicación de Alaska y Hawaii en el mapa temático de EE. UU. Con ggplot2
ggplot2 histogram (3)
He aquí cómo hacerlo mediante la proyección y la transformación. Necesitará:
require(maptools)
require(rgdal)
fixup <- function(usa,alaskaFix,hawaiiFix){
alaska=usa[usa$STATE_NAME=="Alaska",]
alaska = fix1(alaska,alaskaFix)
proj4string(alaska) <- proj4string(usa)
hawaii = usa[usa$STATE_NAME=="Hawaii",]
hawaii = fix1(hawaii,hawaiiFix)
proj4string(hawaii) <- proj4string(usa)
usa = usa[! usa$STATE_NAME %in% c("Alaska","Hawaii"),]
usa = rbind(usa,alaska,hawaii)
return(usa)
}
fix1 <- function(object,params){
r=params[1];scale=params[2];shift=params[3:4]
object = elide(object,rotate=r)
size = max(apply(bbox(object),1,diff))/scale
object = elide(object,scale=size)
object = elide(object,shift=shift)
object
}
Luego lee en tu shapefile. Use rgdal
:
us = readOGR(dsn = "states_21basic",layer="states")
Ahora transfórmalo a un área igual y ejecuta la función de corrección:
usAEA = spTransform(us,CRS("+init=epsg:2163"))
usfix = fixup(usAEA,c(-35,1.5,-2800000,-2600000),c(-35,1,6800000,-1600000))
plot(usfix)
Los parámetros son rotaciones, escalado, desplazamiento xey para Alaska y Hawai, respectivamente, y se obtuvieron por ensayo y error. Ajústalos con cuidado. Incluso el cambio del parámetro de escala de Hawai a 0.99999 lo envió fuera del planeta debido a la gran cantidad de personas involucradas.
Si quieres regresar esto a lat-long:
usfixLL = spTransform(usfix,CRS("+init=epsg:4326"))
plot(usfixLL)
Pero no estoy seguro si necesita usar las transformaciones en ggplot
ya que lo hemos hecho con spTransform
.
Ahora puede saltar a través del ggplot2
fortalecer ggplot2
. No estoy seguro si es importante para usted, pero tenga en cuenta que el orden de los estados es diferente en la versión de usfix
: Alaska y Hawai son ahora los dos últimos estados.
Intento crear un mapa temático que muestre los 50 estados de EE. UU., Pero estoy teniendo problemas para trasladar Alaska y Hawai de manera confiable. Tengo un par de ideas, pero ninguna de ellas funciona bien. Los demostraré ahora.
Primero, necesitamos importar los datos; usar los datos en el paquete de maps
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 algunas estéticas de 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 todo el fondo, etc. para que no entren en conflicto cuando superponemos 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.
Manualmente moviendo 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 Alaska generalmente no escala en la mayoría de los mapas de EE. UU., Por lo que se ve muy grande. También la reubicación de Alaska y Hawaii cambia la distorsión introducida por la proyección del mapa.
Pregunta
¿Alguien tiene mejores enfoques?
Una vez que comience a cambiar las cosas de esta manera, simplemente represente Alaska y Hawai como cuadros cuadrados en algún lugar del Golfo de México. Tendría la ventaja adicional de poder decir de qué color era Hawaii.
Probablemente podrías ir hasta el final y usar un sistema distorsionado donde cada estado tenga el mismo área, entonces podrías ver Rhode Island.
Los ejemplos de Cartogram de EE. UU. En las imágenes de Google muestran el tipo de cosas. Sin embargo, no sé cuántos de ellos tienen shapefiles o datos con ellos.
¿Está realmente interesado en los tamaños relativos de los estados, o quiere una representación que permita a las personas ver cuál es el valor de un estado?
fiftystater
paquete fiftystater
R en CRAN para proporcionar una solución simple. Se basa en los pasos de la respuesta de Spacedman (sería un enlace pero insuficiente representante) y se publica como un marco de datos ggplot2::geom_map
ready shape llamado fifty_states
para eliminar la necesidad de instalar dependencias, rastrear un archivo de formas de origen o modificar los valores de elide .
library(ggplot2)
library(mapproj)
library(fiftystater)
crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)
p <- ggplot(crimes, aes(map_id = state)) +
geom_map(aes(fill = Assault), map = fifty_states) +
expand_limits(x = fifty_states$long, y = fifty_states$lat) +
coord_map()
p
El ruido de la trama se puede limpiar de la manera habitual, y también existe la función fifty_states_inset_boxes
en el paquete para agregar cuadros insertados:
p + scale_x_continuous(breaks = NULL) +
scale_y_continuous(breaks = NULL) +
labs(x = "", y = "") +
theme(panel.background = element_blank()) +
fifty_states_inset_boxes()