R Language
Inleiding tot geografische kaarten
Zoeken…
Invoering
Zie ook I / O voor geografische gegevens
Eenvoudig kaarten maken met map () uit de pakketkaarten
De functie map()
uit het pakket maps
een eenvoudige uitgangspunt voor het maken van kaarten met R.
Een eenvoudige wereldkaart kan als volgt worden getekend:
require(maps)
map()
De kleur van de omtrek kan worden gewijzigd door de kleurparameter col
in te stellen op de tekennaam of hexadecimale waarde van een kleur:
require(maps)
map(col = "cornflowerblue")
Om landmassa's te vullen met de kleur in col
kunnen we stellen fill = TRUE
:
require(maps)
map(fill = TRUE, col = c("cornflowerblue"))
Een vector van elke lengte kan aan col
worden geleverd wanneer fill = TRUE
ook is ingesteld:
require(maps)
map(fill = TRUE, col = c("cornflowerblue", "limegreen", "hotpink"))
In het bovenstaande voorbeeld kleuren uit col
worden willekeurig toegewezen aan veelhoeken in de kaart die gebieden en kleuren worden gerecycled als er minder kleuren dan veelhoeken.
We kunnen ook kleurcodering gebruiken om een statistische variabele weer te geven, die optioneel in een legenda kan worden beschreven. Een kaart die als zodanig is gemaakt, staat bekend als een "choropleth".
In het volgende choropleth-voorbeeld wordt het eerste argument van map()
, dat database
op "county"
en "state"
om de werkloosheid in te kleuren met behulp van gegevens uit de ingebouwde datasets unemp
en county.fips
terwijl de staatslijnen in wit overlappen:
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 staatskaarten en geavanceerde Choropleths met Google Viz
Een veel voorkomende vraag is hoe fysiek gescheiden geografische regio's op dezelfde kaart naast elkaar kunnen worden geplaatst (gecombineerd), zoals in het geval van een choropleth die alle 50 Amerikaanse staten beschrijft (het vasteland met Alaska en Hawaii naast elkaar).
Het maken van een aantrekkelijke kaart met 50 staten is eenvoudig wanneer u Google Maps gebruikt. Interfaces naar de API van Google zijn de pakketten googleVis
, ggmap
en 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)
De functie gvisGeoChart()
vereist veel minder codering voor een choropleth te creëren ten opzichte van oudere mapping methoden, zoals map()
uit het pakket maps
. Met de parameter colorvar
kan een statistische variabele eenvoudig worden colorvar
, op een niveau dat wordt bepaald door de parameter locationvar
. De verschillende opties doorgegeven aan options
als een lijst laten aanpassen van de kaart's details zoals de grootte ( height
), de vorm ( markers
) en kleurcodering ( colorAxis
en colors
).
Interactieve grafische kaarten
Het plotly
pakket maakt vele soorten interactieve plots mogelijk, inclusief kaarten. Er zijn een paar manieren om een kaart in plotly
. Geef de kaartgegevens zelf (via plot_ly()
of ggplotly()
), gebruik de "native" toewijzingsmogelijkheden van plot_geo()
via plot_geo()
of plot_mapbox()
), of zelfs een combinatie van beide. Een voorbeeld van het zelf aanleveren van de kaart zou zijn:
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)
)
Voor een combinatie van beide benaderingen plot_ly()
voor plot_geo()
of plot_mapbox()
in het bovenstaande voorbeeld. Zie het overzichtelijke boek voor meer voorbeelden.
Het volgende voorbeeld is een "strikt native" benadering die het kenmerk layout.geo gebruikt om de esthetiek en het zoomniveau van de kaart in te stellen. Het maakt ook gebruik van de database world.cities
van maps
om de Braziliaanse steden te filteren en boven op de "native" kaart te plotten.
De belangrijkste variabelen: poph
is een tekst met de stad en de bevolking (die wordt weergegeven bij muisaanwijzer); q
is een geordende factor uit het kwantiel van de populatie. ge
heeft informatie voor de lay-out van de kaarten. Zie de pakketdocumentatie voor meer informatie.
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)')
Dynamische HTML-kaarten maken met folder
Leaflet is een open-source JavaScript-bibliotheek voor het maken van dynamische kaarten voor het web. RStudio schreef R-bindingen voor Leaflet, beschikbaar via het leaflet
pakket , gebouwd met htmlwidgets
. Folderkaarten integreren goed met de ecosystemen RMarkdown en Shiny .
De interface is doorverbonden met behulp van een leaflet()
-functie om een kaart te initialiseren en daaropvolgende functies die kaartlagen toevoegen (of verwijderen). Vele soorten lagen zijn beschikbaar, van markeringen met pop-ups tot polygonen voor het maken van choropleth-kaarten. Variabelen in het data.frame dat wordt doorgegeven aan leaflet()
zijn toegankelijk via functiestijl ~
quote.
Om de datasets state.name
en state.center
kaart te 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; klik voor dynamische versie.) Dynamische folderkaarten in glanzende applicaties
Het Leaflet- pakket is ontworpen om te integreren met Shiny
In de ui roept u leafletOutput()
en in de server roept u 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)
Reactieve invoer die de expressie renderLeaflet
beïnvloedt, zorgt er echter voor dat de hele kaart opnieuw wordt getekend telkens wanneer het reactieve element wordt bijgewerkt.
Gebruik daarom de functie leafletProxy()
om een actieve kaart te wijzigen.
Normaal gesproken gebruikt u leaflet
om de statische aspecten van de kaart te maken en leafletProxy
om de dynamische elementen te beheren, bijvoorbeeld:
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)