Como se ha señalado en líneas anteriores, el mapa base hace de soporte a toda la información posterior. En este capítulo se desarrollan algunos procedimientos para cartografiar el mapa base. Para ello, serán necesarios 3 paquetes:
geoboundaries()
: necesario para descargar ficheros
vectoriales directamente desde la web. También se
puede obtener más información desde el siguiente sitio web.La base de datos
“geoBoundaries Global Database of Political Administrative Boundaries
Database” es una fuente de información online, en código abierto, con
los límites administrativos de todos los países del mundo.
sf()
: necesario para trabajar con objetos
vectoriales.
tmap()
: para cartografiar los objetos
anteriores.
Para activar los paquetes tmap()
, sf()
y
terra()
primero hay que conocer si ya está instalado:
system.file(package='tmap')
## [1] "D:/Documentos/R/win-library/4.3/tmap"
system.file(package='sf')
## [1] "D:/Documentos/R/win-library/4.3/sf"
system.file(package='geoboundaries')
## [1] ""
Si ya estuvieran instalados se activan con la función
library()
.
library(sf)
library(tmap)
library(tidyverse)
library(rgeoboundaries)
library(terra)
A continuación, se descargará la información correspondiente a Austria.
austria <- gb_adm1("Austria")
A continuación, se visualizará la estructura y el contenido del objeto `austria’.
Posteriormente, se reducirá el tamaño del objeto eliminando las variables no necesarias. Por medio del siguiente comando se conserva sólo la variable que ocupa la tercera columna
austria <- austria[3]
Para hacerla más legigle, se modificará el nombre de esa variable.
colnames(austria)
## [1] "shapeName" "geometry"
names(austria)[1] <- "estado"
Una primera modalidad de mapa básico es la que representa el objeto gráfico relleno con un color determinado.
tm_shape(austria) +
tm_fill(col="gray")+
tm_compass(position = c("left", "top"))+ # Símbolo del N
tm_scale_bar(position = c("left", "bottom"))+ # Escala gráfica, posición
tm_layout(main.title = "Austria") # Título del gráfico
Sobre este mapa básico se pueden realizar diferentes modificaciones,
por ejemplo, añadiendo las unidades administrativas (en este caso,
estados federados) mediante polígonos. La función principal para
visualizar polígonos es tm_polygons()
. Por defecto, relena
los polígonos en gris claro (gray85) y los bordes de los polígonos en
gris ligeramente oscuro (gray40).
tm_shape(austria) +
tm_polygons(col="gray") +
tm_compass(position = c("left", "top"))+ # Símbolo del N
tm_scale_bar(position = c("left", "bottom"))+ # Escala gráfica, posición
tm_layout(main.title = "Austria") # Título del gráfico
Tanto los colores de las unidades administrativas como los de los
bordes pueden modificarse utilizando los argumentos col
y
border.col
.
tm_shape(austria) +
tm_polygons(col = "lightblue", # Relleno con el color azul
border.col = "black", # Color de las divisiones administrativas.
lwd = 0.5, # Ancho de la línea (divisones administrativas)
lty = "dashed") + # Tipo de línea.
tm_compass(position = c("left", "top"))+ # Símbolo del N
tm_scale_bar(position = c("left", "bottom"))+ # Escala gráfica, posición
tm_layout(main.title = "Austria") # Título del gráfico
tm_polygons()
es una combinación de otras dos funciones
- tm_fill()
y tm_borders()
. El siguiente
conjunto de órdenes es un ejemplo de uso de función
tm_fill()
rellenando los polígonos con un color fijo y
cambiando el color y grosor de la línea que señala los límites
administrativos.
tm_shape(austria) +
tm_fill(col = "lightblue") +
tm_borders(col="red", lwd=2)+
tm_compass(position = c("left", "top"))+
tm_scale_bar(position = c("left", "bottom"))+
tm_layout(main.title = "Austria")
La función tm_borders()
dibuja los bordes de los
polígonos, pudiendo cambiar el color, la anchura del trazo o el tipo de
línea.
tm_shape(austria) +
tm_borders(col = "black", # Color de la línea que marca el límite administrativo
lwd = 0.5, # Ancho de la línea.
lty = "dashed") # Tipo de línea
Finalmente, podemos añadir al mapa base las etiquetas identificativas de cada unidad administrativa, y representar en colores diferentes cada una de ellas. Es el ejemplo de un mapa político.
tm_shape(austria) +
tm_polygons(col="estado", legend.show = FALSE)+
tm_compass(position = c("left", "top")) + # Símbolo del N
tm_scale_bar(position = c("left", "bottom")) + # Escala gráfica, posición
tm_layout(main.title = "Austria") + # Título del gráfico
tm_text("estado")
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA MAPA BASE 1
Descarga de la web los límites administrativos correspondientes a un país del mundo de tu elección (utiliza para ello el código ISO3 y elabora un mapa con las unidades administrativas dibujadas en diferentes colores y sus nombres impresos.
austria <- gb_adm1("Austria")
austria <- austria[3]
colnames(austria)
names(austria)[1] <- "estado"
tm_shape(austria) +
tm_polygons(col="estado", legend.show = FALSE)+
tm_compass(position = c("left", "top")) + # Símbolo del N
tm_scale_bar(position = c("left", "bottom")) + # Escala gráfica, posición
tm_layout(main.title = "Austria") + # Título del gráfico
tm_text("estado")
También es posible utilizar el color para cartografiar una variable
categórica. En este ejemplo, se selecciona una gama de colores
utilizando el argumento palette=get_brewer_pal
del paquete
maptools, adecuada para datos cualitativos, en este
caso subregiones del país. En primer lugar, activaremos el paquete
maptools.
library(tmaptools)
A continuación se creará un dataframe que se unirá posteriormente al
objeto austria
. Este nuevo objeto será denominado
mi_df
y contiene información adicional sobre Austria, en
este caso, el estado, la región, la capital y su población.
mi_df <- data.frame(
estado = c("Burgenland", "Kärnten", "Niederösterreich", "Oberösterreich", "Salzburg", "Steiermark", "Tirol", "Vorarlberg", "Wien"),
region = c("Cuenca del Danubio", "Alpes", "Cuenca del Danubio", "Cuenca del Danubio", "Alpes", "Alpes", "Alpes", "Alpes", "Cuenca del Danubio"),
poblacion = c(297583, 564513, 1698796, 1505140, 560710, 1252922, 764102, 401647, 1931593))
La función merge()
es
la encargada de unir los dos dataframes en función de columnas comunes
en cada uno de ellos. La variable común en ambos es
estado
.
austria <- merge(austria, mi_df, by = "estado")
A continuación se representará un mapa político en el que se
representa la distribución de las dos grandes regiones naturales de
Austria. Estas dos regiones constituyen un ejemplo de variable
cualitativa (categorías). Para informar a tmap de esta
circunstancia, debe añadirse el argumento style = cat
.
Además, el argumento title
en blanco dentro de
tm_polygons()
no dibuja el título de la leyenda.
tm_shape(austria) +
tm_polygons(col="region",
title="Leyenda",
style="cat",
palette=get_brewer_pal(palette="Set1",
n=2,
plot=FALSE)) +
tm_compass(position = c("left", "bottom")) +
tm_scale_bar(position = c("left", "bottom"))+
tm_layout(main.title = "Regiones naturales de Austria",
title.size = 1.5,
title.position = c("right", "top"),
legend.outside = FALSE,
legend.position= c("left", "top"),
legend.title.size = 1.5,
legend.text.size = 1) +
tm_text("estado")
Un mapa político de Austria podría representar no sólo los estados federados, sino también otras variables, como la ubicación de las principales ciudades. Estas constituyen un ejemplo de datos puntuales. Para representarlas se creará un dataframe con los nombres de las ciudades, su latitud y longitud, y el número de habitantes.
ciudades_df <- data.frame(lon = c(16.3725,15.4386,14.2864,9.75,13.045,11.3933,14.3),
lat = c(48.2083,47.0708,48.3058,47.5167,47.8,47.2683,46.6167),
nombre = c("Viena", "Graz", "Linz", "Lochau", "Salzburgo", "Innsbruck", "Klagenfurt"),
habitantes = c(2223236,292630,210165,200000,155021,130585,101403),
status = c("capital nacion", "capital estado", "capital estado", "capital estado", "capital estado", "capital estado", "capital estado"))
Este dataframe no es aún un objeto espacial, por lo que no se puede
representar gráficamente. Es necesario convertir ese dataframe en un
objeto sf
informando a R de cúales son los variables con
las coordenadas geográficas (lon y lat) y qué sistema de proyección será
utilizado.
ciudades <- st_as_sf(ciudades_df,
coords = c("lon", "lat"), # Nombre de las variables con las coordenadas
crs = 4326) # Código del Sistema de Coordenadas Geográfico
De la misma manera, podríamos realizar un mapa básico con la ubicación de las ciudades
tm_shape(austria) +
tm_fill(col="gray") +
tm_shape(ciudades) +
tm_bubbles(size = "habitantes", col="red", title.size = "Número de habitantes:", shape = "status", title.shape = "Status:") +
tm_text("nombre", col = "blue", size = 1.25, just = "left", ymod = 0.75) +
tm_compass(position = c("left", "bottom")) + # Símbolo del N
tm_scale_bar(position = c("left", "bottom")) + # Escala gráfica, posición
tm_layout(main.title = "Austria") # Título del gráfico
También podríamos representar datos lineales, como las principales autopistas y líneas de ferrocarril. Para ello contamos con la ayuda del paquete naturalearth que facilita la descarga de un buen número de elementos del territorio, tanto en formato vectorial como ráster. Como siempre, se comienza instalando el paquete y activándolo.
library(rnaturalearth)
A continuación, se procede a descargar la capa de carreteras con la
función rnaturalearth::ne_download()
. Una vez descargada,
esta capa mundial va a ser recortada dentro de los límites de Austria
con la función sf::intersection()`.
borrame <- ne_download(scale = 10, type = "roads", category = "cultural") %>%
sf::st_intersection(austria)
## Reading layer `ne_10m_roads' from data source
## `C:\Users\Domingo\AppData\Local\Temp\Rtmpq8uPh0\ne_10m_roads.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 56600 features and 31 fields
## Geometry type: MULTILINESTRING
## Dimension: XY
## Bounding box: xmin: -166.5325 ymin: -55.11212 xmax: 178.4191 ymax: 71.17768
## Geodetic CRS: WGS 84
Una vez descargada y recortada, se procede a limpiar esa base de
datos, seleccionado sólo las autopistas
(Mayor Highway
).
at_autopistas <- borrame %>%
filter(type == "Major Highway") %>%
select(c(15, 29)) %>%
rename(codigo = label) %>%
group_by(codigo) %>%
summarise()
Para comprobar que el procedimiento se ha realizado correctamente, se representa gráficamente la red de autopistas
plot(at_autopistas)
De la misma manera se procederá con las autopistas
borrame <- ne_download(scale = 10, type = "railroads", category = "cultural") %>%
sf::st_intersection(austria)
## Reading layer `ne_10m_railroads' from data source
## `C:\Users\Domingo\AppData\Local\Temp\Rtmpq8uPh0\ne_10m_railroads.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 25413 features and 12 fields
## Geometry type: LINESTRING
## Dimension: XY
## Bounding box: xmin: -150.1122 ymin: -51.89528 xmax: 179.3578 ymax: 69.60437
## Geodetic CRS: WGS 84
Como en el caso anterior, los datos extraidos deben limpiarse y modificarse para un uso posterior.
at_ferrocarril <- borrame %>%
select(10) %>%
rename(id = natlscale) %>%
group_by(id) %>%
summarise()
También dibujamos los ferrocarriles para verificar que no ha habido equivocación.
plot(at_ferrocarril)
A continuación se elaborará un mapa político que incluye los estados federados, sus capitales y las líneas de ferrocarril y autopistas.
tm_shape(austria) +
tm_polygons(col="estado", legend.show = FALSE) +
tm_text("estado", col = "black", size = 1) +
tm_shape(ciudades) +
tm_bubbles(size = "habitantes", col="red", sizes.legend = c(100000, 300000, 2500000), title.size = "Número de habitantes:", shape = "status", title.shape = "Status:") +
tm_text("nombre", col = "blue", size = 0.75, just = "left", xmod = 0.5, ymod = 0.75) +
tm_shape(at_autopistas) +
tm_lines(col="darkgreen", scale=1.5) +
tm_text("codigo", col = "darkgreen", size = 0.5, just = "left", xmod = 0.5, ymod = 0.75) +
tm_add_legend(type = "line", col = "darkgreen", title = "Autopistas") +
tm_shape(at_ferrocarril) +
tm_lines(col="#de2b51", scale=1.5) +
tm_text("id", col = "#de2b51", size = 0.5, just = "left", xmod = 0.5, ymod = 0.75) +
tm_add_legend(type = "line", col = "#de2b51", title = "Ferrocarril") +
tm_compass(position = c("left", "bottom")) + # Símbolo del N
tm_scale_bar(position = c("left", "bottom")) + # Escala gráfica, posición
tm_layout(main.title = "Austria, mapa político",
inner.margins = c(0.05, 0.15, 0.05, 0.05), # Título del gráfico
legend.position = c("left", "top"))
De la misma manera, se podría realizar un mapa físico que combine, por ejemplo, la topografía, las montañas más importantes, los ríos y los lagos del país.
Para descargar un Modelo Digital del terreno podemos recurrir al
paquete elevtr
.
Este paquete permite la descarga de MDT con diferentes resoluciones
espaciales.
#install.packages("elevatr")
library(elevatr)
A continuación, se procede a descargar el MDT
at_elev <- rast(elevatr::get_elev_raster(locations = austria, # El área espacial que nos interesa
z = 7, # La resolución espacial requerida.
clip = "locations")) # Recorta directametne el área de trabajo
at_elev <- setMinMax(at_elev)
Si existen valores inferiores a 0 (topografía submarina) deben eliminarse.
A continuación, se cargarán los nombres, la altitud y la localización
de las principales cumbres del país y se transformarán de dataframe a
objeto espacial con formato sf
.
at_cumbres_df <- data.frame(nombre = c("Großglockner", "Wildspitze", "Piz Buin", "Hochfeiler", "Schneeberg", "Geschriebenstein","Hermannskogel", "Großvenediger", "Hoher Dachstein"),
altitud = c(3798, 3770, 3312, 3510, 2076, 884, 542, 3666, 2995),
lon = c(12.69444444, 10.86722222, 10.11861111, 11.72777778, 15.807778, 16.433889, 16.283333, 12.34638889, 13.606389),
lat = c(47.07416667, 46.88527778, 46.84416667, 46.97222222, 47.7675, 47.352778, 48.266667, 47.10916667, 47.475278))
at_cumbres <- st_as_sf(at_cumbres_df,
coords = c("lon", "lat"), # Nombre de las variables con las coordenadas
crs = 4326) # Código del Sistema de Coordenadas Geográfico
Con la función rnaturalearth::ne_download()
podemos
descargar la capa de ríos, replicando el mismo proceso realizado para
autopistas y ferrocarriles.
borrame <- ne_download(scale = 10, type = "rivers_lake_centerlines", category = "physical") %>%
sf::st_intersection(austria)
## Reading layer `ne_10m_rivers_lake_centerlines' from data source
## `C:\Users\Domingo\AppData\Local\Temp\Rtmpq8uPh0\ne_10m_rivers_lake_centerlines.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 1473 features and 38 fields
## Geometry type: MULTILINESTRING
## Dimension: XY
## Bounding box: xmin: -164.9035 ymin: -52.15775 xmax: 177.5204 ymax: 75.79348
## Geodetic CRS: WGS 84
COLOR amarillo:
En ciertos casos, los rios constituyen la frontera entre países, por lo que la descarga de los límites administrativos puede segmentar el río en varios tramos, cada uno con su etiqueta. Esto puede llenar el mapa de etiquetas con los nombres de los ríos. Una alternativa es crear un buffer alrededor de las fronteras del país, a una distancia de 10 km respecto a la frontera.
austria_adm0 <- gb_adm0("Austria")
buff_10000 = st_buffer(austria_adm0, dist = 10000)
Este buffer puede imprimirse junto con las fronteras reales para ver su disposición.
plot(st_geometry(austria_adm0))
plot(st_geometry(buff_10000), add = TRUE)
Este buffer servirá para realizar la intersección con la capa de ríos, desplazando la frontera, lo que en teoría favorecerá que cada río aparezca ahora como un único tramo y con una única etiqueta.
borrame <- ne_download(scale = 10, type = "rivers_lake_centerlines", category = "physical") %>%
sf::st_intersection(buff_10000)
## Reading layer `ne_10m_rivers_lake_centerlines' from data source
## `C:\Users\Domingo\AppData\Local\Temp\Rtmpq8uPh0\ne_10m_rivers_lake_centerlines.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 1473 features and 38 fields
## Geometry type: MULTILINESTRING
## Dimension: XY
## Bounding box: xmin: -164.9035 ymin: -52.15775 xmax: 177.5204 ymax: 75.79348
## Geodetic CRS: WGS 84
Una vez descargada y recortada, se procede a limpiar esa base de datos.
at_rios <- borrame %>%
select(4) %>%
rename(nombre = name) %>%
group_by(nombre) %>%
summarise()
Para comprobar que el procedimiento se ha realizado correctamente, se representa gráficamente la red fluvial
plot(at_rios)
✅ ** PROBLEMA CON LOS RÍOS**:
En algunos casos, aparecen numerosas etiquetas del mismo río cuando éste hace de frontera. Ello tiene que ver con el grado de precisión de los límites administrativos de la base de datos “rnaturalearth”. Para solventar este problema es necesario alejar unos km la frontera real y usar esa nueva frontera para realizar el recorte. Este desplazamiento de la frontera se crea mediante un “buffer”
En primer lugar se crea el buffer alrededor de la frontera, alejada 10 km.
buff_10000 <- st_buffer(austria_adm0, dist = 10000)
A continuación se dibuja la frontera real y la creada por el buffer.
plot(st_geometry(austria_adm0))
plot(st_geometry(buff_10000), add = TRUE)
Posteriormente se descarga la capa de ríos, utilizando el objeto
buff_10000
como base para el recorte.
borrame <- ne_download(scale = 10, type = "rivers_lake_centerlines", category = "physical") %>%
sf::st_intersection(buff_10000)
## Reading layer `ne_10m_rivers_lake_centerlines' from data source
## `C:\Users\Domingo\AppData\Local\Temp\Rtmpq8uPh0\ne_10m_rivers_lake_centerlines.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 1473 features and 38 fields
## Geometry type: MULTILINESTRING
## Dimension: XY
## Bounding box: xmin: -164.9035 ymin: -52.15775 xmax: 177.5204 ymax: 75.79348
## Geodetic CRS: WGS 84
Se limpia la capa con los ríos.
austria_rios <- borrame %>%
select(4) %>%
rename(nombre = name) %>%
group_by(nombre) %>%
summarise()
Finalmente, se hace una prueba con la capa de ríos
tm_shape(austria_rios) +
tm_lines(col= "blue", lwd= 1.5) +
tm_text("nombre", col = "blue", just = "top")
En casos en los que el problema pudiera persistir, se puede jugar con la distancia del buffer (10000), aumentándola o disminuyéndola.
A continuación se dibujará un mapa físico de Austria, representando el relieve y las principales cumbres de la región.
tm_shape(at_elev) +
tm_raster(title = "Altitud (m asl)",
style = "cont",
palette = "YlOrBr") +
tm_shape(austria) +
tm_borders(col = "black",
lwd = 1) +
tm_shape(at_rios) +
tm_lines(col= "blue", lwd= 1.5) +
tm_text("nombre", col = "blue", just = "top") +
tm_shape(at_cumbres) +
tm_symbols(col = "black") +
tm_text("nombre", size=0.75, ymod = 1) +
tm_scale_bar(position = c("left", "bottom")) + # Escala gráfica, posición
tm_compass(position = c("right", "top"),
type = "rose",
size = 2) +
tm_layout(main.title = "Mapa fisico de Austria",
bg.color = "lightgreen",
inner.margins = c(0.05, 0.05, 0.05, 0.05)) + # Título del gráfico
tm_credits(text = "Geog 2040")
Por último, se eliminan aquellos objetos sin interés y se graban los restantes
rm(borrame, mi_df, ciudades_df, at_cumbres_df)
save(list=ls(), # Graba todos los objetos existentes en el Global Environ
file="datos_G2040_02_mapa_base.RData") # Nombre del fichero que contendrá todos los objetos
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA MAPA BASE 2
oregon_condados
y
comenta qué tipo de variables se encuentran en dicho objeto.load("D:/G2040/Datos_varios/oregon/LOS_UTILIZADOS/oregon_condados.RData")
View(oregon_condados)
Un símbolo indicando el N, situado a la izquierda y arriba,
Una escala gráfica abajo en el centro.
El título debe incluir la siguiente frase: “Estado de Oregón”
tm_shape(oregon_condados) +
tm_fill(col="lightblue") +
tm_compass(position = c("left", "top"))+ # Símbolo del N
tm_scale_bar(position = c("left", "bottom"))+ # Escala gráfica, posición
tm_layout(main.title = "Estado de Oregon", # Título del gráfico
inner.margins = c(0.15, 0.10, 0.01, 0.15), # Márgenes internos
frame = FALSE) # Sin marco
oregon_regiones
y añadirlo al fichero
oregon_condados
. Para no modificar este último, crea un
nuevo objeto denominado oregon
, resultado de la fusión de
los dos anterioresload("D:/G2040/Datos_varios/oregon/LOS_UTILIZADOS/oregon_regiones.RData")
oregon <- merge(oregon_condados, oregon_regiones, by = "condado")
tm_shape(oregon) +
tm_polygons(col="Region_Geografia",
title="",
style="cat",
palette= "RdYlGn") +
tm_layout(main.title = "Regiones de Oregon",
title.size = 2.5,
title.position = c("right", "top"),
legend.outside=TRUE,
legend.position= c("right", "bottom"),
inner.margins = c(0.15, 0.05, 0.05, 0.1)) +
tm_text("condado", size = 0.6) +
tm_compass(position = c("right", "top")) +
tm_scale_bar(position = c("left", "bottom"))
#El condado de Douglas
# La región de Eastern Oregon
# La región de Hood and Columbia
rnaturalearth
como
populated_places_simple
.borrame <- ne_download(scale = 10, "populated_places_simple", category = "cultural") %>%
sf::st_intersection(oregon)
oregon_ciudades <- borrame %>%
select(c(4, 5, 23, 32)) %>%
rename(estatus = featurecla, nombre = name)
tm_shape(oregon) +
tm_fill(col="gray") +
tm_shape(oregon_ciudades) +
tm_dots(size = "pop_max", col="red") +
tm_text("nombre") +
tm_compass(position = c("left", "bottom")) + # Símbolo del N
tm_scale_bar(position = c("left", "bottom")) + # Escala gráfica, posición
tm_layout(main.title = "Oregon") # Título del gráfico
La división administrativa en condados (objeto
oregon_condados
).
Las principales autopistas (extraer de rnaturalearth).
Las principales líneas de ferrocarril (idem naturalearth).
Los aeropuertos (idem naturalearth).
El título del gráfico puede ser “Infraestructuras de transporte del estado de Oregon”.
Para crear el fichero vectorial que te permitirá recortar las imágenes, procede de la siguiente manera
library(tidyverse)
oregon <- oregon_condados %>%
group_by() %>%
summarise()
oregon_elev <- rast(elevatr::get_elev_raster(locations = oregon, # El área espacial que nos interesa
z = 7, # La resolución espacial requerida.
clip = "locations")) # Recorta directametne el área de trabajo
oregon_elev <- setMinMax(at_elev)
oregon_elev <- app(at_elev,
function(x){x[x < 0] <- NA;return(x)})
borrame <- ne_download(scale = 10, type = "rivers_lake_centerlines", category = "physical") %>%
sf::st_intersection(oregon)
oregon_rios <- borrame %>%
select(4) %>%
rename(nombre = name) %>%
group_by(nombre) %>%
summarise()
tm_shape(oregon_elev) +
tm_raster(title = "Altitud (m asl)",
style = "cont",
palette = "YlOrBr") +
tm_shape(oregon) +
tm_borders(col = "black",
lwd = 1) +
tm_shape(oregon_rios) +
tm_lines(col= "blue", lwd= 1.5) +
tm_text("nombre", col = "blue", just = "top") +
tm_scale_bar(position = c("left", "bottom")) + # Escala gráfica, posición
tm_compass(position = c("right", "top"),
type = "rose",
size = 2) +
tm_layout(main.title = "Mapa fisico de Oregon",
bg.color = "lightgreen",
inner.margins = c(0.05, 0.05, 0.05, 0.05)) + # Título del gráfico
tm_credits(text = "Geog 2040")