Está en la página 1de 40

9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

LECCIÓN 3

Creating Static Maps in R

Esta lección fue escrita por Sean Angiolillo y se actualizó por última vez el 29 de enero de 2019.

En la lección anterior , exploramos brevemente la estructura de los marcos de datos espaciales definidos por el sf paquete. El
siguiente paso es la visualización, o más específicamente en el caso de datos geoespaciales, mapeo. Al igual que con
cualquier tipo de datos, la visualización es un paso importante antes de sumergirse en cualquier tipo de análisis estadístico.

Esta lección presenta cómo utilizar algunos de los paquetes R más conocidos para crear mapas estáticos, como tmap y
ggplot2 . También exploraremos algunos otros paquetes como cartogram , geogrid y geofacet para algunas visualizaciones
espaciales más únicas. (Abordaremos la creación de mapas animados e interactivos en la próxima lección ).

Recursos para visualizar datos geoespaciales


Antes de sumergirse en diferentes paquetes de R para el mapeo, revisemos algunos recursos excelentes que lo ayudarán a
comenzar.

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 1/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

A continuación se presentan dos excelentes recursos de código abierto sobre los principios de visualización de datos. Ambos
incluyen capítulos sobre visualización de datos geoespaciales.

Visualización de datos: Una introducción práctica por Kieran Healy. (Esto incluso incluye un capítulo dedicado en mapas .)

Fundamentos de la visualización de datos por Claus O. Wilke

Aquí hay dos recursos enfocados más estrechamente en la mecánica del mapeo específicamente en R, en lugar de principios
más amplios de buen diseño:

Capítulo "Haciendo mapas con R" de la mencionada anteriormente Geocomputación con R

El tutorial de Bhaskar V. Karambelkar en useR 2017 sobre "Visualización de datos geoespaciales en R"

Elegir la visualización correcta


Los recientes avances en software han hecho que muchos tipos diferentes de visualizaciones de datos geoespaciales, como
coropletas, mapas de densidad de puntos y cartogramas, estén fácilmente disponibles. Sin embargo, la visualización correcta
a menudo comienza con el tipo de datos que tiene.

Antes de elegir una visualización, debemos estar seguros de la naturaleza de nuestros datos. ¿Son los datos numéricos? Y si
es así, ¿es un recuento sin procesar, como la población, o está estandarizado, como la densidad de la población? Si los datos
no son numéricos, ¿son nominales (o categóricos), como los datos lingüísticos o religiosos, u ordinales, como las
clasificaciones de satisfacción?

Un punto que Healy deja claro en su libro es que es importante considerar si una visualización verdaderamente geoespacial
es la mejor opción para sus datos. En nuestro caso, y en muchos casos con respecto a las coropletas, los datos son solo
geoespaciales, en realidad representan recuentos de algún valor en una unidad arbitraria.

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 2/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

El objeto espacial que creamos en la lección anterior tiene atributos como población, PIB y proporción de sexos. Ciertamente
es posible visualizar estos datos a través de gráficos de barras, ignorando las cualidades geoespaciales de los datos.
Alternativamente, en lugar de ignorar los elementos geoespaciales, podríamos mostrar parte de esta información a través de
un proxy, por ejemplo, asignando diferentes colores a una variable como la región.

De hecho, centrarse en los elementos geoespaciales a veces puede tergiversar los datos debido a áreas muy desiguales entre
las diferentes regiones y las poblaciones que poseen, como es el caso de los estados de la India. Si estuviéramos trabajando
con datos a nivel de distrito (en lugar de a nivel estatal), entonces podría ser necesario un coropleto porque no podemos
mostrar cientos de barras en una sola gráfica de barras.

Sin embargo, debido a su simplicidad, usaremos datos a nivel estatal para probar diferentes enfoques para la visualización
geoespacial. Con este objetivo en mente, es de esperar que ninguna de las visualizaciones a continuación sean "malas", pero
si son o no la "mejor" visualización de estos datos dependería de los objetivos específicos a la mano.

Mapas estáticos
Aunque varios paquetes de R han facilitado la creación de atractivos mapas interactivos y animados, no han eliminado la
necesidad de contar con mapas estáticos efectivos. Esta sección analiza cómo crear mapas estáticos en la base R tmap , y
ggplot2 .

NOTA:
Si bien tmap y ggplot2 son dos de los paquetes más populares para crear mapas, no son las únicas opciones. El
cartography paquete es otra herramienta interesante, en particular para ciertos tipos de mapas, como las coropletas
contenidas en símbolos proporcionales. Consulte la viñeta del paquete y la hoja de trucos para comenzar.

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 3/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Trazado de base
Como se demostró en los diagramas de geometría de la lección anterior , el sf paquete proporciona un plot() método para
visualizar datos geográficos. El trazado del objeto en sí mismo producirá una cuadrícula de gráficos facetados, uno para cada
atributo. La elección de una variable produce un solo mapa.

library(tidyverse)
library(sf)
simp_sf <- readRDS("simp_sf.rds")
plot(simp_sf['pop_2011'])

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 4/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Esta gráfica muestra lo rápido y fácil que pueden ser los mapas base de trazado, pero hay razones por las que este coroplete
predeterminado puede no ser una visualización efectiva. Con suerte, al final de esta lección, estará claro por qué y qué otros
tipos de visualización pueden ser más efectivos en este caso.

Mapas tematicos (tmap)


El tmap paquete de Martijn Tennekes ha sido un portador estándar para la asignación en R durante algún tiempo. Como
sugiere el nombre "temático", es especialmente adecuado para coropletas, pero puede producir una amplia gama de
visualizaciones geoespaciales.

ggplot2 Aporta una sintaxis de estilo adaptada a los datos geoespaciales. Al igual que ggplot2 , enfatiza la adición
secuencial de capas a un trazado. Puede pasar un marco de datos espacial a la tm_shape() función de manera muy similar a
como pasaría un marco de datos a la ggplot() función.

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 5/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Además, dado que los marcos de datos espaciales en el sf paquete también son marcos de datos, puede filtrar cualquier
característica en particular (como "Islas Andaman y Nicobar" a continuación) y proceder directamente a canalizar el objeto
en una tm_shape() cadena.

APRENDE MÁS:
Las guías para ajustar otros aspectos del mapa se pueden encontrar en la documentación , que incluye una serie de
tutoriales y viñetas.

Después de filtrar los territorios de la unión, las coropletas de abajo mapean la densidad del PIB de la India, una medida de la
actividad económica por área. Medida aquí en unidades de PIB nominal por kilómetro cuadrado, la densidad del PIB no tiene
un punto medio claro, por lo que requiere una escala de color secuencial en lugar de una escala de color divergente o
categórica.

library(tmap)
simp_sf %>%
filter(!state_ut %in% c("Andaman & Nicobar Islands", "Lakshadweep")) %>%
tm_shape() +
tm_fill(col = "pop_2011", title = "No. People") +
tm_borders(lwd = 0.5) +
tm_text("abb", size = 0.5) +
tm_style("gray") +
tm_layout(
main.title = "Population (2011)",
main.title.position = c("center"),
main.title.size = 1,
legend.position = c("right", "bottom")
) +
tm_credits("Data:\n2011 Census", position = c("left", "bottom"))

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 6/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 7/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

APRENDE MÁS:
Existe una gran cantidad de teorías y consejos sobre el uso del color en la visualización de datos, incluidos los mapas. El
libro de Wilke, en particular, tiene excelentes capítulos sobre escalas de color y trampas de color .

Organización de objetos tmap

tmap También tiene una función útil tmap_arrange() , para alinear múltiples tmap objetos uno al lado del otro.

Por ejemplo, si filtramos los territorios de pequeños sindicatos para obtener una distribución más justa, podemos crear por
separado tmap objetos de crecimiento y densidad de la población. Luego podemos organizarlos uno al lado del otro para la
comparación.

Al igual que la densidad del PIB, los valores como el crecimiento de la población y la densidad de la población son datos
estandarizados, por lo que son adecuados para un coroplete.

states_sf <- simp_sf %>%


filter(!type == "Union Territory")

growth <- tm_shape(states_sf) +


tm_fill(col = "decadal_growth", title = "Percentage") +
tm_borders(lwd = 0.5) +
tm_layout(
main.title = "Population Growth of States (2001-2011)",
main.title.position = c("center"),
main.title.size = 1,
legend.position = c("right", "bottom")
) +
tm_credits("Data:\n2001-2011 Census", position = c("left", "bottom"))

density <- tm_shape(states_sf) +


tm_fill(col = "density_km2", title = "No. People / Sq Km",
palette = "YlGnBu") +
https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 8/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

tm_borders(lwd = 0.5) +
tm_layout(
main.title = "Population Density of States (2011)",
main.title.position = c("center"),
main.title.size = 1,
legend.position = c("right", "bottom")
) +
tm_credits("Data:\n2011 Census", position = c("left", "bottom"))

tmap_arrange(growth, density)

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 9/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 10/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

APRENDE MÁS:
La guía de cartografía de Axis Maps aborda directamente la cuestión de la estandarización de los datos con respecto a
los datos geoespaciales.

Inserción de mapas

tmap también es particularmente útil para crear mapas de inserción , aquellos que incluyen una pequeña ventana que
proporciona el contexto geográfico más amplio para el mapa principal.

El primer paso es crear un mapa base o primario. Hemos hecho esto para la proporción de sexos en el noreste de la India.

NOTA:
Un truco de tmap_tricks() es invertir la escala de color colocando un - frente al nombre de la paleta. Esto tiene sentido
porque nuestra preocupación debería aumentar a medida que disminuye la proporción de sexos.

ne_sex <- simp_sf %>%


filter(region == "Northeastern") %>%
tm_shape() +
tm_fill(col = "sex_ratio", title = "Sex Ratio", palette = "-Reds") +
tm_borders(lwd = 0.5) +
tm_text('state_ut', size = 0.75) +
tm_layout(
main.title = "Sex Ratio in India's Northeast",
main.title.position = c("center"),
main.title.size = 1
) +
tm_credits("Data Source: Wikipedia", position = c("left", "top"))

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 11/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

A continuación, creamos el mapa de inserción más pequeño, que proporcionará el contexto geográfico más amplio. Para el
mapa pequeño, quisimos resaltar la región Noreste en el mapa más grande de la India.

Para hacer esto, primero agrupamos las características por región. Usando la misma dplyr sintaxis, podemos reducir las 36
funciones a 8 regiones.

Estas 8 características regionales tienen una geometría que refleja la "suma" de sus subcomponentes individuales. Es
bastante interesante que este tipo de operación geométrica se pueda hacer tan fácilmente usando st_unify() detrás de
escena.

regional_sf <- simp_sf %>%


group_by(region) %>%
summarise(pop = sum(pop_2011))

inset <- regional_sf %>%


filter(!region == "Arabian Sea",
!region == "Bay of Bengal") %>%
mutate(northeast = ifelse(region == "Northeastern", TRUE, FALSE)) %>%
tm_shape() +
tm_fill(col = "northeast", palette = c("grey", "red")) +
tm_style("cobalt") +
tm_legend(show = FALSE)

Una vez que tengamos un mapa de base y un mapa de inserción, podemos combinarlos con la siguiente sintaxis, utilizando
algunas pruebas y errores para obtener la ubicación correcta.

library(grid)
ne_sex
print(inset, vp = viewport(0.24, 0.18, width = 0.2, height = 0.4))

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 12/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Mapas Facetados
https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 13/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

tmap También soporta la creación de mapas facetados , o pequeños múltiplos. Pueden ser útiles para atributos con un
número bastante pequeño de niveles. Por ejemplo, si tenemos datos de población durante algunos años, podríamos mostrar
una progresión en el tiempo. En este caso, la región es una variable útil para facetar. Dividir un mapa por región a veces puede
resaltar los contrastes mejor que mirar una imagen de toda el área.

El free.coords argumento controla si se muestra solo el área del mapa facetado o si se resalta el lugar de la faceta en el
mapa original.

No hay un orden inherente a las regiones, pero es útil imponer una. A continuación, hemos ordenado las facetas en un orden
aproximado en sentido contrario a las agujas del reloj a partir de "Northern". Para hacer esto, ayuda hacer primero region un
factor ordenado.

También es importante prestar atención a la naturaleza de la distribución antes de realizar cualquier trama. En India, el PIB
per cápita está muy sesgado debido a valores atípicos como Goa y Delhi. Si asigna estos datos en una escala lineal, la mayoría
de los estados pueden obtener el mismo color. Esto ocultará importantes diferencias en la mayor parte de los datos.

Si tiene datos muy sesgados, puede ser útil realizar una transformación logarítmica. Esto debería agregar una mayor
diferenciación de color en el mapa, aunque la leyenda puede requerir una interpretación más cuidadosa porque los
contenedores de color no tienen el mismo ancho.

APRENDE MÁS:
Para obtener más información sobre las transformaciones estadísticas en el contexto de la visualización de datos,
consulte la Sección 8.2 del libro de Wilke.

# create custom labels for log scale


gdp_seq <- 10 ^ (seq(2.8, 4.0, by = 0.2))
gdp_vec <- scales::dollar(round(gdp_seq))

my_labels = vector(mode = "character", length = 6)


https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 14/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

for (i in seq_along(1:6)) {
my_labels[i] = str_c(gdp_vec[i], " to ", gdp_vec[i + 1])
}

simp_sf %>%
mutate(
log_pc_usd = log10(per_capita_gdp_usd),
region_fac = factor(region, levels = c("Northern", "Western", "Southern",
"Central", "Eastern", "Northeastern",
"Arabian Sea", "Bay of Bengal"))
) %>%
filter(!state_ut %in% c("Andaman & Nicobar Islands",
"Lakshadweep")) %>%
tm_shape() +
tm_borders(lwd = 0.5, col = "white") +
tm_fill(col = 'log_pc_usd', title = '', palette = "viridis",
labels = my_labels) +
tm_facets(by = "region_fac", nrow = 2, free.coords = TRUE) +
tm_layout(
main.title = "Per Capita GDP by Region",
main.title.size = 1,
main.title.position = "center",
legend.outside.position = "right"
)

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 15/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

En el ejemplo anterior, log10() se espera que una transformación haya alcanzado un mayor nivel de diferenciación. Puede,
por ejemplo, diferenciar entre los pequeños puntos amarillos brillantes de Goa y Delhi, el azul de Uttar Pradesh y Jharkhand,

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 16/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

la turquesa de la India Central y Rajasthan, y el verde del sur de la India.

NOTA:
El free.cords argumento de tm_facets() se establece en TRUE . Si se configurara en su lugar FALSE , el mapa completo
de India aparecería en cada faceta con la región seleccionada resaltada.

Mapas de símbolos proporcionales

Hasta ahora, todos nuestros mapas han sido coropletas. Esto fue conveniente porque nuestros datos siempre fueron
estandarizados de alguna manera, por ejemplo, una densidad, porcentaje o proporción. Sin embargo, las coropletas no son
adecuadas para los datos de recuento en bruto. Cuando se trata de datos de conteo, como la población, un mapa de
símbolos proporcionales puede ser más efectivo.

Afortunadamente, tmap también es adecuado para este tipo de visualizaciones. Aquí, un símbolo (típicamente un círculo) se
dibuja en proporción a la variable representada en la parte superior de la geografía original. Podemos usar este tipo de mapa
para visualizar tanto la población como los datos del PIB nominal.

pop_bubbles <- simp_sf %>%


tm_shape() +
tm_polygons() +
tm_bubbles(col = "gold", size = "pop_2011",
scale = 3, title.size = "") +
tm_text("abb", size = "pop_2011", root = 5,
legend.size.show = FALSE) +
tm_layout(
main.title = "Population (2011)",
main.title.position = c("center"),
main.title.size = 1,
legend.position = c("right", "bottom")
)

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 17/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

gdp_bubbles <- simp_sf %>%


tm_shape() +
tm_polygons() +
tm_bubbles(col = "gold", size = "nominal_gdp_usd",
scale = 3, title.size = "") +
tm_text("abb", size = "nominal_gdp_usd", root = 5,
legend.size.show = FALSE) +
tm_layout(
main.title = "Nominal GDP (USD)",
main.title.position = c("center"),
main.title.size = 1,
legend.position = c("right", "bottom")
)

tmap_arrange(pop_bubbles, gdp_bubbles)

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 18/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

El mapa de símbolos proporcionales conserva la geografía original, solo oculta por la capa superior de símbolos. Los símbolos
conservan la disposición espacial correcta y son fáciles de interpretar en relación entre sí. Sin embargo, juzgar el área de los

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 19/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

círculos es más difícil que en comparación con una representación no espacial, como una gráfica de barras.

geom_sf en ggplot2
Esperemos que estos ejemplos hayan demostrado que tmap es una herramienta de mapeo robusta. Al mismo tiempo, la
adición de geom_sf ha hecho ggplot2 otra opción atractiva.

ggplot2 Requiere datos ordenados. Dado que los marcos de datos espaciales definidos en el sf paquete son marcos de
datos, tiene sentido que podamos utilizar ggplot2 para visualizar sf objetos. Recientemente, se ggplot2 agregó soporte para
sf objetos con geom_sf() . La ventaja clave geom_sf() es que los usuarios de Tidyverse ya están familiarizados con
ggplot2 su ecosistema más amplio de paquetes complementarios.

Sin embargo, como se trata de una adición reciente, puede esperar algunos errores. Por ejemplo, en el tmap objeto facetado
anterior , la configuración free.coords = FALSE permitió que todo el objeto se trazara en cada faceta. En este momento, el
facetado de un sf geom no parece permitir la configuración scales = "free" para permitir un resultado similar.

Sin embargo, hay muchos beneficios y casos en los que podemos visualizar sf objetos ggplot2 . Por ejemplo, los
ggplot2 usuarios estarán familiarizados con el proceso de mapeo de datos desde marcos de datos a estética, y sobreponer
marcos de datos adicionales sobre un diagrama. Ese mismo flujo de trabajo se mantiene para trazar sf objetos.

En la gráfica a continuación, queremos agregar solo el nombre del estado "Kerala" al mapa. Podríamos haberlo hecho con la
annotate() función, pero en lugar de eso, creamos un sf objeto (también un marco de datos) que contiene solo la función
que queríamos anotar (Kerala).

Sin embargo, para hacer esto con éxito, primero debemos encontrar el centro geográfico de Kerala para saber el punto desde
el cual dibujar la etiqueta. Las operaciones geométricas como el cálculo de los centroides, los búferes y la distancia requieren
un CRS proyectado en lugar de un CRS geográfico, por lo que lo hemos hecho a continuación st_transform() .

Con un CRS geográfico, st_centroid() produce un resultado, pero produce una advertencia de que " st_centroid no
proporciona los centroides correctos para los datos de longitud / latitud" porque asume que los atributos son constantes sobre
https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 20/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

las geometrías. La distancia entre longitudes largas, sin embargo, cambia en función de su latitud dada. (Piense en la
distancia entre las longitudes en el ecuador y en el Polo Norte).

La pregunta entonces es elegir un CRS proyectado apropiado. La visualización crs_data = rgdal::make_EPSG() muestra miles
de opciones. También se realizaron búsquedas de "India" en EPSG.io . Finalmente, elegimos un CRS con el código EPSG 24343,
que señala "# Kalianpur 1975 / UTM zone 43N" ya que la zona UTM 43N cubre Kerala. (También puede encontrar útil el
Asistente de proyección ).

Usando este CRS, pudimos usarlo st_transform() para proyectar ambos sf objetos en el mismo CRS proyectado. Una vez
hecho esto, podríamos agregar la etiqueta de Kerala usando geom_text_repel() como haríamos normalmente ggplot2 .

library(ggplot2)
library(ggrepel)

proj_sf <- simp_sf %>%


st_transform(crs = 24343) %>%
mutate(
CENTROID = purrr::map(geometry, st_centroid),
COORDS = purrr::map(CENTROID, st_coordinates),
COORDS_X = purrr::map_dbl(COORDS, 1),
COORDS_Y = purrr::map_dbl(COORDS, 2)
)

kerala <- proj_sf %>%


filter(state_ut == "Kerala")

proj_sf %>%
filter(!state_ut %in% c("Daman & Diu", "Dadra & Nagar Haveli")) %>%
ggplot() +
geom_sf(aes(fill = sex_ratio), lwd = 0) +
geom_sf(fill = NA, color = "grey", lwd = 0.5) +
scale_fill_viridis_c("Sex Ratio", labels = scales::comma, option = "A") +
labs(
title = "Sex Ratio across Indian States",
caption = "Source: Wikipedia"
) +

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 21/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

geom_text_repel(
data = kerala,
mapping = aes(x = COORDS_X, y = COORDS_Y, label = state_ut),
nudge_x = -0.5,
nudge_y = -1
) +
scale_y_continuous(NULL) +
scale_x_continuous(NULL) +
theme(plot.title = element_text(hjust = 0.5)) +
# remove graticules
coord_sf(datum = NA) +
theme_void()

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 22/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Mapas de densidad de puntos


https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 23/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Los mapas de símbolos proporcionales no son la única opción para los datos de conteo en bruto. Un mapa de densidad de
puntos puede ser una herramienta efectiva para visualizar espacialmente los datos de conteo, particularmente cuando su
objetivo es encontrar grupos y patrones regionales en lugar de valores de datos exactos.

