Рубрики
Без рубрики

Использование Plotly для интерактивной визуализации данных в Python

Автор оригинала: Usman Malik.

Использование библиотеки Plotly для интерактивной визуализации данных в Python

В моей предыдущей статье я объяснил , как библиотека Pandas может быть использована для построения графиков базовых и временных рядов. Хотя библиотеки Pandas , Matplotlib и Seaborn являются отличными библиотеками для построения графиков данных , они могут строить только статические графики. Статические сюжеты подобны простым неинтерактивным изображениям. В большинстве случаев для передачи информации достаточно статических графиков. Однако в некоторых случаях вы можете захотеть добавить интерактивность пользователя к своим сюжетам.

В этой статье мы увидим, как библиотека Python Plotly может быть использована для построения интерактивных графиков. Мы построим географические данные с помощью plotly и объясним, как пользователь может взаимодействовать с такими графиками.

Установка Необходимых Библиотек

Чтобы установить библиотеку Plotly с помощью утилиты “pip”, необходимо выполнить следующую команду:

$ pip install plotly

В дополнение к Plotly мы также будем использовать Cufflinks , который работает как соединитель между библиотекой Pandas и Plotly и помогает нам строить интерактивные графики непосредственно с помощью фрейма данных Pandas.

Чтобы установить запонки с помощью pip, выполните следующий сценарий:

$ pip install cufflinks

Импорт Необходимых Библиотек

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

Прежде чем мы сможем запустить Plotly в Jupyter notebook, который я использую для запуска своих скриптов, мне нужно импортировать библиотеки Plotly и Cufflinks вместе с Numpy и Pandas, как обычно.

Следующий сценарий импортирует библиотеки Numpy и Pandas:

import pandas as pd
import numpy as np
%matplotlib inline

Далее нам нужно импортировать автономные версии модулей Plotly, которые мы будем использовать в этой статье. Это делает следующий сценарий:

from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot

Прежде чем мы сможем выполнить наши скрипты, нам нужно подключить JavaScript к нашей записной книжке. Поскольку сюжетные сюжеты являются интерактивными, они используют JavaScript за кулисами. Сценарии, которые мы собираемся запустить, будут выполняться в записной книжке Jupyter. Чтобы подключить Jupyter notebook к JavaScript, нам нужно выполнить следующий скрипт:

init_notebook_mode(connected=True)

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

import cufflinks as cf
cf.go_offline()

Теперь у нас есть все, что нам нужно, чтобы рисовать интерактивные графические графики внутри наших блокнотов Jupyter.

Plotly для основных сюжетов

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

Набор данных

Набор данных, который мы будем использовать для этого раздела, – это набор данных “Советы”, загружаемый по умолчанию вместе с библиотекой Seaborn. Набор данных содержит информацию о сумме, потраченной группой людей на обед и ужин. Набор данных содержит пол, цену, чаевые, возраст, размер, день, время и то, были ли люди, которые обедали или ужинали, курильщиками или нет.

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

import seaborn as sns

dataset = sns.load_dataset('tips')

dataset.head()

Вывод скрипта выглядит следующим образом:

Из выходных данных вы можете видеть, что наш набор данных содержит три числовых столбца: total_bill , tip и size и четыре категориальных столбца: sex , smoker , day и time .

Прежде чем использовать Plotly для построения интерактивных графиков, давайте вспомним, как мы использовали Панд для построения статических графиков. Давайте вызовем метод plot() в нашем фрейме данных, чтобы увидеть, как Панды строят статические графики. Мы построим значения для столбцов “total_bill”, “tip” и “sex”. Посмотрите на следующий сценарий:

dataset2 = dataset[["total_bill", "tip", "size"]]
dataset2.plot()

Вы можете видеть, что для построения графика мы просто вызвали метод plot в нашем фрейме данных.

Выход:

Из выходных данных вы можете увидеть статический линейный график для столбцов “total_bill” и “tips”.

