ПИТОН. НАУКА ДАННЫХ. ГЕОВИЗУАЛИЗАЦИЯ
Битва за интерактивную географическую визуализацию, часть 7 — Боке
Использование библиотеки боке для создания красивых интерактивных географиков
ГДЕ МЫ ОСТАЛИСЬ
В этой серии мы уже определили шесть (6) способов создания красивых графиков георассеяния.
- Holoviews — Битва за интерактивную географическую визуализацию, часть 1 — интерактивный географик с использованием одной строки кода
- Plotly Express —Битва за интерактивную географическую визуализацию. Часть 2. Интерактивный географик с использованием одной строки кода
- Plotly Go — Битва за интерактивную географическую визуализацию, часть 3 — Plotly Graph Objects (Go)
- Altair — Битва за интерактивную географическую визуализацию. Часть 4 — Altair
- Folium — Битва за интерактивную географическую визуализацию. Часть 5 — Folium
- Greppo — Битва за интерактивную географическую визуализацию, часть 6 — Greppo
В этой статье мы узнаем, как это сделать с боке. Теперь Боке встроен в 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 — замечательный инструмент для изучения и добавления в набор инструментов современных ученых, занимающихся геопространственными данными.
Дайте мне знать, что вы думаете!