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

    2018-12-28

    Las entradas más visitadas en 2018

    Las 10 entradas más visitadas en 2018 en las categorías de R, Excel, Access y VBA han sido:

    R

    1. Eliminar duplicados de un data frame en R
    2. Calcular la moda en R usando el paquete modeest
    3. Calcular el porcentaje del total de la columna en R
    4. Distribución de frecuencias en R
    5. Tablas de contingencia en R
    6. Test de normalidad Shapiro–Wilk en R
    7. Cómo comparar dos data frames en R
    8. Superponer gráficos en R: distribución normal
    9. Medir el tiempo de ejecución de procesos en R
    10. Contar el número de ocurrencias basado en dos columnas en R

    Excel

    1. Convertir horas en un número decimal en Excel
    2. Concatenar comillas en Excel
    3. Cómo usar BUSCARV y SUMAR conjuntamente en Excel
    4. Generar números aleatorios entre dos valores con decimales
    5. Invertir lista en Excel
    6. Omitir todos los errores de una hoja
    7. Números aleatorios de una lista o rango de opciones
    8. Listas desplegables que permiten seleccionar múltiples elementos
    9. Calcular el primer y último día del mes en Excel
    10. Pegar una lista filtrada con Excel en las celdas visibles

    Access

    1. Ocultar Access al usuario salvo el formulario
    2. Crear una consulta de UNION y de UNION ALL en Ms Access
    3. Cuadros combinados en cascada en Ms Access
    4. Usar un cuadro combinado para buscar al teclear en Access
    5. Cambiar programáticamente la ruta de tablas vinculadas en Access
    6. Generar números aleatorios entre dos valores en Ms Access
    7. Convertir texto en número conservando los decimales en Access
    8. Consulta para generar una muestra aleatoria en Ms Access
    9. La función redondear en Access, redondeo del banquero
    10. Porcentaje del total de la columna en una consulta de Access

    VBA

    1. Importar ficheros CSV en Excel mediante VBA
    2. Cambiar origen de datos de múltiples tablas dinámicas con VBA
    3. Medir el tiempo de ejecución de subrutinas en VBA
    4. Sucesión de Fibonacci en Excel y VBA
    5. Obtener el nombre de usuario de Windows con VBA en Excel
    6. VBA: cambiar el texto a mayúsculas, minúsculas o nombre propio
    7. Mostrar u ocultar formas en Excel mediante VBA
    8. Ocultar o mostrar todas las hojas de un libro de Excel (VBA)
    9. Exportar tabla o consulta de Access como CSV
    10. Insertar un reloj en Excel usando VBA

    Entradas relacionadas

    2018-12-27

    Obtener datos geoespaciales por países con R: elevación

    Problema

    En la entrada anterior obtuvimos las divisiones administrativas con el paquete raster en R. En esta ocasión extraeremos datos de altitud o elevación del terreno.

    Solución

    Empleamos la función getData del paquete raster. Necesitamos suministrar el argumento country con un código ISO de 3 letras.

    library(raster)
    # Países disponibles
    library(psych) # Función HeadTail 
    headTail(getData('ISO3'))
    
        ISO3                  NAME
    1    AFG           Afghanistan
    2    XAD Akrotiri and Dhekelia
    3    ALA                 Åland
    4    ALB               Albania
    ...                   
    253  ESH        Western Sahara
    254  YEM                 Yemen
    255  ZMB                Zambia
    256  ZWE              Zimbabwe
    
    Suministramos el argumento 'alt' (altitude). Computamos slope y aspect con la función terrain para poder suministrarlos posteriormente a la función hillShade.

    alt <-  getData('alt', country = 'ESP')
    slope <-  terrain(alt, opt = 'slope')
    aspect <-  terrain(alt, opt = 'aspect')
    hill <-  hillShade(slope, aspect, 40, 270)
    
    library(tmap)
    tm_shape(hill) +
      tm_raster(palette = gray(0:100 / 100),
                n = 100,
                legend.show = FALSE)  +
      tm_shape(alt) +
      tm_raster(alpha = 0.5,
                palette = terrain.colors(25),
                legend.show = FALSE)
    

    Mapa

    Entradas relacionadas

    Referencias

    2018-12-25

    Obtener datos geoespaciales por países con R: divisiones administrativas

    Problema

    Deseamos obtener datos espaciales de las áreas administrativas de un país con el paquete raster de R. Con estos datos, SpatialPolygonDataFrame (polígonos espaciales en un data frame), podremos dibujar mapas en R.

    Solución

    Empleamos la función getData del paquete raster. Necesitamos suministrar el argumento country con un código ISO de 3 letras.

    library(raster)
    # Países disponibles
    library(psych) # Función HeadTail 
    headTail(getData('ISO3'))
    
        ISO3                  NAME
    1    AFG           Afghanistan
    2    XAD Akrotiri and Dhekelia
    3    ALA                 Åland
    4    ALB               Albania
    ...                   
    253  ESH        Western Sahara
    254  YEM                 Yemen
    255  ZMB                Zambia
    256  ZWE              Zimbabwe
    
    El primer argumento es 'GADM' que es una base de datos de divisiones administrativas. También necesitamos especificar el nivel de la subdivisión administrativa (0 = país, 1 = primer nivel). Por ejemplo, para España: 0 = país, 1 = comunidades autónomas, 2 = provincias, 3 = comarcas, 4 = municipios.

    # Descargamos el nivel 4
    df4 <- getData("GADM", country = "ES", level = 4)
    View(df4)
    
    Vista de la pestaña Environment tras importar todos los niveles.

    Mapas

    Representamos las divisiones administrarivas del nivel 1. Separamos península y Baleares de Canarias para apreciar mejor los mapas.

    df11 <- df1[df1@data$NAME_1 != "Islas Canarias",]
    df12 <- df1[df1@data$NAME_1 == "Islas Canarias",]
    plot(df11, main = "Península y Baleares - Divisiones administrativas nivel 1")
    plot(df12, main = "Canarias- Divisiones administrativas nivel 1")
    

    Descarga manual

    Tammbién podemos acceder y descargar manualmente los ficheros de los diferentes niveles aquí.

    Entradas relacionadas

    Referencias

    2018-12-17

    Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 3.1.

    Gráfico a replicar

    Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning. En esta ocasión replicaremos el gráfico de la figura 3.1. Utiliza el conjunto de datos Advertising.Los puntos rojos representan los valores observados de ventas (sales) y los presupuestos de televisión (TV). La línea azul representa la recta de regresión. Las líneas grises verticales representan el error asociado con cada observación. Hay errores positivos (si la observación se sitúa por encima de la líneaazul) y negativos (si la observación se sitúa por debajo de la curva).

    Solución

    Con la función theme personalizamos el formato: rotamos las etiquetas del eje y, eliminamos el color de fondo, y añadimos el borde.

    library(tidyverse)
    ggplot(ad_fitted, aes(x = budgets, y = sales)) +
      geom_point(colour = "red") +
      geom_smooth(se = FALSE, method = lm) +
      geom_segment(aes(
        x = budgets,
        y = sales,
        xend = budgets,
        yend = fitted
      )) +
      scale_x_continuous(breaks = seq(0, 300, by = 50)) +
      scale_y_continuous(breaks = seq(0, 25, by = 5)) +
      theme(
        axis.text.y = element_text(angle = 90, hjust = 1),
        panel.background = element_blank(),
        panel.border = element_rect(fill = NA)
      )
    
    Si deseamos mantener la cuadrícula, pero eliminar el color de fondo (theme_bw) y modificar el título del eje x (labs):

    ggplot(ad_fitted, aes(x = budgets, y = sales)) +
      geom_point(colour = "red") +
      geom_smooth(se = FALSE, method = lm) +
      geom_segment(aes(
        x = budgets,
        y = sales,
        xend = budgets,
        yend = fitted
      )) +
      labs(x = "TV")+
      scale_x_continuous(breaks = seq(0, 300, by = 50)) +
      scale_y_continuous(breaks = seq(0, 25, by = 5)) +
      theme_bw()+
      theme(axis.text.y = element_text(angle = 90, hjust = 1))
    

    Entradas relacionadas

    Referencias

    2018-12-10

    Listar conjuntos de datos disponibles en R

    Problema

    Queremos conocer los conjuntos de datos disponibles en R, tanto cargados en un determinado momento como los de todos paquetes disponibles.

    Solución

    1. Listar los conjuntos de datos disponibles en ese momento
    2. data()
      
      Data sets in package ‘datasets’:
      
      AirPassengers           Monthly Airline Passenger Numbers 1949-1960
      BJsales                 Sales Data with Leading Indicator
      BJsales.lead (BJsales)
                              Sales Data with Leading Indicator
      BOD                     Biochemical Oxygen Demand
      CO2                     Carbon Dioxide Uptake in Grass Plants
      ChickWeight             Weight versus age of chicks on different diets
      DNase                   Elisa assay of DNase
      EuStockMarkets          Daily Closing Prices of Major European Stock
                              Indices, 1991-1998
      Formaldehyde            Determination of Formaldehyde
      HairEyeColor            Hair and Eye Color of Statistics Students
      ...                    ...
      
    3. Listar los conjuntos de datos de todos los paquetes disponibles
    4. data(package = .packages(all.available = TRUE))
      
      Data sets in package ‘aqp’:
      
      amarillo                Amarillo Soils
      ca630                   Soil Data from the Central Sierra Nevada Region
                              of California
      munsell                 Munsell to sRGB Lookup Table for Common Soil
                              Colors
      rruff.sample            Sample XRD Patterns
      soil_minerals           Munsell Colors of Common Soil Minerals
      sp1                     Soil Profile Data Example 1
      sp2                     Honcut Creek Soil Profile Data
      sp3                     Soil Profile Data Example 3
      sp4                     Soil Chemical Data from Serpentinitic Soils of
                              California
      sp5                     Sample Soil Database #5
      sp6                     Soil Physical and Chemical Data from
                              Manganiferous Soils
      
      Data sets in package ‘beeswarm’:
      
      breast                  Lymph-node-negative primary breast tumors
      
    5. Listar los conjuntos de datos de un paquete específico
    6. data(package = "ISLR")
      
      Data sets in package ‘ISLR’:
      
      Auto                    Auto Data Set
      Caravan                 The Insurance Company (TIC) Benchmark
      Carseats                Sales of Child Car Seats
      College                 U.S. News and World Report's College Data
      Credit                  Credit Card Balance Data
      Default                 Credit Card Default Data
      Hitters                 Baseball Data
      Khan                    Khan Gene Data
      NCI60                   NCI 60 Data
      OJ                      Orange Juice Data
      Portfolio               Portfolio Data
      Smarket                 S&P Stock Market Data
      Wage                    Mid-Atlantic Wage Data
      Weekly                  Weekly S&P Stock Market Data
      

    Referencias

    Nube de datos