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()

inserisci la descrizione dell'immagine qui

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")

inserisci la descrizione dell'immagine qui

Per riempire le masse di terra con il colore in col possiamo impostare fill = TRUE :

require(maps)
map(fill = TRUE, col = c("cornflowerblue"))

inserisci la descrizione dell'immagine qui

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"))

inserisci la descrizione dell'immagine qui

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)
}

inserisci la descrizione dell'immagine qui

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)

choropleth

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)
    )

inserisci la descrizione dell'immagine qui

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)')

Questa è un'istantanea

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 della mappa del volantino (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)

inserisci la descrizione dell'immagine qui



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow