R Language
Введение в географические карты
Поиск…
Вступление
См. Также ввод-вывод для географических данных
Базовое картографирование с помощью карты () с карт упаковки
Карта функций map()
из maps
пакетов обеспечивает простую отправную точку для создания карт с R.
Базовую карту мира можно сделать следующим образом:
require(maps)
map()
Цвет контура можно изменить, установив параметр цвета, col
, либо на имя символа, либо на шестнадцатеричное значение цвета:
require(maps)
map(col = "cornflowerblue")
Чтобы заполнить массами земли цветом col
мы можем установить fill = TRUE
:
require(maps)
map(fill = TRUE, col = c("cornflowerblue"))
Вектор любой длины может быть задан в col
если также задано значение fill = TRUE
:
require(maps)
map(fill = TRUE, col = c("cornflowerblue", "limegreen", "hotpink"))
В приведенном выше примере цвета из col
назначаются произвольно для полигонов на карте, представляющей регионы, и цвета возвращаются, если цветов меньше, чем полигонов.
Мы также можем использовать цветовое кодирование для представления статистической переменной, которая может быть опционально описана в легенде. Карта, созданная как таковая, известна как «choropleth».
Следующий пример choropleth устанавливает первый аргумент map()
, который представляет собой database
для "county"
и "state"
для безработицы цветового кода, используя данные из встроенных наборов данных unemp
и county.fips
то время как county.fips
строки состояния в белом:
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 государственных карт и продвинутых хороптов с помощью Google Viz
Общий вопрос заключается в том, как сопоставить (объединить) физически отдельные географические регионы на одной карте, например, в случае с choropleth, описывающим все 50 американских государств (материк с Аляской и Гавайями сопоставлен).
Создание привлекательной карты состояния 50 просто при использовании Google Maps. Интерфейсы API Google включают в себя пакеты googleVis
, ggmap
и 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)
Функция gvisGeoChart()
требует гораздо меньше кодирования для создания choropleth по сравнению с более старыми методами сопоставления, такими как map()
из maps
пакетов. Параметр colorvar
позволяет легко раскрашивать статистическую переменную на уровне, указанном параметром locationvar
. Различные параметры , передаваемые options
в виде списка позволяют настроить детали карте, такие как размер ( height
), форма ( markers
), и цветовое кодирование ( colorAxis
и colors
).
Интерактивные графические карты
plotly
пакет позволяет использовать множество интерактивных сюжетов, включая карты. Существует несколько способов создания карты в plotly
. Либо plot_ly()
данные карты самостоятельно (через plot_ly()
или ggplotly()
), используйте возможности «нативного» отображения plot_geo()
через plot_geo()
или plot_mapbox()
) или даже комбинацию обоих. Примером предоставления карты может быть:
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)
)
Для комбинации обоих подходов, swap plot_ly()
для plot_geo()
или plot_mapbox()
в приведенном выше примере. См. Сюжетную книгу для большего количества примеров.
Следующий пример - это «строго родной» подход, который использует атрибут layout.geo для установки эстетики и уровня масштабирования карты. Он также использует базу данных world.cities
из maps
чтобы фильтровать бразильские города и world.cities
их поверх «родной» карты.
Основные переменные: poph
- это текст с городом и его населением (который отображается при наведении мыши); q
- упорядоченный множитель из квантиля популяции. ge
имеет информацию для компоновки карт. Дополнительную информацию см. В документации к пакету .
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)')
Создание динамических HTML-карт с помощью брошюры
Листовка - это библиотека JavaScript с открытым исходным кодом для создания динамических карт для Интернета. RStudio написал R bindings для Leaflet, доступный через пакет leaflet
, построенный с помощью htmlwidgets
. Карты лифтов хорошо интегрируются с экосистемами RMarkdown и Shiny .
Интерфейс передается по каналам , используя функцию leaflet()
чтобы инициализировать карту и последующие функции, добавляя (или удаляя) слои карты. Доступны многие типы слоев: от маркеров с всплывающими окнами до полигонов для создания карт choropleth. Переменные в data.frame, переданные в leaflet()
, доступны через котировку function-style ~
.
Чтобы state.name
state.center
данных state.name
и state.center
:
library(leaflet)
data.frame(state.name, state.center) %>%
leaflet() %>%
addProviderTiles('Stamen.Watercolor') %>%
addMarkers(lng = ~x, lat = ~y,
popup = ~state.name,
clusterOptions = markerClusterOptions())
(Снимок экрана, нажмите для динамической версии.) Динамические карты листов в блестящих приложениях
Пакет Leaflet предназначен для интеграции с Shiny
В ui вы вызываете leafletOutput()
а на сервере вы вызываете 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)
Однако реактивные входы, которые влияют на выражение renderLeaflet
, заставят всю карту перерисовываться каждый раз, когда реактивный элемент обновляется.
Поэтому, чтобы изменить уже запущенную карту, вы должны использовать leafletProxy()
.
Обычно вы используете leaflet
для создания статических аспектов карты, а leafletProxy
для управления динамическими элементами, например:
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)