Теперь давайте посмотрим, как мы можем рисовать интерактивные сюжеты с помощью Plotly. В разделе, где мы импортировали библиотеки, мы импортируем функцию plot() из модуля plotly.offline . Чтобы построить интерактивные графики с помощью Pandas dataframe, нам просто нужно вызвать метод iplot() вместо метода plot . Взгляните на следующий пример:

dataset2.iplot()

После выполнения описанного выше сценария вы должны увидеть интерактивный линейный график для столбцов total_bill , tip и sex , как показано ниже:

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

В остальной части раздела мы построим некоторые из наиболее часто используемых интерактивных сюжетов с использованием Plotly.

Барный участок

Чтобы построить интерактивную линейчатую диаграмму с помощью Plotly, вы можете использовать функцию iplot () . Вам нужно передать “bar” в качестве значения параметра kind функции plot () . Кроме того, вам нужно передать список категориальных столбцов, для которых вы хотите построить свои графики, в атрибут x . Наконец, числовой столбец передается в качестве значения в атрибут y . Следующий сценарий строит гистограмму для столбцов time и sex на оси x и total_bill на оси y.

dataset.iplot(kind='bar', x=['time', 'sex'],y='total_bill')

Выход:

Из выходных данных вы можете видеть, что для общего счета были построены четыре бара. Столбики показывают все возможные комбинации значений в столбцах sex и time .

В дополнение к указанию столбцов для столбчатых графиков вы можете просто вызвать агрегатную функцию в фрейме данных Pandas, а затем вызвать функцию iplot() и передать “bar” в качестве значения атрибута kind . Это построит полосу для каждого числового столбца в соответствии с агрегатной функцией. Например, если вы хотите построить гистограмму, содержащую средние значения для столбцов total_bill , tip и size , вы можете использовать следующий скрипт:

dataset.mean().iplot(kind='bar')

Выход:

В выходных данных вы можете увидеть гистограммы со средними значениями для столбцов total_bill , tip и size .

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

dataset.mean().iplot(kind='barh')

Выход:

В выходных данных вы можете увидеть горизонтальные гистограммы для средних значений столбцов total_bill , tip и size .

Точечная диаграмма

Чтобы построить интерактивную точечную диаграмму, вам нужно передать “scatter” в качестве значения параметра kind функции iplot () . Кроме того, вам нужно передать имена столбцов для осей x и y. Следующий сценарий строит точечную диаграмму для столбца total_bill по оси x и столбца tip по оси y.

dataset.iplot(kind='scatter', x='total_bill', y='tip', mode='markers')

Выход:

Наведите курсор мыши на интерактивный график, чтобы увидеть изменяющиеся значения столбцов total_bill и tip .

Сюжет коробки

В одной из моих предыдущих статей я объяснил, что такое коробочный сюжет и как мы можем нарисовать его с помощью библиотеки Seaborn. Прямоугольная диаграмма отображает квартильную информацию для числовых столбцов. Расстояние между нижним усом и нижней частью коробки показывает первый квартиль. Расстояние между нижней частью коробки и серединой коробки отображает второй квартиль. Точно так же расстояние от середины коробки до верхнего конца коробки количественно определяет третий квартиль, в то время как расстояние от верхней части коробки до верхнего уса отображает последний квартиль.

Используя Plotly, вы можете рисовать интерактивные коробочные графики. Все, что вам нужно сделать, это передать значение box as параметру kind функции iplot () , как показано ниже:

dataset2.iplot(kind='box')

В выходных данных вы увидите прямоугольники для всех числовых столбцов данных, т. е. total_bill , tip и size . Output:

Сюжет Hist

Библиотека Plotly также может быть использована для построения интерактивных графиков гистограмм для любого столбца набора данных. Для этого вы должны передать “hist” в качестве значения параметру kind функции plot () . Вы также можете указать количество ячеек с помощью атрибута bins . Следующий скрипт строит гистограмму для столбца total_bill :

dataset['total_bill'].iplot(kind='hist',bins=25)

Выход:

График Матрицы Рассеяния

Диаграмма матрицы рассеяния – это в основном набор всех диаграмм рассеяния для числовых столбцов в вашем наборе данных.

dataset2.scatter_matrix()

Участок Распространения

График спреда показывает спред между двумя или более числовыми столбцами в любой конкретной точке. Например, чтобы увидеть спред между total_bill и tip , вы можете использовать функцию спреда следующим образом:

dataset[['total_bill','tip']].iplot(kind='spread')

Выход:

Из выходных данных вы можете видеть, что по мере увеличения total_bill увеличивается и спред между total_bill и tip .

3D Графики

Наконец, помимо 2D-графиков, вы также можете создавать трехмерные интерактивные графики с помощью библиотеки Plotly. Например, чтобы увидеть 3D-график для столбцов total_bill , tip и size , выполните следующий скрипт.

dataset2 = dataset[["total_bill", "tip", "size"]]
data = dataset2.iplot(kind='surface', colorscale='rdylbu')

На выходе вы можете видеть 3D-график, вы можете перемещать, поворачивать его, увеличивать и уменьшать масштаб графика.

Выход:

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

Plotly для географических участков

Чтобы нарисовать географические участки с помощью Plotly, мы будем использовать карты Choropleth. Карты Choropleth – это специальные типы плотных графиков, которые используются для построения географических данных. Подробная документация о том, как использовать карты choropleth, доступна здесь .

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

import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot

init_notebook_mode(connected=True)
import pandas as pd

Географические карты для Соединенных Штатов

Есть четыре шага к рисованию географических карт с помощью Plotly.

Шаг 1: Создайте словарь данных

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

map_data = dict(type='choropleth',
            locations=['MI', 'CO', 'FL', 'IN'],
            locationmode='USA-states',
            colorscale='Portland',
            text=['Michigan', 'Colorado', 'Florida', 'Indiana'],
            z=[1.0,2.0,3.0,4.0],
            colorbar=dict(title="USA States")
           )

Вам нужно указать значения для нескольких ключей в словаре данных. Они заключаются в следующем:

  1. type : Поскольку мы используем карты choropleth, тип всегда будет choropleth .
  2. locations : Здесь нам нужно передать аббревиатуры для штатов, которые мы хотим отобразить на нашей карте. На нашей карте будут показаны четыре штата: “Мичиган (MI)”, ” Колорадо (CO)”, ” Флорида (FL)”, ” Индиана (IN)”.
  3. режим местоположения будет USA-state , так как мы показываем только карту Соединенных Штатов.
  4. цветовая шкала : Этот ключ используется для указания цвета участка. Проверьте документацию для получения дополнительных цветовых вариантов.
  5. text : Содержит список строк, которые будут отображаться при наведении курсора мыши на местоположение состояния.
  6. Клавиша z содержит список числовых значений, которые будут отображаться при наведении курсора мыши на местоположение состояния.
  7. colorbar – это словарь. Для ключа title можно указать текст, который будет отображаться на цветовой панели.
Шаг 2: Создайте макет

После того, как вы создали словарь данных, следующим шагом является создание словаря макета. Словарь макета для США прост, как показано в следующем сценарии.

map_layout = dict(geo = {'scope':'usa'})

Словарь берет другой словарь с именем geo . Мы передали значение “usa” для ключа escape , так как наша карта ограничена только США.

Шаг 3: Создание объекта Graph

Если вы посмотрите на раздел, где мы импортировали библиотеки, мы импортировали класс plotly.graph_objs . Третий шаг-создание объекта этого графа. Для этого нам нужно вызвать функцию Figure из объекта. Объект принимает два параметра: data и layout . Мы передадим наш словарь данных первому параметру, а словарь макета-второму параметру, как показано ниже:

map_actual = go.Figure(data=[map_data], layout=map_layout)
Шаг 4: Вызов метода iplot()

Последний шаг-вызвать функцию iplot() и передать ей объект graph, который мы создали на третьем шаге, как показано ниже:

iplot(map_actual)

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

Географические карты для Соединенных Штатов с использованием CSV

Теперь у нас есть основная идея о том, как мы можем создавать географические участки, используя карты Plotly и choropleth. Давайте теперь создадим более сложную карту. Мы увидим, как мы можем использовать данные из CSV-файла для создания географического участка. Мы создадим географическую карту, которая будет отображать ВВП на душу населения для всех штатов в Соединенных Штатах.

Набор данных

Набор данных для этого раздела можно загрузить по ссылке Kaggle , которая поставляется в формате CSV. Я изменил имя файла для удобства чтения.

Следующий сценарий импортирует набор данных и выводит его первые пять строк на консоль.

df = pd.read_csv(r'E:/state_gdp.csv')
df.head()

Вывод выглядит следующим образом:

Набор данных содержит названия штатов США в столбце Area . Набор данных также содержит ВВП на душу населения за пять лет с 2013 по 2017 год. Мы построим график данных за 2017 год.

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

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

us_state_abbrev = {
    'Alabama': 'AL',
    'Alaska': 'AK',
    'Arizona': 'AZ',
    'Arkansas': 'AR',
    'California': 'CA',
    'Colorado': 'CO',
    'Connecticut': 'CT',
    'Delaware': 'DE',
    'Florida': 'FL',
    'Georgia': 'GA',
    'Hawaii': 'HI',
    'Idaho': 'ID',
    'Illinois': 'IL',
    'Indiana': 'IN',
    'Iowa': 'IA',
    'Kansas': 'KS',
    'Kentucky': 'KY',
    'Louisiana': 'LA',
    'Maine': 'ME',
    'Maryland': 'MD',
    'Massachusetts': 'MA',
    'Michigan': 'MI',
    'Minnesota': 'MN',
    'Mississippi': 'MS',
    'Missouri': 'MO',
    'Montana': 'MT',
    'Nebraska': 'NE',
    'Nevada': 'NV',
    'New Hampshire': 'NH',
    'New Jersey': 'NJ',
    'New Mexico': 'NM',
    'New York': 'NY',
    'North Carolina': 'NC',
    'North Dakota': 'ND',
    'Ohio': 'OH',
    'Oklahoma': 'OK',
    'Oregon': 'OR',
    'Pennsylvania': 'PA',
    'Rhode Island': 'RI',
    'South Carolina': 'SC',
    'South Dakota': 'SD',
    'Tennessee': 'TN',
    'Texas': 'TX',
    'Utah': 'UT',
    'Vermont': 'VT',
    'Virginia': 'VA',
    'Washington': 'WA',
    'West Virginia': 'WV',
    'Wisconsin': 'WI',
    'Wyoming': 'WY',
}

Следующим шагом является добавление столбца в набор данных, содержащего аббревиатуры. Мы можем сделать это, сопоставив значения в столбце Area с ключами в словаре us_state_abbrev . Затем соответствующие значения могут быть добавлены во вновь созданный столбец аббревиатур, как показано ниже:

df['abbrev'] = df['Area'].map(us_state_abbrev)

Теперь, если вы снова распечатаете верхнюю часть фрейма данных с помощью функции head () , вы увидите вновь созданный столбец abbrev , как показано ниже:

df.head()

Вывод выглядит следующим образом:

Вы можете увидеть сокращения штатов в столбце abbrev . Важно отметить, что столбец Area имеет значения и для всей страны. Однако страна будет иметь соответствующую аббревиатуру NaN в столбце abbrev и поэтому будет проигнорирована при построении графика.

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

map_data = dict(type='choropleth',
            locations=df['abbrev'],
            locationmode='USA-states',
            colorscale='Reds',
            text=df['Area'],
            marker=dict(line=dict(color='rgb(255,0,0)', width=2)),
            z=df['2017'],
            colorbar=dict(title="GDP Per Capita - 2017")
           )

Вы можете видеть, что в приведенном выше скрипте для ключа locations мы передаем столбец abbrev нашего набора данных. Это означает, что географический сюжет для всех штатов в Соединенных Штатах будет напечатан на экране.

Аналогично, для ключа text мы передаем столбец “Area”, содержащий полное имя состояния. Наконец, для ключа z мы передаем ВВП на душу населения за 2017 год.

Также важно отметить, что здесь у нас есть новый ключ, то есть маркер . Это используется для создания границы между различными государствами. Значение RGB 255,0,0 значит, граница будет красной. Ширина 2 указывает, что ширина границы составляет 2 пикселя.

Следующий шаг-создание макета для нашей карты. Это делает следующий сценарий:

map_layout = dict(title='USA States GDP Per Capita - 2017',
              geo=dict(scope='usa',
                         showlakes=True,
                         lakecolor='rgb(85,173,240)')
             )

Обратите внимание, что в приведенном выше скрипте мы передаем True для ключа showlakes , что означает, что озера будут отображаться на карте и их цвет будет светло-синим, как указано значением RGB rgb(85,173,240) .

Наконец, вам нужно создать объект graph и передать ему словари данных и макетов, как мы это сделали в предыдущем разделе. Посмотрите на следующий сценарий:

map_actual = go.Figure(data=[map_data], layout=map_layout)

В качестве последнего шага нам нужно вызвать метод plot() и передать ему наш вновь созданный объект graph:

iplot(map_actual)

Как только вы выполните описанный выше сценарий, вы увидите карту Соединенных Штатов с ВВП на душу населения. Более светлые по цвету государства имеют меньший ВВП, чем более темные по цвету.

Географические карты мира

В предыдущих разделах мы видели графические карты для Соединенных Штатов. В этом разделе мы рассмотрим, как построить географические карты мира. Процесс остается более или менее похожим. В качестве первого шага мы создадим словарь данных, а затем словарь компоновки и объект graph. Наконец, мы будем использовать функцию plot() для построения графика.

Набор данных

Набор данных, который мы собираемся использовать, содержит данные о населении мира в разрезе стран за 1960-2016 годы. Мы будем строить географическую карту мира, отображающую население каждой страны на 2016 год.

Набор данных можно загрузить по этой ссылке Kaggle . Набор данных будет загружен в формате CSV.

Следующий скрипт импортирует набор данных и отображает его первые пять строк с помощью метода head () .

df = pd.read_csv(r'E:/world_pop.csv')
df.head()

Следующее изображение содержит скриншот вывода:

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

map_data = dict(
        type='choropleth',
        locations=df['Country Code'],
        z=df['2016'],
        text=df['Country'],
        colorbar={'title': 'World Population 2016'},
      )

Из приведенного выше сценария вы можете видеть, что единственное изменение, которое мы сделали, – это ключ locations ; теперь мы передаем “Код страны” вместо аббревиатур для штата. Это обязательное требование для построения географической карты мира. Для ключа text мы передаем значения из столбца “Страна”, содержащего полное название страны. Аналогично, для ключа z мы передаем значения из столбца “2016”, потому что это столбец, содержащий значения населения за 2016 год.

Следующим шагом является создание словаря макетов. Посмотрите на следующий сценарий:

map_layout = dict(
    title='World Population 2016',
    geo=dict(showframe=False)
)

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

Далее нам нужно создать объект Plotly graph и передать ему как данные, так и созданные нами словари компоновки, как показано ниже:

map_actual = go.Figure(data=[map_data], layout=map_layout)

В качестве последнего шага нам нужно вызвать функцию pilot() и передать ей только что созданный объект graph.

Вывод должен выглядеть следующим образом:

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

Ищете более подробное руководство по Plotly и другим библиотекам визуализации Python? Посмотрите Визуализация данных в Python для получения большого ресурса о 9 самых популярных библиотеках, включая их уникальные функции, сильные стороны и нюансы.

Вывод

Plotly-это чрезвычайно полезная библиотека Python для интерактивной визуализации данных. В этой статье мы рассмотрели, как можно использовать Plot для построения базовых графиков, таких как точечные графики, линейные графики, гистограммы и базовые трехмерные графики. Мы также видели, как Plotly можно использовать для построения географических участков с помощью карты choropleth. Например, мы строим географические планы как для Соединенных Штатов, так и для всего мира.

Я бы посоветовал вам изучить библиотеку choropleth и попробовать попрактиковаться в создании еще нескольких географических сюжетов, так как есть много возможностей для изучения. Подробная документация по картам choropleth доступна по этой ссылке: https://plot.ly/python/choropleth-maps/ .