A continuación hemos creado un gráfico de densidad de puntos que compara poblaciones rurales y urbanas. Para hacer esto,
primero, partimos de un formato de datos ordenados gather() y datos de población urbana y rural. Luego usamos la
st_sample() función para dibujar puntos de muestra basados en los datos de población urbana y rural respectivos para cada
observación.

Este tipo de visualización sería mucho más efectivo si tuviéramos datos en niveles más pequeños de administración, como
los distritos. En cambio, debido a que estamos muestreando a nivel estatal, nuestros puntos se colocarán en ubicaciones
contrarias a la densidad de población real. Por ejemplo, la población urbana de Maharashtra se distribuirá aleatoriamente en
todo el estado en lugar de agruparse en áreas metropolitanas como Mumbai. Sin embargo, sigue siendo útil ver cómo se
puede crear dicho mapa.

# save geometry
proj_geometry <- proj_sf %>% select(state_ut)

# gather data and rejoin geometry


pop_gathered <- proj_sf %>%
st_set_geometry(NULL) %>%
select(state_ut, rural_pop, urban_pop) %>%
gather(key = "pop", value = "count", -state_ut) %>%
arrange(state_ut) %>%
left_join(proj_geometry) %>%
st_as_sf()

# create a list of urban and rural populations


pop_split <- pop_gathered %>% split(.$pop)

# draw 1 dot per 1 lakh people


generate_samples <- function(data) {
st_sample(data, size = round(data$count / 1e5))
}

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 24/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

# generate samples for each and combine


points <- map(pop_split, generate_samples)
points <- imap(points, ~st_sf(tibble(
pop = rep(.y, length(.x))),
geometry = .x))
points <- do.call(rbind, points)

# group points into multipoints


points <- points %>%
group_by(pop) %>%
summarise()

# plot with ggplot


points %>%
ggplot() +
geom_sf(data = simp_sf) +
geom_sf(aes(color = pop, fill = pop),
size = 0.1, alpha = 0.4) +
scale_fill_discrete("Population", labels = c("Rural", "Urban")) +
labs(
title = "Density of India's Urban and Rural Population (2011)",
caption = "1 dot = 1 lakh people"
) +
theme(plot.title = element_text(hjust = 0.5)) +
coord_sf(datum = NA) +
theme_void() +
guides(color = FALSE)

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 25/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Si bien no podemos ver grupos de población alrededor de los metros, todavía podemos ver áreas relativamente escasamente
pobladas (Jammu y Cachemira y el noreste), el extremadamente denso cinturón rural de Uttar Pradesh y Bihar, y el

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 26/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

relativamente más urbano sur de la India.

Además, como veremos en la próxima lección , este es un ejemplo de una visualización donde agregar interactividad,
específicamente, la capacidad de trazar por separado datos urbanos y rurales, puede ser un beneficio real.

APRENDE MÁS:
Para obtener más detalles sobre la generación de gráficos de densidad de puntos en R, vea estos excelentes blogs de
Tarak y Paul Campbell .

Representaciones estáticas parcialmente espaciales


Al comienzo de esta lección, discutimos cómo una coropleta puede tergiversar datos si hay grandes diferencias entre el área
de una unidad de observación (por ejemplo, un estado) y su población. Cuando los datos son solo parcialmente espaciales,
un mapa puede no ser siempre la mejor visualización, dependiendo de sus objetivos.

Si no necesita una representación totalmente espacial de sus datos, hay otras opciones de visualización que comunican
algunos aspectos espaciales de los datos, pero divergen en algún aspecto u otro. Los ejemplos incluyen cartogramas, mapas
de hexbin y diagramas geofacetados.

Cartogramas
En un cartograma , mantenemos la naturaleza geoespacial general de un objeto, pero distorsionamos el área de cada unidad
de observación de modo que cada unidad se escala proporcionalmente a una variable elegida.

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 27/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

El PIB nominal es una variable útil para demostrar esta relación. Por ejemplo, en relación con su área geográfica muy pequeña,
la contribución de Delhi al PIB de la India es muy alta. Un coropleta tradicional (que se muestra a la izquierda) no hace esta
distinción. Usando un cartograma (que se muestra a la derecha), podemos distorsionar el área geográfica de un estado para
que coincida con su contribución al PIB de la India.

library(cartogram)

ccart_gdp_sf <- cartogram_cont(proj_sf, "nominal_gdp_usd")

gdp_ccart <- ccart_gdp_sf %>%


filter(!state_ut == "Andaman & Nicobar Islands") %>%
tm_shape() +
tm_polygons("nominal_gdp_usd", title = "Nominal GDP (USD)",
palette = "Greens") +
tm_layout(
main.title = "Area Distorted by Nominal GDP",
main.title.position = c("left"),
main.title.size = 1,
legend.position = c("right", "bottom")
)

gdp_original <- proj_sf %>%


filter(!state_ut == "Andaman & Nicobar Islands") %>%
tm_shape() +
tm_polygons(col = "nominal_gdp_usd", title = "Nominal GDP (USD)",
palette = "Greens") +
tm_layout(
main.title = "Nominal GDP",
main.title.position = c("left"),
main.title.size = 1,
legend.position = c("right", "bottom")
)

tmap_arrange(gdp_original, gdp_ccart)

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 28/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Mientras mantenemos la estructura geográfica general de la India, podemos ver claramente qué estados se contraen o
expanden cuando distorsionan el área geográfica por el tamaño del PIB nominal. (Por las mismas razones mencionadas

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 29/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

anteriormente, necesitamos usar un CRS proyectado en lugar de uno geográfico).

Arriba creamos un cartograma continuo con la cartogram_cont() función. Sin embargo, como se muestra a continuación,
también podríamos haber elegido con facilidad un cartograma de área no continua cartogram_ncont() , que introduciría
separación entre estados, o un cartograma de Dorling cartogram_dorling() , que representaría cada estado como un círculo.

ncart_gdp_sf <- cartogram_ncont(proj_sf, "nominal_gdp_usd")


dorling_gdp_sf <- cartogram_dorling(proj_sf, "nominal_gdp_usd")

gdp_ncart <- ncart_gdp_sf %>%


filter(!state_ut == "Andaman & Nicobar Islands") %>%
tm_shape() +
tm_polygons("nominal_gdp_usd", title = "Nominal GDP (USD)",
palette = "Greens") +
tm_layout(
main.title = "Non-Continuous Cartogram",
main.title.position = c("left"),
main.title.size = 1,
legend.position = c("right", "bottom")
)

gdp_dorling <- dorling_gdp_sf %>%


filter(!state_ut == "Andaman & Nicobar Islands") %>%
tm_shape() +
tm_polygons("nominal_gdp_usd", title = "Nominal GDP (USD)",
palette = "Greens") +
tm_text("abb", size = 0.5) +
tm_layout(
main.title = "Dorling Cartogram",
main.title.position = c("left"),
main.title.size = 1,
legend.position = c("right", "bottom")
)

tmap_arrange(gdp_ncart, gdp_dorling)

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 30/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Dado que los cartogramas ya están distorsionando las formas geográficas reales, a menudo no es necesario mantener una
unidad continua. En tales casos, un cartograma no continuo puede ser preferible. Alternativamente, podemos ir aún más

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 31/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

abstractos y reemplazar todas las formas geográficas con un círculo simple, escalado al parámetro de interés.

NOTA:
El cartograma de Dorling es esencialmente el mapa de símbolos proporcionales sin el mapa subyacente.

Mapas de Hexbin
Similar a un cartograma de Dorling, un mapa de hexbin también reemplaza los límites espaciales exactos con una disposición
espacial aproximada. Sin embargo, en lugar de asignar la variable de interés al tamaño, se asigna al color.

Las cuadrículas de hexbin para los Estados Unidos y algunos otros países están bien establecidas, pero geogrid es un nuevo
paquete en desarrollo que intenta generar cuadrículas de hexbin automáticas dado cualquier conjunto de polígonos
geoespaciales. Aunque el paquete le permite generar una cantidad de cuadrículas posibles y seleccionar la mejor opción,
tuvimos problemas para generar un mapa que ubicara adecuadamente ciertos estados, en particular el noreste y los
territorios no contiguos en particular.

Sin embargo, el siguiente mapa de hexbin da una idea de por qué reducir polígonos geoespaciales a un hexágono puede ser
más útil, en ciertos casos, que la geometría original.

library(geogrid) # devtools::install_github("jbaileyh/geogrid")

## test possible grids before selecting seed


# par(mfrow = c(3, 3), mar = c(0, 0, 2, 0))
# for (i in 1:9) {
# new_cells <- calculate_grid(shape = proj_sf,
# grid_type = "hexagonal", seed = i)
# plot(new_cells, main = paste("Seed", i, sep = " "))
# }

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 32/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

new_cells_hex <- calculate_grid(shape = proj_sf,


grid_type = "hexagonal", seed = 1)
hex_result <- assign_polygons(proj_sf, new_cells_hex)

# assign_polygons generates V1 V2 which are center coordinates of tiles


ggplot(hex_result) +
geom_sf(aes(fill = per_capita_gdp_usd)) +
geom_text(aes(x = V1, y = V2,
label = abb), size = 2, colour = "white") +
scale_fill_viridis_c("Per Capita GDP\n(USD$)", labels = scales::dollar) +
labs(
title = "Hexbin Map of Per Capita GDP",
caption = "Data Source: Wikipedia"
) +
coord_sf(datum = NA) +
theme_void() +
guides(size = FALSE)

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 33/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 34/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

NOTA:
El archivo README del paquete documenta el proceso para generar geomallas utilizando una sp clase, pero es aún más
sencillo para un sf objeto (como se muestra arriba).

La desventaja de esta visualización es que le da un área igual a todos los estados. Los territorios de pequeños sindicatos
están representados por la misma área que Uttar Pradesh. Sin embargo, si entendemos ese contexto de antemano, esta
puede ser una visualización útil si solo queremos una distribución del PIB per cápita entre los estados, independientemente
de la población o el área.

Parcelas Geofacetadas
Similar a un mapa de hexbin, un gráfico geofaciado sacrifica características espaciales exactas en favor de una disposición
espacial suelta. Prioriza fuertemente la presentación precisa de los datos de atributos a un costo obvio para la representación
geoespacial.

El geofacet paquete facilita el diseño de una cuadrícula personalizada y la utiliza para facetar datos a través de la cuadrícula.

library(geofacet)

simp_df <- simp_sf %>%


st_set_geometry(NULL) %>%
select(state_ut, urban_pop, rural_pop) %>%
gather(Type, pop_value, -state_ut) %>%
mutate(Type = ifelse(Type == "urban_pop", "Urban", "Rural"))

ggplot(simp_df,
aes(x = Type, y = pop_value / 1e6, fill = Type)) +
geom_col() +
facet_geo(~ state_ut, grid = mygrid, label = "code") +
labs(
https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 35/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

title = "Urban and Rural Populations Across States/UTs (2011)",


caption = "Data Source: Wikipedia",
x = "",
y = "Population (Millions)"
) +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 36/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Aunque ya no se parece mucho a un mapa de estado de la India, esta visualización comunica vívidamente las grandes
diferencias en las poblaciones urbanas y rurales de los estados. También destaca cómo la elección de la visualización afecta
nuestra interpretación.

NOTA:
El mapa de densidad de puntos creado anteriormente proviene de los mismos datos exactos.

Pensamientos finales

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 37/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

Con la ayuda de paquetes tmap , ggplot2 , cartogram , geogrid y geofacet , esta lección ha introducido algunos de los
métodos más comunes para la creación de diversos tipos de visualizaciones geoespaciales estáticas en I, como choropleths,
mapas de densidad de puntos y cartogramas.

¿Interesado en ir más allá de los mapas estáticos y explorar el mundo de los mapas animados o interactivos? Echa un vistazo
a la próxima lección en este curso.

SIGUIENTE LECCIÓN

Creando mapas animados e interactivos en R →

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 38/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

En una misión para enfrentar los problemas más críticos del mundo a través de la inteligencia de datos.

PLATAFORMA SOLUCIONES ACERCA DE BLOG

Visión general Gobierno Empresa Academia

Recoger Sin ánimo de lucro Propósito Inteligencia de datos

Acceso FMCG Fogonadura Tecnología

Transformar Inteligencia de mercado Equipo Dentro de socialcops

Visualizar Seguimiento de SDG Contáctenos Seminario web

Monitoreo de esquemas Carreras profesionales Cursos online

Donacion estrategica Estudios de caso

Geo localización

Expansión Informada

8,350 líderes del Banco Mundial, USAID, la Universidad de Chicago y otras organizaciones increíbles se suscriben a nuestros boletines informativos para obtener recursos
de datos, estudios de casos y mejores prácticas. Ahora es tu turno.

yourname@website.com Subscribe

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 39/40
9/2/2019 SocialCops | Online Course - Introduction to GIS in R: Lesson 3

© 2019 Peeply Private Limited | Legal

https://socialcops.com/courses/introduction-to-gis-r/lesson3-static-maps/ 40/40

También podría gustarte