2019-01-02

Representar shapefiles (SHP) con ggplot2

Problema

Deseamos representar shapefiles (SHP) con ggplot2. Obtendremos los datos de las regiones administratitvas siguiendo los pasos de esta entrada.

Solución

Voy a representar los municipios de España. Generaré unos datos aleatorios para cada uno de ellos y asignarles luego una escala continua. Creo dos gráficos separados para península y Baleares, y Canarias para ganar en claridad. Finalmente represento Castilla-La Mancha, y dejo un enlace a un pdf para poder hacer zoom en el resto de la península y Baleares y apreciar el detalle.

library(tidyverse)
library(raster)
shp <- getData("GADM", country = "ES", level = 4)
shp.pen <- shp[shp@data$NAME_1 != "Islas Canarias", ]
shp.can <- shp[shp@data$NAME_1 == "Islas Canarias", ]

# Convertimos shapefiles a data frames
df.spain <- fortify(shp, region = "NAME_4")
df.pen <- fortify(shp.pen, region = "NAME_4")
df.can <- fortify(shp.can, region = "NAME_4")

# Datos aleatorios
set.seed(2015)
random.df <- data.frame(id = unique(df.spain[, 'id']),
                        random = runif(
                          n = length(unique(df.spain[, 'id'])),
                          min = 25,
                          max = 75
                        ))
df.pen <-
  merge(df.pen, random.df, by = 'id', all.x = TRUE)
df.can <-
  merge(df.can, random.df, by = 'id', all.x = TRUE)

# Gráficos con ggplot2
# Península y Baleares
p.pen <-
  ggplot(df.pen, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = random), colour = "white", size = 0.1) +
  labs(x = " ", y = " ") +
  theme_bw() +
  scale_fill_viridis_c('Datos aleatorios', option = "magma", direction = -1) +
  coord_map() +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major = element_blank(),
    panel.border = element_blank(),
    axis.ticks = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    legend.position = "bottom"
  )

# Canarias
p.can <-
  ggplot(df.can, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = random), colour = "white", size = 0.1) +
  labs(x = " ", y = " ") +
  theme_bw() +
  scale_fill_viridis_c('Datos aleatorios', option = "magma", direction = -1) +
  coord_map() +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major = element_blank(),
    panel.border = element_blank(),
    axis.ticks = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    legend.position = "bottom"
  )


# Mostramos los gráficos
p.pen
p.can

Mapas

Enlace al pdf.

  • Península y Baleares
  • Canarias
  • Castilla-La Mancha
  • Entradas relacionadas

    Referencias

    No hay comentarios:

    Publicar un comentario

    Nube de datos