Поиск…


Вступление

См. Также ввод-вывод для географических данных

Базовое картографирование с помощью карты () с карт упаковки

Карта функций 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)

choropleth

Функция 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)

введите описание изображения здесь



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow