+ - 0:00:00
Notes for current slide
Notes for next slide

Intro a la programación en R

Escuela de Invierno - Julio 2020
Gabriela Mathieu

Creative Commons License
Creative Commons Attribution 4.0 International License

¿Qué haremos hoy?

  • Repaso del taller anterior

  • Introducción al paquete ggplot2

  • Introducción al paquete sf

ggplot2

Gramática de gráficos

  • ggplot2 permite hacer los gráficos por capas, hay diferentes capas pero 3 fundamentales para hacer el gráficos, es decir, elementos que se van agregando.

    • data: el data frame que contiene las variables que vamos a graficar

    • aesthetics mapping: las variables que vamos a graficar y donde (x, y)

    • geometrics: el tipo de gráfico que haremos (puntos, líneas, barras, etc.)

    • capas adicionales para mejorar el gráfico (título, etiqueta, nombres de ejes, etc.)

Capas

Elemento Descripción Función
Data Set de datos a plotear ggplot()
Aesthetics Escalas en la que mapearemos los datos aes()
Geometries Los elementos visuales utilizados para nuestros datos geom_*()
Facets Para ploteos múltiples facet_*()
Statistics Construye nuevas variables (count, density, etc.) stat_*()
Scales Que elementos serán mapeados para las variables definidas scale_*()
Coordinate Cartesianas o polares coord_*()
Themes Estilos gráficos theme_*()

R graph gallery

Capas

  • Las 3 primeras capas deben ser en este orden: data, aesthetics, geometry

Capas

  • Las 3 primeras capas deben ser en este orden: data, aesthetics, geometry
  • Las capas se van superponiendo con un +

Capas

  • Las 3 primeras capas deben ser en este orden: data, aesthetics, geometry
  • Las capas se van superponiendo con un +
  • La estructura básica es como esta:

ggplot(data = <df>) +

aes(x = <Variable_1>, y = <Variable_2>) +

geom_bar()

ggplot2::geom_point()

Ejemplo mínimo: data + aes

# Cargo los paquetes y los datos
library(ggplot2)
load("data/listado.Rdata")
ggplot(data = listado) +
aes(x = review_scores_rating,
y = price)

Ejemplo mínimo: data + aes + geom

ggplot(data = listado) +
aes(x = review_scores_rating,
y = price) +
geom_point()

Ejemplo mínimo: Color y transparencia

ggplot(data = listado) +
aes(x = review_scores_rating,
y = price) +
geom_point(color = "purple",
alpha = 0.7)

Un error común

ggplot(data = listado) +
aes(x = review_scores_rating,
y = price,
color = "purple") +
geom_point()
  • En aes se definen los parámetros estéticos de las variables.

  • Aquellos que son fijos como color = "read", fill = "blue", etc. se escriben afuera de aes().

Tamaño de los puntos

listado %>%
filter(!is.na(review_scores_rating)) %>%
group_by(review_scores_rating) %>%
summarize(median_price = median(price),
cantidad = n()) %>%
ggplot() +
aes(x = review_scores_rating,
y = median_price,
size = cantidad) +
geom_point(color = "purple",
alpha = 0.7)

Agrego nombre a ejes y título

listado %>%
filter(!is.na(review_scores_rating)) %>%
group_by(review_scores_rating) %>%
summarize(median_price = median(price)) %>% #BREAK
ggplot() + #BREAK
aes(x = review_scores_rating,
y = median_price) + #BREAK
geom_point(color = "purple",
alpha = 0.7) +
labs(x = 'Puntaje',
y = 'Precio mediano',
size = '# Evaluaciones',
title = 'Precios medianos según puntaje de evaluaciones')

ggplot:theme_*()

Temas

  • La función theme_*() controla el estilo del gráfico, permite definir el color de fondo, la apariencia de la leyenda, tamaños de letra, etc.

  • Vienen predefinidos una variedad de temas pero también se puede instalar un paquete con más temas ggthemes.

  • Explorar otros temas.

  • Cambiamos el fondo a color blanco al elegir el tema 'bw'

# Cambio de tema
listado %>%
filter(!is.na(review_scores_rating)) %>%
group_by(review_scores_rating) %>%
summarize(median_price = median(price),
cantidad = n()) %>%
ggplot() +
aes(x = review_scores_rating,
y = median_price,
size = cantidad) +
geom_point(color = "purple",
alpha = 0.7) +
labs(x = 'Puntaje',
y = 'Precio mediano',
size = '# Evaluaciones',
title = 'Precios medianos según puntaje de evaluaciones') +
theme_bw()

Exportar un gráfico

Es preferible el formato pdf ya que se guarda en formato vectorial y así evitamos que se pixele como puede ocurrir con los formatos png, jpg, etc.

ggsave('precio_puntaje.pdf')

Podemos definir otros argumentos para variar el tamaño del gráfico, entre otras cosas. Para guardarlo en png cambiamos pdf por png.

Ejercicio

  • Al gráfico anterior agregarle facetas por la variable room_type. Ver ?facet_wrap

  • Notar cómo están generadas las variables median_price y cantidad y cambiar lo necesario.

  • Guardarlo en formato png

Otras geometrías

Creamos un nuevo objeto nb que contiene la mediana de precios para cada barrio.

nb <- listado %>%
group_by(neighbourhood_group) %>%
summarise(median_price = median(price))

ggplot::geom_bar()

Gráfico de barras

nb %>%
ggplot(aes(x = neighbourhood_group, y = median_price)) +
geom_bar(stat = 'identity')
  • También podemos escribir la función aes() dentro de ggplot()

  • El argumento de geom_bar(), stat='identity', indica que la altura de la barra debe ser igual al valor y.

Propiedades del texto del eje x

nb %>%
ggplot(aes(x = neighbourhood_group, y = median_price)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 60, hjust = 1))

La función element_text() la llamo dentro de theme(), debo especificar a que elemento de texto quiero modificar: axis.text.x.

Reordeno las categorías de menor a mayor

nb %>%
ggplot(aes(x = reorder(neighbourhood_group, -median_price), y = median_price)) +
geom_bar(fill = 'purple', alpha = .7, stat = 'identity') +
theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
labs(x = '', y = 'Precio mediano', title = 'Precio mediano diario por barrio')
  • La función reorder() reordena las categorías de una variable según los valores de una variable numérica.

sf

GDS (Geographical Data Science)

  • R no es un SIG (Sistemas de Información Geográficos). ¿Conocen gvSIG, Qgis, etc.?

GDS (Geographical Data Science)

  • R no es un SIG (Sistemas de Información Geográficos). ¿Conocen gvSIG, Qgis, etc.?

  • R permite hacer Ciencia de Datos Geográficos (SDG)

GDS (Geographical Data Science)

  • R no es un SIG (Sistemas de Información Geográficos). ¿Conocen gvSIG, Qgis, etc.?

  • R permite hacer Ciencia de Datos Geográficos (SDG)



Atributos SIG SDG
Disciplinas Geografía Geografía, Computación, Estadística
Foco Interfaz Gráfica Código
Reproducibilidad Mínimo Máximo

Paquetes

  • sp, sf: para manejar información espacial vectorial

Paquetes

  • sp, sf: para manejar información espacial vectorial

  • raster: para trabajar con rasters

Paquetes

  • sp, sf: para manejar información espacial vectorial

  • raster: para trabajar con rasters

  • ggplot2, rasterVis, tmap, leaflet, o mapview: para visualizar información espacial

Paquetes

  • sp, sf: para manejar información espacial vectorial

  • raster: para trabajar con rasters

  • ggplot2, rasterVis, tmap, leaflet, o mapview: para visualizar información espacial

  • Es sencillo conectar R con programas SIG: GRASS GIS (rgrass7), SAGA (RSAGA), QGIS (RQGIS y qgisremote), incluso ArcGIS (arcgisbinding).

  • Proyecciones

sf

Combina las funcionalidades de 3 paquetes: sp, rgeos y rgdal

Ventajas respecto a otros paquetes:

Mayor velocidad para importar y exportar los datos

Más tipos de geometrías soportadas

