Otra de las herramientas fundamentales del análisis y la gestión, como muchos sabréis, son los Sistemas de Información Geográfica o SIG que gestionan y generan información geográfica. Aunque están programados en otro de los lenguajes de programación y análisis punteros, Python, lo cierto es que R es en sí mismo un excelente sistema de información geográfica, con infinidad de paquetes y herramientas. Algunos tipos de análisis están, de hecho, implementados en R de la forma más eficiente por encima de otros lenguajes o programas, como es la proyección de la distribución potencial de las especias de fauna y flora.
En este pequeño tutorial os mostramos alguna potencialidad a la hora de visualizar datos de tipo espacial. Tanto tipo raster como tipo vectorial. Si no estáis familiarizados con la información geográfica espacial, conviene recordar que:
La información de tipo raster se refiere a imagenes, como las fotografías, pero que contienen información de su ubicación y tamaño, y donde cada pixel de la fotografía representa un dato, por ejemplo, un valor de temperatura. Los archivos que suelen contener este tipo de información pueden ser por ejemplo los tiffs o incluso jpg, como en las fotografías, o archivos de texto que podrías abrir con un bloc de notas. O bien el propio archivo, o bien un archivo auxiliar contienen la información necesria para que la imagen quede bien ubicada en el mapa.
La información de tipo vectorial se refiere a puntos, líneas o polígonos cerrados que indican una información determinada. Un archivo de puntos puede indicar las coordenadas donde hemos observado una especie, las líneas pueden ser curvas de nivel o carreteras, y los polígonos, las delimitaciones de una provincia, un espacio natural protegido, un edificio…
En primer lugar, vamos a descargar el paquete fundamental para visualizar la información de este tipo, que tiene el nombre lógico de raster
.
install.packages("raster")
library(raster)
La función raster()
del paquete es la que nos va a permitir cargar un archivo de este tipo y generar un objeto de este tipo. En este ejemplo, vamos a cargar de esta manera el archivo de la temperatura media de la península, que disponemos en formato .tiff en la carpeta de datos donde trabajamos:
tmedia<-raster("tmedia.tif")
Como decíamos al principio del tema, la función plot()
será capaz de detectar el tipo de objeto que tenemos y cómo hay que generar, por defecto, una figura:
plot(tmedia)
Hay muchos paquetes en R capaces de leer información vectorial y en concreto el formato shape que a su vez, se compone de varios ficheros. Hemos escogido el paquete sf
por su simplicidad a efectos de poder visualizar rápidamente geometrías de los límites de los Parques Natuales de España. Instalamos y cargamos la librería:
install.packages("sf")
library(sf)
Ya con el paquete cargado, podemos proceder a leer nuestro archivo shapefile con la función read_sf()
. Ojo, el archivo shapefile se compone a su vez de varios. Por lo tanto, los hemos guardados juntos en la carpeta “Parques”, que no tiene nada más dentro. De esta manera nuestra función podrá disponer de los archivos que necesite interpretar si únicamente especificamos la ruta de la carpeta.
parques<-read_sf("parques")
Una vez generado, necesitamos hacer una pequeña simplificación de toda la información que contiene nuestro objeto, de manera que nos quedemos con algo que solo contenga los datos de los límites de los parques. No vamos a profundizar aquí en esto, en cualquier caso.
limites<-st_geometry(parques)
Ahora podemos visualizar nuestros datos de los límites de parques naturales:
plot(parques)
## Warning: plotting the first 9 out of 14 attributes; use max.plot = 14 to plot
## all
Pero en realidad, me interesa ver los dos mapas juntos, solapando los límites de áreas protegidas al mapa de temperatura media. Para ello, solo tenemos que volver a llamar a nuestro primer mapa, y para solapar encima el de límites, añadir el argumento add=TRUE
.
plot(tmedia)
plot(parques,add=TRUE)
## Warning in plot.sf(parques, add = TRUE): ignoring all but the first attribute
Si queréis seguir profundizando, es útil ver que las coordenadas de puntos son más simples de añadir. En realidad, siendo datos x e y de longitud y latitud, se trata fundamentalmente de añadir un diagrama de dispersión. Lo vamos a ver con un archivo de datos de distribución de especies de plantas invasoras en España, invasoras.txt
, que cargaremos:
invasoras<-read.csv("invasoras.csv")
Este archivo nos muestra tres datos: la especie invasora, y las coordenadas donde aparece cada registro. Vamos a seleccionar dos de ellas: Acacia dealbata y Agave americana. Para hacer la selección de una vez, como veremos en el tema 7, podemos decirle a R que nos seleccione aquellas filas de datos que cumplan la condición 1 O la condición 2, cualquiera de ellas hará que nos seleccione el dato. En este caso, nos seleccionará al mismo tiempo las dos especies deseadas:
seleccion<-subset(invasoras,aespecie=="Acacia_dealbata" | aespecie=="Agave_americana")
A continuación realizo un objeto coordenadas, donde excluyo (con el -
delante) la columna 1 que contiene los datos de nombres de especies y me quedo solo con las de coordendas. Esas son las que añadiré encima de mi mapa. En este caso con la función points()
. Voy a añadir de paso el argumento col para que me coloree los puntos de manera diferente para cada especie:
plot(tmedia)
plot(limites,add=TRUE)
coordenadas<-seleccion[-c(1)]
points(coordenadas$POINT_X,coordenadas$POINT_Y,col=as.factor(seleccion$aespecie))
Y finalmente, voy a realizar mi primera operación SIG: Voy a extraer la información de temperatura media de las coordenadas de mis puntos elegidos de mis dos especies. Estaré cruzando un mapa con otro, y recogeré la información de temperatura media de aquel pixel que corresponda con la coordenada de cada punto. Esto lo haré con la función extract()
de mi paquete raster
: le especifico en primer lugar la capa de la cual extraer mis datos, en segundo lugar las coordenadas de las cuales quiero la información, y finalmente con dt=TRUE
especifico que quiero que el resultado (almacenado en mi objeto datos
sea un dataframe).
datos<-raster::extract(tmedia,coordenadas,dt=TRUE)
Una vez extraído el dato deseado, le voy a pegar la columna aespecie
de mi objeto con las especies seleccionadas, para saber a qué especie corresponde. Y finalmente haré un boxplot para ver qué diferencias hay en la temperatura media en la que estas especies se dan en la península ibérica:
datos<-cbind(datos,seleccion$aespecie)
head(datos)
boxplot(datos~aespecie,data=datos)