- Оригинальный адрес:Data Visualization with Bokeh in Python, Part I: Getting Started
- Оригинальный автор:Will Koehrsen
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:Starrier
Улучшите визуализацию данных тура
Сложный статистический анализ не имеет смысла, если нет эффективного способа сообщить результаты. Это то, что я испытал в недавнем исследовательском проекте, где мы использовалиНаука о данных для повышения энергоэффективности зданий. Последние несколько месяцев один из членов моей команды работал надwavelet transforms, методика анализа частотных составляющих временных рядов. Метод дал положительные результаты, но ей было трудно его объяснить, и, к счастью, она не запуталась в технических деталях.
Возмущенная, она спросила меня, могу ли я использовать визуальное представление, чтобы проиллюстрировать трансформацию. Я использовал что-то под названиемgganimate
Пакет R за несколько минут создает простую анимацию, показывающую, как метод преобразует временной ряд. Теперь члены моей команды могут заменить трудоемкие словесные описания интуитивным пониманием того, как работает технология. Я пришел к выводу, что мы можем провести самый тщательный анализ, но, в конце концов, все, что люди хотят видеть, это гифка! Это шутка, но за этим стоит истина: неспособность сформулировать результаты может повлиять на результаты, а визуализация данных часто является лучшим способом представить результаты вашего анализа.
Ресурсы, доступные для науки о данных, быстро растут, вполе визуализацииОсобенно бросается в глаза, кажется, новая попытка недели. С этими технологическими достижениями у них постепенно появилась общая тенденция: увеличение интерактивности. Людям нравится просматривать данные в виде статической фигуры, но они предпочитают использовать данные и использовать данные, чтобы увидеть влияние изменений параметров на результаты. В моем исследовании отчет используется, чтобы сказать владельцам, изменив использование кондиционера, сколько времени вы можете сэкономить электроэнергию, но если им дать таблицу, они могут взаимодействовать, они могут выбирать разные графики, чтобы наблюдать, как время без воздействуя на электричество, этот подход более эффективен. В последнее время, вдохновленный тенденцией интерактивного картографирования, а также желанием освоить новые инструменты, я научился использовать именнойBokehБиблиотека Python. Я показал пример функции взаимодействия Bokeh на приборной панели, созданной для моего исследовательского проекта:
Хотя я не могу поделиться всем кодом этого проекта, я могу создать пример полностью интерактивного приложения Bokeh, используя общедоступные данные. Эта серия статей проведет вас через весь процесс создания приложения с боке. В первой статье мы рассмотрим основные элементы Боке, на которые мы будем опираться в следующих статьях, в этой серии статей мы будем использоватьнабор данных nycflights13, который имеет записи о более чем 300 000 полетов с 2013 года. Сначала мы сосредоточимся на визуализации одной переменной, в данном случае задержки прибытия рейса в минутах, и начнем с построения базовой гистограммы, которая является классическим способом отображения расширения и положения непрерывной переменной.Полный код можно посмотреть на GitHubПервый ноутбук Jupyter можетздесьВидеть. Этот пост посвящен визуальным элементам, поэтому я призываю всех ознакомиться с кодом, если они хотят увидеть скучные, но важные шаги по очистке и форматированию данных!
Основы боке
Основная концепция Боке заключается в построении одного слоя за раз. Сначала мы создаем граф, затем добавляем к графу имяglyphsЭлементы. (Для тех, кто использует ggplot, концепция глифов по сути такая же, как и идея геоглифов, они добавляются к одному «слою» за раз.) В зависимости от желаемого использования глифы могут принимать различные формы: круги Формы, линии, участки, полосы, дуги и т. д. Давайте сделаем базовую диаграмму, используя квадраты и круги, чтобы проиллюстрировать концепцию глифов. Во-первых, мы используемfigure
Метод рисует диаграмму, а затем добавляет наши глифы к рисунку, вызывая соответствующий метод, передавая данные. Наконец, показываем сюжет (я использую Jupyter Notebook, если вызватьoutput_notebook
, вы увидите соответствующий рисунок).
# bokeh 基础
from bokeh.plotting import figure
from bokeh.io import show, output_notebook
# 创建带标签的空白图
p = figure(plot_width = 600, plot_height = 600,
title = 'Example Glyphs',
x_axis_label = 'X', y_axis_label = 'Y')
# 示例数据
squares_x = [1, 3, 4, 5, 8]
squares_y = [8, 7, 3, 1, 10]
circles_x = [9, 12, 4, 3, 15]
circles_y = [8, 4, 11, 6, 10]
# 添加方形 glyph
p.square(squares_x, squares_y, size = 12, color = 'navy', alpha = 0.6)
# 添加圆形 glyph
p.circle(circles_x, circles_y, size = 12, color = 'red')
# 设置为在笔记本中输出情节
output_notebook()
# 显示绘图
show(p)
Это приводит к немного скучному графику ниже:
Хотя мы можем легко сделать эту диаграмму в любой галерее для рисования, мы можем бесплатно получить некоторые инструменты с рисованием боке справа, включая функции панорамирования, масштабирования и сохранения рисунка. Эти инструменты настраиваются и пригодятся, когда мы хотим изучить наши данные.
Теперь мы начинаем показывать данные о задержке рейса. Прежде чем перейти к графику, мы должны загрузить данные и кратко проверить их (жирныйдля выходного кода):
# 将 CSV 中的数据读入
flights = pd.read_csv('../data/flights.csv', index_col=0)
# 兴趣栏的统计数据汇总
flights['arr_delay'].describe()
count 327346.000000
mean 6.895377
std 44.633292
min -86.000000
25% -17.000000
50% -5.000000
75% 14.000000
max 1272.000000
Сводная статистика определяет наши решения: у нас 327 346 рейсов с минимальной задержкой -86 минут, максимальной задержкой 1272 минуты, поразительный 21 час! Квантиль 75% составляет всего 14 минут, поэтому мы можем предположить, что числа выше 1000 минут, скорее всего, являются выбросами (что не означает, что они незаконны, просто экстремальны). Я сосредоточусь на гистограмме задержки от -60 до 120 минут.
Гистограммаявляется распространенным выбором для первоначальной визуализации одной переменной, поскольку она показывает распределенные данные. Позиции x — это значения, которые группируют переменную по интервалам в ячейки, а высота каждого столбца представляет количество (количество) точек данных для каждого интервала. В нашем случае позиция x будет представлять задержку прибытия в минутах, а высота — количество рейсов в соответствующем бине. Боке не имеет встроенной гистограммы, но мы можем использоватьquad
глиф для указания нижнего, верхнего, нижнего и правого полей каждой полосы.
Чтобы создать данные для гистограммы, мы используемnumpy,[histogram](https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.histogram.html)
,function, который вычисляет числовое значение для каждого указанного интервала точек данных. Мы используем длину 5 минут в качестве функции, которая будет вычислять количество рейсов, задержанных за каждые пять минут затраченного времени. После генерации данных мы помещаем их вpandas dataframe для всех данных, хранящихся в объекте. Код здесь не очень важен для понимания боке, но, учитывая популярность Numpy и панд в науке о данных, он все же несколько полезен.
"""Bins will be five minutes in width, so the number of bins
is (length of interval / 5). Limit delays to [-60, +120] minutes using the range."""
arr_hist, edges = np.histogram(flights['arr_delay'],
bins = int(180/5),
range = [-60, 120])
# 将信息放入 dataframe
delays = pd.DataFrame({'arr_delay': arr_hist,
'left': edges[:-1],
'right': edges[1:]})
Наши данные выглядят так:
flights
столбец изleft
прибытьright
Подсчет количества рейсов в пределах каждого интервала задержки . Здесь мы можем сгенерировать новый график боке и добавить quad glpyh, указав соответствующие параметры:
# 创建空白绘图
p = figure(plot_height = 600, plot_width = 600,
title = 'Histogram of Arrival Delays',
x_axis_label = 'Delay (min)]',
y_axis_label = 'Number of Flights')
# 添加一个 quad glphy
p.quad(bottom=0, top=delays['flights'],
left=delays['left'], right=delays['right'],
fill_color='red', line_color='black')
# 显示绘图
show(p)
Большая часть работы по созданию этого графика выполняется в процессе форматирования данных, что не является обычным явлением в науке о данных! Как видно из нашего графика, опоздания распределены почти нормально,Правая имеет небольшой положительный наклон или тяжелый хвост.
Есть более простые способы создать гистограмму в Python, также используя несколько строк.[matplotlib](https://en.wikipedia.org/wiki/Matplotlib)
чтобы получить тот же результат. Однако преимущество разработки, обеспечиваемой графиками Боке, заключается в том, что они предоставляют инструменты и методы для простого добавления взаимодействия с данными на график.
добавить интерактивность
Первый тип взаимодействия, который мы обсудим в этой серии, — это пассивное взаимодействие. Это действия, которые адвокаты могут выполнять без изменения отображаемых данных. они называютсяinspectors, так как они позволяют пользователям просматривать более подробные данные «опроса». Полезный инспектор — это когда пользовательская мышь перемещается по точке данных и вызывается.Наведите курсор в Боке, появится всплывающая подсказка.
Основная подсказка при наведении
Чтобы добавить всплывающую подсказку, нам нужно изменить источник данных с dataframe на fromColumnDataSource, ключевая концепция Bokeh.Это объект, предназначенный для рисования, он содержит данные, а также методы и свойства. ColumnDataSource позволяет нам аннотировать графики и взаимодействовать с ними, а также может быть построен из фреймов данных pandas. Фактические данные хранятся в словаре, доступ к которому можно получить через свойство данных ColumnDataSource. Здесь мы создаем источник из источника данных и смотрим на ключи в словаре данных, которые соответствуют столбцам фрейма данных.
# 导入 ColumnDataSource 类
from bokeh.models import ColumnDataSource
# 将 dataframe 转换为 列数据源
src = ColumnDataSource(delays)
src.data.keys()
dict_keys(['flights', 'left', 'right', 'index'])
Когда мы используем CloumDataSource для добавления глифов, мы передаем CloumnDataSource какsource
Параметры передаются, а имена столбцов указываются с помощью строк:
# 这次添加一个带有源的 quad glyph
p.quad(source = src, bottom=0, top='flights',
left='left', right='right',
fill_color='red', line_color='black')
Обратите внимание, как код ссылается на определенные столбцы данных, такие как «рейсы», «левый» и «правый», вместо того, чтобы использовать его, как раньше.df['column']
Формат.
HoverTool в боке
Синтаксис HoverTool на первый взгляд может показаться сложным, но со временем вы обнаружите, что их легко создавать. мы будемHoverTool
пример какtooltips
так какКортеж PythonПередайте его, где первый элемент является меткой для данных, а второй элемент извлекает конкретные данные, которые мы хотим выделить. Мы можем использовать «$» для ссылки на любое свойство на графике, например, положение x или y, или мы можем использовать «@» для ссылки на определенное поле в источнике. Это может показаться немного запутанным, поэтому вот пример HoverTool, где мы можем сделать и то, и другое:
# 使用 @ 引用我们自己的数据字段
# 使用 $ 在图上的位置悬停工具
h = HoverTool(tooltips = [('Delay Interval Left ', '@left'),
('(x,y)', '($x, $y)')])
Здесь мы используем «@» для ссылки на ColumnDataSource (который соответствует «левому» столбцу исходного фрейма данных)left
поле данных и используйте '$' для ссылки на позицию (x,y) курсора. Результат выглядит следующим образом:
Показывать всплывающие подсказки для различных ссылок на данные
Позиция (x,y) — это позиция мыши, которая не очень полезна для нашей гистограммы, поскольку мы пытаемся найти муху на заданном столбце, соответствующем верхней части столбца. Чтобы исправить это, мы изменим наш экземпляр всплывающей подсказки, чтобы он ссылался на правильный столбец. Форматирование отображения данных во всплывающих подсказках может разочаровать, поэтому я обычно создаю еще один столбец в фрейме данных с правильным форматированием. Например, если бы я хотел, чтобы моя всплывающая подсказка показывала все отделение для данного бара, я бы создал столбец форматирования во фрейме данных:
# 添加一个列,显示每个间隔的范围
delays['f_interval'] = ['%d to %d minutes' % (left, right) for left, right in zip(delays['left'], delays['right'])]
Затем я конвертирую фрейм данных в CloumnDataSource и получаю доступ к столбцу в вызове HoverTool. Приведенный ниже код создает график с помощью инструмента наведения, который ссылается на два столбца форматирования, и добавляет этот инструмент на график.
# 创建一个空白绘图
p = figure(plot_height = 600, plot_width = 600,
title = 'Histogram of Arrival Delays',
x_axis_label = 'Delay (min)]',
y_axis_label = 'Number of Flights')
# 这次,添加带有源的 quad glyph
p.quad(bottom=0, top='flights', left='left', right='right', source=src,
fill_color='red', line_color='black', fill_alpha = 0.75,
hover_fill_alpha = 1.0, hover_fill_color = 'navy')
# 添加引用格式化列的悬停工具
hover = HoverTool(tooltips = [('Delay', '@f_interval'),
('Num of Flights', '@f_flights')])
# 绘图样式
p = style(p)
# 将悬停工具添加到图中
p.add_tools(hover)
# 显示绘图
show(p)
В стиле Боке мы добавляем элементы в таблицу, добавляя элементы к исходной диаграмме. Обратите внимание, что вp.quad
В вызове глифа есть несколько дополнительных параметровhover_fill_alpha
а такжеhover_fill_color
, эти параметры изменяют стиль глифа, когда мы наводим указатель мыши на полосу. я также добавилstyle
функцию (см. соответствующий код в примечаниях). Эстетический процесс скучен, поэтому обычно я пишу функцию, применимую к любому сюжету. Когда я использую стили, я делаю вещи простыми и сосредотачиваюсь на удобочитаемости меток. Основная цель графика — отображать данные, добавление ненужных элементов толькоУменьшить удобство использования чертежа!最后的绘图如下所示:
Когда мы наводим указатель мыши на разные записи, мы получаем точную статистику для этой записи, которая представляет интервал и количество полетов в этом интервале. Если вы довольны рисунком, вы можете сохранить его в файле html, чтобы поделиться им:
# 导入保存函数
from bokeh.io import output_file
# 指定输出文件并保存
output_file('hist.html')
show(p)
Внешний вид и заключение
Я сделал много графиков, чтобы получить рабочий процесс Bokeh, так что не волнуйтесь, если вам кажется, что вам нужно многому научиться. В этой серии руководств мы получим больше практики! Хотя боке может показаться сложной задачей, его преимущества очевидны, когда мы хотим расширить наши визуальные эффекты за пределы простых статичных изображений. Получив базовую диаграмму, мы можем улучшить визуальные эффекты, добавив дополнительные элементы. Например, если бы мы хотели увидеть задержки прибытия авиакомпаний, мы могли бы сделать интерактивный график, который позволил бы пользователям выбирать и сравнивать авиакомпании. Мы сохраним активные взаимодействия (те, которые изменяют отображаемые данные) для следующей статьи, но вот что мы можем сделать сейчас:
Активное взаимодействие требует большего количества сценариев, но это дает нам возможность использовать Python! (Если кто хочет посмотреть код сюжета перед следующим постомможно посмотреть здесь. )
В этой серии статей я хочу подчеркнуть, что Boken или любой другой библиотечный инструмент никогда не будет универсальным решением для всех нужд рисования. Боке позволяет пользователям изучать сюжеты, но для других приложений, таких как простыеИсследовательский анализ данных,matplotlib
Такая легкая библиотека может быть более эффективной. Эта серия разработана, чтобы дать вам альтернативу инструментам рисования, требующим более требовательного решения. Чем больше библиотек вы знаете, тем эффективнее вы сможете использовать инструменты визуализации для решения поставленных задач.
Я всегда рад конструктивной критике и отзывам. можно в твиттере@koehrsen_willсвяжитесь со мной по.
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,товар,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.