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)