Sök…


Introduktion

Se även I / O för geografiska data

Grundläggande kartläggning med karta () från paketkartorna

Funktionen map() ur förpackningen maps ger en enkel utgångspunkt för att skapa kartor med R.

En grundläggande världskarta kan ritas enligt följande:

require(maps)
map()

ange bildbeskrivning här

Färgen på dispositionen kan ändras genom att ställa in färgparametern, col , till antingen karaktärsnamnet eller hexvärdet för en färg:

require(maps)
map(col = "cornflowerblue")

ange bildbeskrivning här

För att fylla landmassor med färgen i col vi ställa fill = TRUE :

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

ange bildbeskrivning här

En vektor av valfri längd kan tillföras col när fill = TRUE också ställs in:

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

ange bildbeskrivning här

I exemplet ovan tilldelas färger från col godtyckligt till polygoner på kartan som representerar regioner och färger återvinns om det finns färre färger än polygoner.

Vi kan också använda färgkodning för att representera en statistisk variabel, som valfritt kan beskrivas i en legend. En karta som skapats som sådan kallas en "choropleth".

Följande choropleth-exempel ställer in det första argumentet för map() , som är database till "county" och "state" att färga kodarbetslöshet med hjälp av data från de inbyggda unemp och county.fips under överläggning av statliga linjer i vitt:

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

ange bildbeskrivning här

50 statliga kartor och avancerade Choropleths med Google Viz

En vanlig fråga är hur man kan kombinera (kombinera) fysiskt separata geografiska regioner på samma karta, till exempel i fallet med en koroplet som beskriver alla 50 amerikanska stater (fastlandet med Alaska och Hawaii ihop).

Att skapa en attraktiv karta över 50 tillstånd är enkelt när man utnyttjar Google Maps. Gränssnitt till Googles API inkluderar paketen googleVis , ggmap och 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

Funktionen gvisGeoChart() kräver mycket mindre kodning för att skapa en choropleth jämfört med äldre kartläggningsmetoder, såsom map() från paketet maps . colorvar parametern möjliggör enkel färgning av en statistisk variabel på en nivå som anges av parametern locationvar . De olika alternativen som skickas till options som en lista gör det möjligt att anpassa kartans detaljer som storlek ( height ), form ( markers ) och färgkodning ( colorAxis och colors ).

Interaktiva komplicerade kartor

Det plotly paketet tillåter många slags interaktiva tomter, inklusive kartor. Det finns några sätt att skapa en karta helt plotly . Antingen leverera kartdata själv (via plot_ly() eller ggplotly() ), använd plotlys "ursprungliga" kartläggningsmöjligheter (via plot_geo() eller plot_mapbox() ), eller till och med en kombination av båda. Ett exempel på att tillhandahålla kartan själv skulle vara:

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

ange bildbeskrivning här

För en kombination av båda metoderna, byt plot_ly() för plot_geo() eller plot_mapbox() i exemplet ovan. Se den komplicerade boken för fler exempel.

Nästa exempel är ett "strikt infött" tillvägagångssätt som utnyttjar attributet layout.geo för att ställa in kartans estetik och zoomnivå. Den använder också databasen world.cities från maps att filtrera de brasilianska städerna och plotta dem ovanpå den "infödda" kartan.

poph : poph är en text med staden och dess befolkning (som visas vid muspekaren); q är en ordnad faktor från befolkningens kvantil. ge har information för kartans layout. Se paketdokumentationen för mer information.

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

Detta är en ögonblicksbild

Skapa dynamiska HTML-kartor med broschyren

Broschyr är ett open-source JavaScript-bibliotek för att skapa dynamiska kartor för webben. RStudio skrev R-bindningar för Broschyren, tillgänglig via dess leaflet , byggd med htmlwidgets . Broschyrkartor integreras väl med RMarkdown och Shiny ekosystem.

Gränssnittet rörs med hjälp av en leaflet() -funktion för att initialisera en karta och efterföljande funktioner lägga till (eller ta bort) kartlager. Många typer av lager finns tillgängliga, från markörer med popups till polygoner för att skapa koroplettskartor. Variabler i data.frame som skickas till leaflet() kan nås via funktionstil ~ citat.

För att kartlägga state.name och state.center :

library(leaflet)

data.frame(state.name, state.center) %>% 
    leaflet() %>% 
    addProviderTiles('Stamen.Watercolor') %>% 
    addMarkers(lng = ~x, lat = ~y, 
               popup = ~state.name, 
               clusterOptions = markerClusterOptions())
skärmdump av broschyrkarta (Skärmdump; klicka för dynamisk version.)

Dynamiska broschyrer i blanka applikationer

Broschyrpaketet är utformat för att heltala med Shiny

I ui anropar du leafletOutput() och i servern ringer du 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)

Reaktiva ingångar som påverkar renderLeaflet uttrycket kommer dock att göra att hela kartan ritas om varje gång det reaktiva elementet uppdateras.

För att ändra en karta som redan körs bör du använda leafletProxy() .

Normalt använder du leaflet att skapa de statiska aspekterna av kartan, och leafletProxy att hantera de dynamiska elementen, till exempel:

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)

ange bildbeskrivning här



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow