R Language
Introducción a los mapas geográficos
Buscar..
Introducción
Vea también I / O para datos geográficos
Creación de mapas básicos con map () a partir de los mapas de paquetes.
El map()
funciones map()
de los maps
paquetes proporciona un punto de partida simple para crear mapas con R.
Un mapa del mundo básico se puede dibujar de la siguiente manera:
require(maps)
map()
El color del contorno se puede cambiar estableciendo el parámetro de color, col
, ya sea al nombre del personaje o al valor hexadecimal de un color:
require(maps)
map(col = "cornflowerblue")
Para rellenar las masas de tierra con el color en col
podemos establecer fill = TRUE
:
require(maps)
map(fill = TRUE, col = c("cornflowerblue"))
Se puede suministrar un vector de cualquier longitud a col
cuando fill = TRUE
también se establece:
require(maps)
map(fill = TRUE, col = c("cornflowerblue", "limegreen", "hotpink"))
En el ejemplo anterior, los colores de col
se asignan arbitrariamente a polígonos en el mapa que representa las regiones y los colores se reciclan si hay menos colores que polígonos.
También podemos usar la codificación de colores para representar una variable estadística, que opcionalmente se puede describir en una leyenda. Un mapa creado como tal se conoce como "coropleta".
El siguiente ejemplo de choropleth establece el primer argumento de map()
, que es la database
de database
en "county"
y "state"
para colorear el desempleo de código usando datos de los conjuntos de datos unemp
y county.fips
mientras se superponen líneas de estado en blanco:
require(maps)
if(require(mapproj)) { # mapproj is used for projection="polyconic"
# color US county map by 2009 unemployment rate
# match counties to map using FIPS county codes
# Based on J's solution to the "Choropleth Challenge"
# Code improvements by Hack-R (hack-r.github.io)
# load data
# unemp includes data for some counties not on the "lower 48 states" county
# map, such as those in Alaska, Hawaii, Puerto Rico, and some tiny Virginia
# cities
data(unemp)
data(county.fips)
# define color buckets
colors = c("paleturquoise", "skyblue", "cornflowerblue", "blueviolet", "hotpink", "darkgrey")
unemp$colorBuckets <- as.numeric(cut(unemp$unemp, c(0, 2, 4, 6, 8, 10, 100)))
leg.txt <- c("<2%", "2-4%", "4-6%", "6-8%", "8-10%", ">10%")
# align data with map definitions by (partial) matching state,county
# names, which include multiple polygons for some counties
cnty.fips <- county.fips$fips[match(map("county", plot=FALSE)$names,
county.fips$polyname)]
colorsmatched <- unemp$colorBuckets[match(cnty.fips, unemp$fips)]
# draw map
par(mar=c(1, 1, 2, 1) + 0.1)
map("county", col = colors[colorsmatched], fill = TRUE, resolution = 0,
lty = 0, projection = "polyconic")
map("state", col = "white", fill = FALSE, add = TRUE, lty = 1, lwd = 0.1,
projection="polyconic")
title("unemployment by county, 2009")
legend("topright", leg.txt, horiz = TRUE, fill = colors, cex=0.6)
}
50 mapas estatales y coropletas avanzadas con Google Viz
Una pregunta común es cómo yuxtaponer (combinar) regiones geográficas físicamente separadas en el mismo mapa, como en el caso de un coropleta que describe los 50 estados estadounidenses (el continente con Alaska y Hawai yuxtapuestos).
Crear un atractivo mapa de 50 estados es simple cuando se aprovecha Google Maps. Las interfaces para la API de Google incluyen los paquetes googleVis
, ggmap
y RgoogleMaps
.
require(googleVis)
G4 <- gvisGeoChart(CityPopularity, locationvar='City', colorvar='Popularity',
options=list(region='US', height=350,
displayMode='markers',
colorAxis="{values:[200,400,600,800],
colors:[\'red', \'pink\', \'orange',\'green']}")
)
plot(G4)
La función gvisGeoChart()
requiere mucha menos codificación para crear una choropleth en comparación con los métodos de mapeo más antiguos, como map()
de los maps
paquetes. El parámetro colorvar
permite colorear fácilmente una variable estadística, a un nivel especificado por el parámetro locationvar
. Las diversas opciones pasadas a options
como una lista permiten la personalización de los detalles del mapa, como el tamaño ( height
), la forma ( markers
) y la codificación de colores ( colorAxis
y colors
).
Mapas de trama interactivos
El paquete plotly
permite muchos tipos de gráficos interactivos, incluyendo mapas. Hay algunas formas de crear un mapa en forma plotly
. Proporcione los datos del mapa usted mismo (a través de plot_ly()
o ggplotly()
), use las capacidades de mapeo "nativas" de plot_geo()
través de plot_geo()
o plot_mapbox()
), o incluso una combinación de ambos. Un ejemplo de suministrar el mapa usted mismo sería:
library(plotly)
map_data("county") %>%
group_by(group) %>%
plot_ly(x = ~long, y = ~lat) %>%
add_polygons() %>%
layout(
xaxis = list(title = "", showgrid = FALSE, showticklabels = FALSE),
yaxis = list(title = "", showgrid = FALSE, showticklabels = FALSE)
)
Para una combinación de ambos enfoques, intercambie plot_ly()
por plot_geo()
o plot_mapbox()
en el ejemplo anterior. Ver el libro de la trama para más ejemplos.
El siguiente ejemplo es un enfoque "estrictamente nativo" que aprovecha el atributo layout.geo para establecer la estética y el nivel de zoom del mapa. También utiliza la base de datos world.cities
de los maps
para filtrar las ciudades brasileñas y world.cities
sobre el mapa "nativo".
Las principales variables: poph
es un texto con la ciudad y su población (que se muestra al pasar el mouse); q
es un factor ordenado a partir del cuantil de la población. ge
tiene información para el diseño de los mapas. Consulte la documentación del paquete para obtener más información.
library(maps)
dfb <- world.cities[world.cities$country.etc=="Brazil",]
library(plotly)
dfb$poph <- paste(dfb$name, "Pop", round(dfb$pop/1e6,2), " millions")
dfb$q <- with(dfb, cut(pop, quantile(pop), include.lowest = T))
levels(dfb$q) <- paste(c("1st", "2nd", "3rd", "4th"), "Quantile")
dfb$q <- as.ordered(dfb$q)
ge <- list(
scope = 'south america',
showland = TRUE,
landcolor = toRGB("gray85"),
subunitwidth = 1,
countrywidth = 1,
subunitcolor = toRGB("white"),
countrycolor = toRGB("white")
)
plot_geo(dfb, lon = ~long, lat = ~lat, text = ~poph,
marker = ~list(size = sqrt(pop/10000) + 1, line = list(width = 0)),
color = ~q, locationmode = 'country names') %>%
layout(geo = ge, title = 'Populations<br>(Click legend to toggle)')
Realización de mapas HTML dinámicos con folleto
Leaflet es una biblioteca de código abierto de JavaScript para hacer mapas dinámicos para la web. RStudio escribió enlaces R para Leaflet, disponibles a través de su paquete de leaflet
, construido con htmlwidgets
. Los mapas de folletos se integran bien con los ecosistemas de RMarkdown y Shiny .
La interfaz se canaliza , utilizando una función leaflet()
para inicializar un mapa y las funciones subsiguientes agregando (o eliminando) capas de mapas. Hay muchos tipos de capas disponibles, desde marcadores con ventanas emergentes hasta polígonos para crear mapas de coropletas. Se accede a las variables en el data.frame pasado al leaflet()
a través de la cita de style-style ~
.
Para asignar los conjuntos de datos state.name
y state.center
:
library(leaflet)
data.frame(state.name, state.center) %>%
leaflet() %>%
addProviderTiles('Stamen.Watercolor') %>%
addMarkers(lng = ~x, lat = ~y,
popup = ~state.name,
clusterOptions = markerClusterOptions())
(Captura de pantalla; haga clic para la versión dinámica.) Mapas dinámicos de folletos en aplicaciones Shiny
El Folleto de paquete está diseñado para integerate con Brillante
En la interfaz de leafletOutput()
llama a leafletOutput()
y en el servidor al que llama renderLeaflet()
library(shiny)
library(leaflet)
ui <- fluidPage(
leafletOutput("my_leaf")
)
server <- function(input, output, session){
output$my_leaf <- renderLeaflet({
leaflet() %>%
addProviderTiles('Hydda.Full') %>%
setView(lat = -37.8, lng = 144.8, zoom = 10)
})
}
shinyApp(ui, server)
Sin embargo, las entradas reactivas que afectan a la expresión renderLeaflet
harán que todo el mapa se vuelva a dibujar cada vez que se actualice el elemento reactivo.
Por lo tanto, para modificar un mapa que ya se está ejecutando, debe usar la función leafletProxy()
.
Normalmente, se usa un leaflet
para crear los aspectos estáticos del mapa, y leafletProxy
para administrar los elementos dinámicos, por ejemplo:
library(shiny)
library(leaflet)
ui <- fluidPage(
sliderInput(inputId = "slider",
label = "values",
min = 0,
max = 100,
value = 0,
step = 1),
leafletOutput("my_leaf")
)
server <- function(input, output, session){
set.seed(123456)
df <- data.frame(latitude = sample(seq(-38.5, -37.5, by = 0.01), 100),
longitude = sample(seq(144.0, 145.0, by = 0.01), 100),
value = seq(1,100))
## create static element
output$my_leaf <- renderLeaflet({
leaflet() %>%
addProviderTiles('Hydda.Full') %>%
setView(lat = -37.8, lng = 144.8, zoom = 8)
})
## filter data
df_filtered <- reactive({
df[df$value >= input$slider, ]
})
## respond to the filtered data
observe({
leafletProxy(mapId = "my_leaf", data = df_filtered()) %>%
clearMarkers() %>% ## clear previous markers
addMarkers()
})
}
shinyApp(ui, server)