История путешествий вместе с Plotly Express

Моя младшая дочь отмечает места путешествий на большой физической карте мира. Я бы тоже так делал, но благодаря ей  —  у меня теперь нет своей комнаты! 

Но это совсем не проблема. Я знаю Python, так что могу создать интерактивную карту в цифровом формате. Она не занимает места и ничего не стоит. Вы всегда имеете к ней доступ откуда угодно и легко делитесь ею с друзьями. А теперь хорошая новость  —  вы тоже можете создать такую карту! 

В данном проекте Quick Success Data Science (“Наука о данных с быстрым и успешным результатом”) раскроем секрет визуализации удивительных путешествий. Для этого потребуется помощь Python, pandas и Plotly Express.

Библиотека Plotly Express

Прежде чем погрузиться в мир интерактивных карт, проверим наличие необходимых инструментов. На компьютере должны быть установлены: Python, популярная библиотека для обработки данных pandas и высокоэффективная библиотека для визуализации данных Plotly Express.

Plotly Express  —  это высокоуровневая версия графической библиотеки Plotly. Она абстрагирует большую часть трудоемкой работы по построению графиков и позволяет легко создавать привлекательные изображения посредством множества встроенных функциональностей. 

Plotly Express требует Plotly в качестве зависимости. Ее можно установить с помощью conda или pip.

Установка с conda: conda install -c plotly plotly_express.

Установка с pip: pip install plotly.

Для установки pandas используем conda install pandas или pip install pandas.

Код 

Код запускается в JupyterLab, представлен и описан ячейками. Три ячейки выполняют следующие задачи: 

  1. Импорт библиотек и установка цвета для элементов карты, таких как страны и океаны. 
  2. Создание списка посещенных стран и преобразование его в датафрейм pandas.
  3. Отображение датафрейма в виде картограммы посредством Plotly Express.

Импорт библиотек и установка цветов

Для удобства и гибкости при настройки карты присваиваем цвета четырем переменным. Одна предназначена для посещенных стран, другая  —  для непосещенных, третья  —  для границ стран и четвертая  —  для океанов. 

import plotly.express as px
import pandas as pd

# Определение цвета для элементов карты:
visited_color = 'tan'
unvisited_color = 'white'
border_color = 'darkgray'
ocean_color = 'lightblue'

Список стран 

На этом этапе готовим для Python список всех стран, в которых вы когда-либо проживали и которые посещали. Для обеспечения согласованности и точности данных Plotly соблюдает стандарт ISO 3166 для кодов и названий стран. Если вы не уверены в корректности названия, например “Соединенные Штаты” или “Соединенные Штаты Америки”, посетите данный сайт.  

Далее преобразуем этот список в датафрейм pandas pd.DataFrame для удобства использования с Plotly Express:

# Список стран, которые я посетил или проживал:
countries_visited = ['Australia', 'Portugal', 'United States', 'Canada',
'Mexico', 'Bahamas', 'Scotland', 'England', 'France',
'Spain', 'Norway', 'Italy', 'Greece', 'Turkey',
'New Zealand', 'Kazakhstan', 'Hungary', 'Egypt', 'Nigeria',
'Qatar', 'Bahrain', 'United Arab Emirates', 'Malaysia',
'United Kingdom', 'Iceland']

# Преобразование списка в датафрейм для Plotly Express:
df = pd.DataFrame({'Country': countries_visited})
df.head()
Первые 5 строк датафрейма

Построение карты 

Plotly Express поставляется со встроенными методами для построения более 30 стандартных типов графиков. Картограмма создается методом px.choropleth(). Такие карты применяют цвета для отображения значений в определенных областях. В данном случае значение 1 обозначает посещенную страну, а значение 0  —  непосещенную. Область представляет собой страну на карте. 

Обратите внимание, как используются переменные “цвета”, присвоенные в первой ячейке, в качестве аргументов методов. Также отметим тот факт, что Plotly Express работает как со словарями, так и с датафреймами: 

# Определение изображения:
fig = px.choropleth(df,
width=1000, height=700,
locations='Country',
locationmode='country names',
color_discrete_sequence=[visited_color])

# Выбор проекции, элементов карты, цвета:
fig.update_geos(projection_type="natural earth",
showcountries=True,
countrycolor=border_color,
showland=True, landcolor=unvisited_color,
showocean=True, oceancolor=ocean_color,
showlakes=False,
showrivers=False,
showframe=True)

# Отключение легенды и форматирование заголовка Title:
fig.update_layout(showlegend=False,
title={'text': "Countries I've Visited",
'y': 0.90,
'x': 0.5,
'xanchor': 'center',
'yanchor': 'top',
'font': {'size': 45,
'family': 'Times New Roman'}})
Готовая карта путешествий 

На этой карте все посещенные страны обозначены одним цветом (коричневым), и отсутствует легенда. Plotly Express обходится без нее. Чтобы узнать название страны, вы просто наводите на нее курсор, после чего появляется всплывающее окно:  

Карта путешествий с активным всплывающим окном для Нигерии 

В Plotly Express данные, появляющиеся при наведении курсора, могут включать несколько столбцов датафрейма. Такая особенность позволяет вносить больше информации в всплывающее окно, например даты посещения стран, сопровождающие лица и т. д. Попробуйте уместить все это на физической карте! 

Помимо всплывающих подсказок, Plotly Express предоставляет функциональности масштабирования и панорамирования для более удобной работы с картой. Вы можете экспортировать карту в виде HTML-файла и свободно обмениваться ею с друзьями и семьей. А можете встроить ее в сайт или блог. 

Добавление легенды 

Как по мне, так созданная карта выглядит отлично, но при желании можно добавить легенду. В этом случае меняем код из раздела “Построение карты” на следующий скрипт: 

# Сортировка датафрейма для перечисления стран в легенде согласно заданному порядку. 
df = df.sort_values(by='Country', ascending=True)

# Установка цвета с помощью столбца "Country" и применение дискретной цветовой последовательности:
fig = px.choropleth(df,
width=1000, height=700,
locations='Country',
locationmode='country names',
color='Country',
color_discrete_sequence=px.colors.qualitative.Light24)

fig.update_geos(projection_type="natural earth",
showcountries=True,
countrycolor=border_color,
showland=True, landcolor=unvisited_color,
showocean=True, oceancolor=ocean_color,
showlakes=False,
showrivers=False,
showframe=True)

# Включение легенды и изменение положения заголовка Title:
fig.update_layout(showlegend=True,
title={'text': "Countries I've Visited",
'y': 0.85,
'x': 0.445,
'xanchor': 'center',
'yanchor': 'top',
'font': {'size': 40}})
Карта путешествий с легендой, содержащей список посещенных стран

Если кажется, что голубой цвет океана не сочетается с цветами легенды, то следует просто изменить переменную ocean_color на white и перезапустить код: 

Карта путешествий с легендой и ocean color, установленным в значение white 

Проблема здесь в том, что дискретные цветовые шкалы Plotly предоставляют не более 24 цветов. Если вы побывали более чем в 24 странах, то цвета начнут повторяться. Например, в данном случае одинаковыми цветами обозначены Австралия и США. Решается эта проблема путем создания собственной цветовой шкалы в соответствии с инструкциями на сайте Plotly. 

Дополнительные идеи по созданию карты 

Вы можете расширять содержательное наполнение карты согласно вашим потребностям. Plotly Express включает детализацию для штатов и округов, а также позволяет отмечать такие элементы карты, как города. 

Для визуализации деталей путешествия на карте можно преобразовать названия мест в географические координаты. Такой процесс называется геокодирование. Он позволяет Plotly Express точно отображать места путешествий. К счастью, эта библиотека легко интегрируется с сервисами геокодирования, такими как Mapbox, что значительно упрощает решение этой задачи. 

Заключение 

Создание интерактивной карты путешествий не требует физической стены или финансовых затрат. С помощью Python, pandas и Plotly Express вы сможете создать отличную интерактивную карту с отображением всех совершенных путешествий. Благодаря рассмотренному проекту в вашем распоряжении есть инструменты и необходимые знания, чтобы начать картографическую историю собственных приключений! 

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Lee Vaughan: Keep Track of Your Travels With Plotly Express

Предыдущая статьяФреймворк The Composable Architecture
Следующая статья20 экспертных советов по эффективному использованию Python