Compatibilidad con tidyverse. Funciona el pipe!

El paquete sp es predecesor de sf.

Muchos paquetes espaciales de R todavía dependen del paquete sp, por lo tanto, es importante saber cómo convertir.

Convertir objetos sf a sp

# Para transformar de SF a SP
objeto.sp <- as(<objeto.sf>, "Spatial")

Convertir objetos sp a sf

# Para transformar de SP a SF
objeto.sf <- st_as_sf(<objeto.sp>)

st_read()

  • Los objetos sf tienen una clase que combina 'data.frame' y 'sf'

st_read()

  • Los objetos sf tienen una clase que combina 'data.frame' y 'sf'

  • Los objetos sf también tienen una columna especial que contiene los datos de geometría, usualmente llamado 'geom' o 'geometry'.

st_read()

  • Los objetos sf tienen una clase que combina 'data.frame' y 'sf'

  • Los objetos sf también tienen una columna especial que contiene los datos de geometría, usualmente llamado 'geom' o 'geometry'.

  • Las funciones del paquete dplyr se pueden aplicar. Para saber la totalidad de funciones que son aplicables a un objeto de clase 'sf' consultar methods().

st_read()

  • Los objetos sf tienen una clase que combina 'data.frame' y 'sf'

  • Los objetos sf también tienen una columna especial que contiene los datos de geometría, usualmente llamado 'geom' o 'geometry'.

  • Las funciones del paquete dplyr se pueden aplicar. Para saber la totalidad de funciones que son aplicables a un objeto de clase 'sf' consultar methods().

  • Para la unión de objetos espaciales se usa st_join(x, y). El método de join utilizado es siempre left join, manteniendo los registros del primer atributo.

¿De dónde obtenemos las capas con información geográfica?

  • Dependiendo del país, será la institución oficial que las provea.

  • En Uruguay una gran cantidad de información encontrarán en IDE.

  • Un paquete de R para trabajar con datos de Uruguay es geouy

  • Los datos de Barcelona venían en el conjunto de datos abiertos de insideAirbnb.

Importar la información geográfica

# cargo paquete
library(sf)
# importo shapes
barrios <- st_read("data/neighbourhoods.geojson", stringsAsFactors = FALSE)
# consulto clase
class(barrios)
# consulto métodos
methods(class = "sf")

Mapa de coropletas

Mapa de coropletas

  • Buenas prácticas

  • Es un mapa temático en el que las regiones se colorean de un motivo que muestra una medida estadística.

Mapa de coropletas

  • Buenas prácticas

  • Es un mapa temático en el que las regiones se colorean de un motivo que muestra una medida estadística.

# cargo datos
load("data/listado.Rdata")

ggplot2 + sf

# cuento la cantidad de alojamientos por barrios
library(dplyr)
bn <- listado %>%
group_by(neighbourhood_group) %>%
mutate(median_price = median(price)) %>%
ungroup()
# uno barcelona con el objeto espacial barrios
barrios <- left_join(barrios, bn, by = "neighbourhood_group")

ggplot::geom_sf()

ggplot2 + sf

library(ggplot2)
m <- barrios %>%
ggplot() +
# Defino la geometría
geom_sf(aes(fill = median_price))

ggplot::scale_*()

Cambio escala de colores

m <- barrios %>%
ggplot() +
geom_sf(aes(fill = median_price)) + # Defino la geometría
scale_fill_viridis_c("Precio", option = "D", trans = "sqrt", alpha = .9)

ggsn

Norte y escala

m <- barrios %>%
ggplot() +
geom_sf(aes(fill = median_price)) + # Defino la geometría
scale_fill_viridis_c("Precio", option = "D", trans = "sqrt", alpha = .9) +
ggtitle("Precio mediano por barrio") +
ggsnh::north(barrios,
location = "topleft",
symbol = 3) +
ggsn::scalebar(barrios,
dist = 50,
dist_unit = "km",
transform = F,
model = "WGS84")

¿Qué haremos hoy?

  • Repaso del taller anterior

  • Introducción al paquete ggplot2

  • Introducción al paquete sf

Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow