R Language
Introduktion till geografiska kartor
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()
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")
För att fylla landmassor med färgen i col vi ställa fill = TRUE :
require(maps)
map(fill = TRUE, col = c("cornflowerblue"))
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"))
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)
}
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)
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)
)
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)')
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; 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)








