Python, Программирование

Визуализируй просто: интерактивная карта через Folium

Время прочтения: 4 мин.

Визуализация данных – это то, что помогает нам легче понять и обработать большие или маленькие массивы «сухих» цифр.

В этой статье я расскажу о своем опыте работы с одним из инструментов визуализации в форме интерактивной карты на Jupyter Notebook – Folium. Folium позволяет объединить экосистему языка программирования Python и Open Source библиотеку для построения интерактивных карт для сайтов Leaflet.js.

Цель создания интерактивной карты в моем случае – показать наглядно филиалы банка, в которых предоставляется услуга регистрации в Единой биометрической системе для клиентов физических лиц по данным официального сайта банка и bio.rt.ru, а также долю таких филиалов по регионам российской Федерации.

Для работы с Folium импортируем библиотеку:

import folium

И создаем главный объект, к которому будем добавлять остальные – карту:

m = folium.Map(location=[63.391522, 96.328125], zoom_start=3)

Здесь location – координаты центра отображаемой карты, zoom_start – первоначальный масштаб.

Добавим к карте регионы РФ с заполнением цветом в соответствии с долей филиалов банка с услугой регистрации – хороплет. Для отображения контуров регионов необходим файл в формате GeoJSON, и его можно взять здесь из архива – это admin_level_4.geojson. Данные для заполнения цветом возьмем из предварительно подготовленного датафрейма DF с долями share и REGION_ID регионов, совпадающими с ID регионов из файла GeoJSON.

rel_ = folium.Choropleth(
       geo_data = path_to_ GeoJSON_file, 
       name = 'Отношение числа филиалов с ЕБС ко всем',
       data = DF,
       columns=['REGION_ID', 'share'], 
       key_on='id',
       bins = 5,
       fill_color='BuGn',
       nan_fill_color='darkblue',
       nan_fill_opacity=0.5,
       fill_opacity=0.7,
       line_opacity=0.2,
       legend_name= 'Отношение числа филиалов с ЕБС ко всем',
       highlight = True,
       show = False
)

Добавляем слой хороплета к карте:

rel_.add_to(m)

Теперь можно увидеть общую картину по доступности услуги регистрации в ЕБС в филиалах банка по регионам РФ.

Добавим на карту отдельные филиалы банка с разделением по доступности услуги регистрации –маркеры двух цветов. Данные с официального сайта банка и bio.rt.ru, включая координаты филиалов, собираем через request, выделяем из них координаты и наименования филиалов.

Чтобы карта была функциональной и удобной, маркеры филиалов мы объединим в кластеры в зависимости от масштаба, что избавит нас от загромождения элементами.

Создадим группы для маркеров:

feature_group_EBS = folium.FeatureGroup(name = 'Филиалы с регистрацией ЕБС', 
show = False)
feature_group_nonEBS = folium.FeatureGroup(name = 'Филиалы без регистрации ЕБС', 
show = False)

Подготовим кластеры:

from folium.plugins import MarkerCluster
marker_cluster_EBS = MarkerCluster(name = ' cluster_ EBS ', 
                                   	popups = 'Филиалы с регистрацией ЕБС ', 
                                   	show = False, 
                                   	icon_create_function=icon_green)
marker_cluster_nonEBS = MarkerCluster(name = ' cluster_nonEBS ', 
                                   	popups = 'Филиалы без регистрации ЕБС ', 
                                   	show = False, 
                                   	icon_create_function = icon_red)

Параметр popups покажет соответствующую информацию при клике на кружок кластера. С помощью icon_create_function можно добавить строку на JavaScript, которой можно задать нужный цвет кластера (по умолчанию он меняется каждый раз в зависимости от количества маркеров в кластере).

Добавляем маркеры филиалов в соответствующие кластеры:

for lt, ln, filial_name  in zip(latitude_EBS, longitude_EBS, name_EBS):
marker_EBS = folium.Marker(
[lt, ln],
popup = filial_name,
icon = folium.Icon(color='green',icon='ok-sign'))
      marker_cluster_EBS.add_child(marker_EBS)

Добавляем кластеры в слой соответствующей группы:

feature_group_EBS.add_child(marker_EBS)
feature_group_nonEBS.add_child(marker_nonEBS)

Группы добавляем на карту:

feature_group_EBS.add_to(m)
feature_group_nonEBS.add_to(m)

Важно наличие на карте элемента по контролю слоев, с помощью которого можно включить/выключить показ элементов. Ранее в параметрах хороплета, маркеров и кластеров параметр show указан со значением False – при загрузке на карте слои не показаны.

folium.LayerControl(collapsed=True).add_to(m)

Результат можно выгрузить в отдельный HTML файл и просматривать в любом браузере, при условии доступности ресурса www.openstreetmap.org:

m.save('map.html')

В итоге, можно оценить распространённость услуги как по регионам, так и отдельным населенным пунктам.

Связка Jupyter Notebook и Folium предоставляет максимально гибкий инструмент по визуализации данных, имеющих картографическую привязку.

Советуем почитать