R Language
Introduzione alle mappe geografiche
Ricerca…
introduzione
Vedi anche I / O per i dati geografici
Creazione di mappe di base con map () dalle mappe dei pacchetti
La funzione map()
dalle maps
pacchetti fornisce un semplice punto di partenza per la creazione di mappe con R.
Una mappa del mondo di base può essere disegnata come segue:
require(maps)
map()
Il colore del contorno può essere modificato impostando il parametro color, col
, sul nome del personaggio o sul valore esadecimale di un colore:
require(maps)
map(col = "cornflowerblue")
Per riempire le masse di terra con il colore in col
possiamo impostare fill = TRUE
:
require(maps)
map(fill = TRUE, col = c("cornflowerblue"))
Un vettore di qualsiasi lunghezza può essere fornito a col
quando è impostato anche fill = TRUE
:
require(maps)
map(fill = TRUE, col = c("cornflowerblue", "limegreen", "hotpink"))
Nell'esempio sopra i colori di col
vengono assegnati arbitrariamente ai poligoni nella mappa che rappresenta le regioni e i colori vengono riciclati se ci sono meno colori dei poligoni.
Possiamo anche usare la codifica a colori per rappresentare una variabile statistica, che può facoltativamente essere descritta in una legenda. Una mappa creata come tale è nota come "coropleta".
Il seguente esempio di coropleta imposta il primo argomento di map()
, che è il database
di "county"
e "state"
per la disoccupazione del codice colore utilizzando i dati dai set di dati unemp
e county.fips
mentre si sovrappongono le linee di stato in bianco:
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 mappe di stato e coropleti avanzati con Google Viz
Una domanda comune è come giustapporre (combinare) regioni geografiche fisicamente separate sulla stessa mappa, come nel caso di un coropleto che descrive tutti i 50 Stati americani (La terraferma con Alaska e Hawaii giustapposte).
Creare una mappa attraente a 50 stati è semplice quando fai leva su Google Maps. Le interfacce con l'API di Google includono i pacchetti googleVis
, ggmap
e 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 funzione gvisGeoChart()
richiede molto meno codice per creare un coroplet rispetto ai metodi di mappatura più vecchi, come map()
dalle maps
del pacchetto. Il parametro colorvar
consente di colorare facilmente una variabile statistica, a un livello specificato dal parametro locationvar
. Le varie opzioni passate alle options
come elenco consentono la personalizzazione dei dettagli della mappa come dimensione ( height
), forma ( markers
) e codifica a colori ( colorAxis
e colors
).
Mappe interattive interattive
Il pacchetto plotly
consente molti tipi di grafici interattivi, incluse le mappe. Ci sono alcuni modi per creare una mappa in modo plotly
. O plot_ly()
manualmente i dati della mappa (tramite plot_ly()
o ggplotly()
), usate le capacità di mappatura "native" di plot_geo()
tramite plot_geo()
o plot_mapbox()
), o anche una combinazione di entrambi. Un esempio di fornitura della mappa da te sarebbe:
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)
)
Per una combinazione di entrambi gli approcci, scambia plot_ly()
per plot_geo()
o plot_mapbox()
nell'esempio precedente. Vedi il libro della trama per altri esempi.
Il prossimo esempio è un approccio "strettamente nativo" che sfrutta l'attributo layout.geo per impostare l'estetica e il livello di zoom della mappa. Utilizza anche il database world.cities
dalle maps
per filtrare le città brasiliane e tracciarle sulla mappa "nativa".
Le variabili principali: poph
è un testo con la città e la sua popolazione (che viene mostrato al passaggio del mouse); q
è un fattore ordinato dal quantile della popolazione. ge
ha informazioni per il layout delle mappe. Vedere la documentazione del pacchetto per ulteriori informazioni.
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)')
Realizzazione di mappe HTML dinamiche con volantino
Leaflet è una libreria JavaScript open source per realizzare mappe dinamiche per il web. RStudio ha scritto R binding per Leaflet, disponibile attraverso il suo pacchetto leaflet
, realizzato con htmlwidgets
. Le mappe dei volantini si integrano bene con gli ecosistemi RMarkdown e Shiny .
L'interfaccia viene convogliata , usando una funzione leaflet()
per inizializzare una mappa e le successive funzioni aggiungendo (o rimuovendo) i layer della mappa. Sono disponibili molti tipi di livelli, dai marcatori con i popup ai poligoni per creare mappe di coropleth. Le variabili nel data.frame passato al leaflet()
sono accessibili tramite la citazione ~
stile funzione.
Per mappare i set di dati state.name
e state.center
:
library(leaflet)
data.frame(state.name, state.center) %>%
leaflet() %>%
addProviderTiles('Stamen.Watercolor') %>%
addMarkers(lng = ~x, lat = ~y,
popup = ~state.name,
clusterOptions = markerClusterOptions())
(Screenshot, fare clic per la versione dinamica.) Mappe di depliant dinamico in applicazioni lucenti
Il pacchetto Leaflet è progettato per essere integerato con Shiny
Nella ui si chiama leafletOutput()
e nel server si chiama 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)
Tuttavia, gli input reattivi che influenzano l'espressione renderLeaflet
causeranno la ridisegnazione dell'intera mappa ogni volta che l'elemento reattivo viene aggiornato.
Pertanto, per modificare una mappa già in esecuzione, è necessario utilizzare la funzione leafletProxy()
.
Normalmente si usa il leaflet
per creare gli aspetti statici della mappa e il leafletProxy
per gestire gli elementi dinamici, ad esempio:
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)