Используем библиотеки tidyverse, leaflet, readxl, plotly, stringr.
library(rsconnect)
library(tidyverse) # для общей обработки данных
library(leaflet) # для отображения на карте
library(readxl) # для чтения данных из файлов excel
library(plotly) # для интерактивных визуализаций
library(stringr) # для обработки текста
Загрузим файл parkovki.xlsx, содержащий информацию о перехватывающих парковках Москвы (источник: портал открытых данных Правительства Москвы data.mos.ru).
parkings = read_excel('parkovki.xlsx', sheet = 'Sheet0') %>% # Чтение данных
mutate(Longitude_WGS84 = as.numeric(Longitude_WGS84), # Преобразование долготы в числовой формат
Latitude_WGS84 = as.numeric(Latitude_WGS84), # Преобразование широты в числовой формат
CarCapacity = as.numeric(CarCapacity), # Преобразование вместимости парковок в числовой формат
District = str_replace(District, 'район | район', ''), # Сокращение длины названий районов
ParkingName = str_replace(toupper(ParkingName),
'ПЕРЕХВАТЫВАЮЩАЯ ПАРКОВКА МЕТРОПОЛИТЕНА ', '')) # Сокращение длины названий парковок
Строим карту с помощью библиотеки leaflet.
plot_01 = NA %>%
leaflet() %>% # Инициализация
addTiles() %>% # Добавление холста
addProviderTiles("OpenStreetMap.Mapnik") %>% # Выбор карты OpenStreetMap
addCircleMarkers( # Определение параметров меток
lng = parkings$Longitude_WGS84, # Добавление широты
lat = parkings$Latitude_WGS84, # Добавление долготы
clusterOptions = markerClusterOptions(), # Добавление условия кластеризации
radius = parkings$CarCapacity / 25, # Привязка радиуса метки к вместимости парковки
popup = paste(paste('<b>', parkings$MetroStation, '</b>', sep = ''), # Станция метро
paste('<u>', 'Адрес', '</u>', ': ', parkings$LocationDescription, sep = ''), # Адрес
paste('<u>', 'Расписание работы', '</u>', ': ', parkings$Schedule, sep = ''), # Расписание работы
paste('<u>', 'Вместимость', '</u>', ': ', parkings$CarCapacity, ' а/м', sep = ''), # Вместимость
sep = "<br>"), # Разделитель в подсказке
label = parkings$ParkingName # Название
)
plot_01 # Запуск визуализации
Покажем количество перехватывающих парковок по районам.
distr = parkings %>% group_by(District) %>% summarise(count = n()) %>% # Расчёт количества парковок по районам
mutate(paint = # Параметр цвета
ifelse(count >= quantile(count)[5], 'rgba(0, 34, 158, 1.0)',
ifelse(count >= quantile(count)[4], 'rgba(71, 102, 205, 1.0)',
ifelse(count >= quantile(count)[3], 'rgba(103, 115, 158, 1.0)',
'rgba(119, 128, 158, 1.0)'))))
# Построение графика с использованием plotly
plot_02 = plot_ly(distr, x = ~count, y = ~reorder(District, count),
type = 'bar', orientation = 'h',
text = ~count, textposition = 'inside', insidetextanchor = 'start',
marker = list(color = ~paint)) %>%
layout(title = paste('<b>', 'Количество перехватывающих парковок', '</b>', sep = ''),
xaxis = list(title = "", zeroline = F, showline = F, showticklabels = F, showgrid = F),
yaxis = list(title = ''),
font = list(family = 'Arial', size = 14))
plot_02 # Запуск визуализации
Покажем количество перехватывающих парковок по категориям вместимости.
b1 = 100; b2 = 150; b3 = 200; b4 = 350 # Границы категорий
colors = c('violet', 'royalblue', 'orange', 'lightseagreen', 'khaki') # Цвета категорий
capacity = parkings %>%
mutate(category = # Параметр границ категорий
ifelse(CarCapacity < b1,
paste('До ', as.character(b1), ' а/м', sep = ''),
ifelse(CarCapacity >= b1 & CarCapacity < b2,
paste('От ', as.character(b1), ' до ', as.character(b2), ' а/м', sep = ''),
ifelse(CarCapacity >= b2 & CarCapacity < b3,
paste('От ', as.character(b2), ' до ', as.character(b3), ' а/м', sep = ''),
ifelse(CarCapacity >= b3 & CarCapacity < b4,
paste('От ', as.character(b3), ' до ', as.character(b4), ' а/м', sep = ''),
paste('От ', as.character(b4), ' а/м', sep = '')))))) %>%
group_by(category) %>% summarise(count = n()) # Расчёт количества парковок по категориям вместимости
# Построение диаграммы с использованием plotly
plot_03 = plot_ly(capacity, labels = ~category, values = ~count, type = 'pie',
textposition = 'inside', textinfo = 'label+percent+value', showlegend = FALSE,
marker = list(colors = colors, line = list(color = '#FFFFFF', width = 1))) %>%
layout(title = paste('<b>', 'Перехватывающие парковки по категориям вместимости', '</b>', sep = ''),
font = list(family = 'Arial', size = 13))
plot_03 # Запуск визуализации