Библиотека Bokeh в Python

В этом руководстве мы узнаем, как использовать библиотеку Bokeh в Python. Большинство из вас слышали о matplotlib, numpy, seaborn и т.д., поскольку это очень популярные библиотеки для графики и визуализации.

Что отличает Bokeh от этих библиотек, так это то, что он предоставляет динамическую визуализацию, которая поддерживается современными браузерами (поскольку визуализирует графику с использованием JS и HTML) и, следовательно, может использоваться для веб-приложений с очень высоким уровнем интерактивности.

Bokeh также доступно на языках R и Scala, однако его аналог на Python используется чаще, чем другие.

Установка Boken

Самый простой способ установить Boken с помощью Python – через диспетчер пакетов pip. Если в вашей системе установлен pip, выполните следующую команду, чтобы загрузить и установить Bokeh:

$ pip install bokeh

Примечание: если вы выберете этот метод установки, в вашей системе уже должен быть установлен numpy.

Другой метод установки Bokeh – через дистрибутив Anaconda. Просто зайдите в терминал или командную строку и запустите эту команду:

$ conda install bokeh

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

$ bokeh --version

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

Примеры по кодированию

В этой части мы будем выполнять несколько практических примеров, вызывая функции библиотеки Bokeh для создания интерактивных визуализаций. Начнем с попытки сделать квадрат.

Примечание. Комментарии в кодах в этой статье очень важны, они не только объяснят код, но и передадут другую значимую информацию. Кроме того, могут быть «альтернативные» или дополнительные функции, которые будут закомментированы, но вы можете попробовать запустить их, раскомментировав эти строки.

Построение основных фигур

Здесь мы указываем координаты x и y для точек, которые будут последовательно отслеживаться при рисовании линии. Функция figure создает экземпляр объекта figure, в котором хранятся конфигурации графика, который вы хотите построить.

Здесь мы можем указать как диапазон X, так и диапазон Y графика, который мы установили от 0 до 4, что охватывает диапазон наших данных. Затем метод линии рисует линию между нашими координатами, которая имеет форму квадрата.

from bokeh.io import output_file, output_notebook
from bokeh.plotting import figure, show

x = [1, 3, 3, 1, 1] 
y = [1, 1, 3, 3, 1]

# Display the output in a separate HTML file 
output_file('Square.html', title='Square in Bokeh')
#output_notebook() # Uncomment this line to use iPython notebook

square = figure(title='Square Shape',
             plot_height=300, plot_width=300,
             x_range=(0, 4), y_range=(0, 4))

# Draw a line using our data
square.line(x, y)
#square.circle(x, y) # Uncomment this line to add a circle mark on each coordinate

# Show plot
show(square)

Возможно, вы заметили в коде, что есть альтернатива функции output_file, которая вместо этого показывает результат в записной книжке Jupyter с помощью функции output_notebook. Если вы предпочитаете использовать записную книжку, замените функцию output_file на output_notebook в коде этой статьи.

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

Вывод:

Квадратный участок

На изображении выше вы можете видеть инструменты справа (панорамирование, масштабирование рамки, масштабирование колеса, сохранение, сброс, справка – сверху вниз). Эти инструменты позволяют вам взаимодействовать с графиком.

Еще одна важная вещь, которая пригодится, это то, что после каждого вызова функции «show», если вы создаете новый объект «figure», последующий вызов функции «show» с новой фигурой, переданной в качестве аргумента, приведет к ошибке. Чтобы устранить эту ошибку, запустите следующий код:

from bokeh.plotting import reset_output

reset_output()

Метод reset_output сбрасывает идентификатор фигуры, который в настоящее время удерживает функция show, чтобы ей можно было назначить новый.

То, что мы сделали до сих пор, довольно простое, давайте теперь попробуем составить несколько уравнений линий или карт на одном графике. Самый простой пример для этого – попытаться нарисовать линии для уравнений y = x, y = x ^ 2 и y = x ^ 3. Итак, давайте посмотрим, как мы можем сделать график, чтобы отображать их все сразу, используя Bokeh:

from bokeh.plotting import figure, output_file, show

# Declare data for our three lines
x = [1, 2, 3, 4, 5, 6]
x_square = [i**2 for i in x]
x_cube = [i**3 for i in x]

# Declare HTML file as output for when show is called
output_file("Eqs.html")

lines = figure(title='Line Comparisons', x_range=(0, 8), y_range=(0,100),
   x_axis_label='X-Axis', y_axis_label='Y-Axis') 

lines.line(x, x, legend="y = x", line_width=3) # Line for the equation y=x
lines.square(x, x, legend="y = x", size=10) # Add square boxes on each point on the line

lines.line(x, x_square, legend="y = x^2", line_width=3) #Line for the equation y=x^2
lines.circle(x, x_square, legend="y = x^2", size=10) # Add circles to points since it partially overlaps with y=x

lines.line(x, x_cube, legend="y = x^3", line_width=3) # Line for the equation y=x^3
lines.square(x, x_cube, legend="y = x^2", size=10) # Add square boxes on each point of the line

# Display the graph
show(lines)

Вывод:

График сравнения линий

Прежде чем мы продолжим рисовать еще несколько графиков, давайте сначала изучим несколько интересных приемов, которые сделают вашу графику более интерактивной, а также эстетичной. Для этого мы прежде всего узнаем о различных инструментах, которые использует библиотека Bokeh, кроме тех, которые отображаются рядом (либо сверху, либо справа) от графика. Пояснения будут даны в комментариях к коду ниже:

# Use the same plot data as above
x = [1, 2, 3, 4, 5, 6]
x_square = [i**2 for i in x]
x_cube = [i**3 for i in x]

#now let's make the necessary imports. Note that, in addition to the imports we made in the previous code, we'll be importing a few other things as well, which will be used to add more options in the 'toolset'. 

# Same imports as before
from bokeh.plotting import figure, output_file, show

# New imports to add more interactivity in our figures
# Check out Bokeh's documentation for more tools (these are just two examples)
from bokeh.models import HoverTool, BoxSelectTool

output_file("Eqs.html")

# Add the tools to this list
tool_list = [HoverTool(), BoxSelectTool()]

# Use the tools keyword arg, otherwise the same
lines = figure(title='Line Comparisons', x_range=(0, 8), y_range=(0, 100),
   x_axis_label='X-Axis', y_axis_label='Y-Axis', tools=tool_list)

# The rest of the code below is the same as above
lines.line(x, x, legend="y = x", line_width=3)
lines.square(x, x, legend="y = x", size=10)

lines.line(x, x_square, legend="y = x^2", line_width=3)
lines.circle(x, x_square, legend="y = x^2", size=10)

lines.line(x, x_cube, legend="y = x^3", line_width=3)
lines.square(x, x_cube, legend="y = x^2", size=10)

# Display the graph
show(lines)

Вывод:

Дополнительные инструменты

На картинке выше вы можете увидеть две дополнительные опции, добавленные к ранее доступным инструментам. Теперь вы также можете навести указатель мыши на любую точку данных, и будут показаны ее подробности, а также вы можете выбрать определенную группу точек данных, чтобы выделить их.

Обработка категориальных данных

Следующее, что мы научимся делать с помощью библиотеки Bokeh, – это обработка категориальных данных. Для этого мы сначала попробуем построить гистограмму. Чтобы было интересно, давайте попробуем создать диаграмму, которая представляет количество чемпионатов мира, выигранных Аргентиной, Бразилией, Испанией и Португалией. Звучит интересно? Давайте его закодируем.

from bokeh.io import show, output_file
from bokeh. plotting import figure

output_file("cups.html")

# List of teams to be included in the chart. Add or
# remove teams (and their World Cups won below) to
# see how it affects the chart
teams = ['Argentina', 'Brazil', 'Spain', 'Portugal']

# Activity: We experimented with the Hover Tool and the
# Box Select tool in the previous example, try to
# include those tools in this graph

# Number of world cups that the team has won
wc_won = [5, 3, 4, 2]

# Setting toolbar_location=None and tools="" essentially
# hides the toolbar from the graph
barchart = figure(x_range=teams, plot_height=250, title="WC Counts",
           toolbar_location=None, tools="")

barchart.vbar(x=teams, top=wc_won, width=0.5)

# Acitivity: Play with the width variable and see what
# happens. In particular, try to set a value above 1 for
# it 

barchart.xgrid.grid_line_color = 'red'
barchart.y_range.start = 0

show(barchart)

Вывод:

График подсчета кубка мира

Вы заметили что-то на графике выше? Это довольно просто и не впечатляет, не правда ли? Давайте внесем некоторые изменения в приведенный выше код и сделаем его более красочным и эстетичным. У bokeh есть много вариантов, чтобы помочь нам в этом. Посмотрим, что мы можем с этим сделать:

# Mostly the same code as above, except with a few
# additions to add more color to our currently dry graph

from bokeh.io import show, output_file
from bokeh.plotting import figure

# New imports below
from bokeh.models import ColumnDataSource

# A was added 4 to the end of Spectral because we have 4
# teams. If you had more or less you would have used that
# number instead
from bokeh.palettes import Spectral4

from bokeh.transform import factor_cmap

output_file("cups.html")

teams = ['Argentina', 'Brazil', 'Spain', 'Portugal']
wc_won = [5, 3, 4, 2]

source = ColumnDataSource(data=dict(teams=teams, wc_won=wc_won, color=Spectral4))

barchart = figure(x_range=teams, y_range=(0,8), plot_height=250, title="World Cups Won",
           toolbar_location=None, tools="")

barchart.vbar(x='teams', top='wc_won', width=0.5, color='color', legend='teams', source=source) 

# Here we change the position of the legend in the graph
# Normally it is displayed as a vertical list on the top
# right. These settings change that to a horizontal list
# instead, and display it at the top center of the graph
barchart.legend.orientation = "horizontal" 
barchart.legend.location = "top_center"

show(barchart)

Вывод:

Улучшенный график подсчета Кубка мира

Очевидно, новый график выглядит намного лучше, чем раньше, с добавленной интерактивностью.

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

Заключение

Подводя итог, в этом уроке мы узнали о работе с библиотекой Bokeh в Python. Мы увидели, как загрузить и установить ее с помощью дистрибутива pip или anaconda. Мы использовали программы библиотеки Bokeh для создания интерактивных и динамических визуализаций разных типов, а также с использованием разных типов данных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *