ПИТОН. НАУКА ДАННЫХ. ГЕОВИЗУАЛИЗАЦИЯ

Битва за интерактивную географическую визуализацию, часть 7 — Боке

Использование библиотеки боке для создания красивых интерактивных географиков

ГДЕ МЫ ОСТАЛИСЬ

В этой серии мы уже определили шесть (6) способов создания красивых графиков георассеяния.

В этой статье мы узнаем, как это сделать с боке. Теперь Боке встроен в Panel, что мы и использовали в первой статье серии.

СЮЖЕТ ПРОТИВ. БОКЕ

Статья, написанная об этом, резюмирует основное различие между двумя библиотеками. Plotly лучше, когда мы говорим о простоте использования, и, соответственно, проще использовать при создании отдельных (включая 3D) карт.

Где Bokeh сияет, так это в его способности приборной панели. Это означает, что проще создавать, размещать и стилизовать информационные панели.

Без лишних слов, давайте начнем кодирование.

КОДИРОВАНИЕ

ПОДГОТОВКА

Мы будем использовать следующие пакеты для воссоздания интерактивных карт, которые у нас есть с другими статьями:

import pandas as pd
#Transformation of Geocodes
from pyproj import Proj, transform
from bokeh.plotting import figure, save, show
from bokeh.io import output_notebook
#For the Map Tiles
from bokeh.tile_providers import get_provider, WIKIMEDIA, CARTODBPOSITRON, STAMEN_TERRAIN, STAMEN_TONER, ESRI_IMAGERY, OSM
tile_provider = get_provider(xyz.OpenStreetMap.Mapnik)
#To display properly the maps
import panel as pn
pn.extension()
import warnings
warnings.filterwarnings("ignore")

Небольшое объяснение использования библиотеки панелей здесь: Нам нужно использовать это, чтобы сделать карту доступной в наших записных книжках. Это важно, если мы хотим добавить несколько наборов данных на одну и ту же карту. . Однако обычно без их использования карта будет отображаться на отдельной веб-странице.

ЗАГРУЗИТЬ ДАННЫЕ

df = pd.read_csv('Coffee Brands Footprint.csv',
                index_col=0)

СОЗДАТЬ БАЗОВУЮ КАРТУ — ПРЕОБРАЗОВАНИЕ ГЕОКОДОВ

Как и в других статьях, нам нужно создать базовую карту, на которую будут наложены дополнительные данные.

Обратите внимание, однако, что, в отличие от других статей, мы не использовали GeoPandas. Поэтому боке нужен способ понять тип данных geometry.

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

inProj = Proj(init='epsg:3857')
outProj = Proj(init='epsg:4326')
ph_lon1, ph_lat1 = transform(outProj,inProj,115,0)
ph_lon2, ph_lat2 = transform(outProj,inProj,130,25)

Приведенные выше геокоды были сгенерированы методом проб и ошибок для получения оптимальных границ для наших карт. Я предлагаю вам сделать то же самое, если вы хотите ограничить карту определенным регионом, страной или городом для лучшей фокусировки.

Чтобы инициализировать базовую карту:

#Initialize the tile that we will use
cartodb = get_provider(CARTODBPOSITRON)
#Initialize the fig object
fig = figure(plot_width=800, plot_height=700,
             x_range=(ph_lon1, ph_lon2),
             y_range=(ph_lat1, ph_lat2),
             x_axis_type="mercator", 
             y_axis_type="mercator",
             tooltips=[
                    ("Cofee Brand", "@brand"), ("Location", "@vicinity")
                    ],
            title="Coffee Shops in the Philippines")
fig.add_tile(cartodb)
fig.xaxis.visible = False 
fig.yaxis.visible = False
show(fig)

Давайте обсудим части кодов, которые уникальны для функции фигуры Боке:

  • x_range, y_range — это границы фигуры. Ось X относится к долготе, а ось Y относится к широте. Отрегулируйте их соответствующим образом, чтобы создать желаемые границы для вашей карты.
  • x_axis_type, y_axis_type — указывает Боке, как интерпретировать ваши оси. «Меркатор» следует выбирать специально для карт не США.
  • tooltips — Список переменных, которые будут представлены во всплывающей подсказке. Формат наших интерактивных всплывающих подсказок должен соответствовать кортежу. Первый элемент кортежа — это имя, которое будет отображаться для всплывающей подсказки, а второй элемент должен быть ссылкой на источник фрейма данных. Формат должен быть «@column_name».

ПРЕОБРАЗОВАТЬ ГЕОКОДЫ

Как мы уже отмечали, пары геокодов должны быть преобразованы или «спроецированы», чтобы они имели смысл для боке. Таким образом, нам нужно использовать следующий код:

lons, lats = [], []
for lon, lat in list(zip(df["lng"], df["lat"])):
    x, y = transform(outProj,inProj,lon,lat)
    lons.append(x)
    lats.append(y)
    
df["MercatorX"] = lons
df["MercatorY"] = lats

После преобразования, если мы хотим отобразить весь набор данных сразу, без ссылки на бренд, мы можем использовать следующий код:

fig.circle('MercatorX', 'MercatorY', 
           source=df, 
           size=7,
           fill_color='red',
           line_color='red',
           line_alpha=0.5,
             fill_alpha=0.3)
show(fig)

Так как мы хотим отображать каждый бренд своим цветом, нам нужно добавить их отдельно. Этот подход для последователя серии уподоблен подходу Folium.

РАССМОТРЕНИЕ КАЖДОГО БРЕНДА КАК ОТДЕЛЬНОГО НАБОРА ДАННЫХ

Чтобы добавить разные цвета для разных брендов, нужно рассматривать каждый бренд как отдельный набор данных.

Но сначала нам нужно создать словарь цветов:

color_dict = {
    "Starbucks": ' #00704A',
    "Coffee Bean and Tea Leaf": '#362d26',
    "Coffee Project": '#654321',
    "Tim Hortons": '#dd0f2d'
}

Нам нужен новый набор рисунков, так как последний уже был закодирован красными точками.

#Doing the Fig
fig = figure(plot_width=800, plot_height=700,
             x_range=(ph_lon1, ph_lon2),
             y_range=(ph_lat1, ph_lat2),
             x_axis_type="mercator", 
             y_axis_type="mercator",
             tooltips=[
                    ("Cofee Brand", "@brand"), ("Location", "@vicinity")
                    ],
            title="Coffee Shops in the Philippines")
fig.add_tile(cartodb)

Чтобы перебрать наборы данных:

#Looping over the dataset
for i in color_dict.keys():
    temp = df[df.brand==i]
    fig.circle('MercatorX', 'MercatorY', 
           source=temp, 
           size=7,
           fill_color=color_dict[i],
           line_color=color_dict[i],
           line_alpha=0.5,
             fill_alpha=0.5)

Наконец, чтобы отобразить код, нам нужно сделать следующее:

pn.pane(fig)

Обратите внимание, что show(fig) будет работать нормально, но может отображать сообщение об ошибке, так что это не то, что мы использовали в статье.

ЗАКЛЮЧИТЕЛЬНЫЕ ЗАМЕЧАНИЯ

Из статьи мы видим, что с помощью Bokeh можно воспроизвести те же карты, которые у нас были с другими библиотеками.

Однако мы видим, что нам нужно предпринять определенные шаги, чтобы убедиться, что Bokeh понимает наши типы данных (что аналогично в случае с негеопространственными типами данных), с которыми некоторым специалистам по данным необходимо ознакомиться. .

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

Дайте мне знать, что вы думаете!