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

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

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

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

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

$ pip install plotly

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

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

$ pip install cufflinks

Импорт

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

Прежде чем мы сможем запустить Plotly в блокноте Jupyter, который я использую для запуска своих скриптов, мне нужно как обычно импортировать библиотеки Plotly и Cufflinks вместе с 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 к записной книжке. Поскольку графики Plotly интерактивны, они негласно используют JavaScript. Скрипты, которые мы собираемся запустить, будут выполняться в записной книжке Jupyter. Чтобы подключить блокнот с JavaScript, нам нужно выполнить следующий скрипт:

init_notebook_mode(connected=True)

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

import cufflinks as cf
cf.go_offline()

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

Для основных графиков

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

Набор данных

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

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

import seaborn as sns

dataset = sns.load_dataset('tips')

dataset.head()

Результат скрипта выглядит так:

Импорт набора данных

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

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

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

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

Вывод:

Построение графика в dataframe

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

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

dataset2.iplot()

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

Интерактивный линейный график

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

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

bar

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

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

Вывод:

Передача bar в качестве значения параметра

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

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

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

Вывод:

Вызов функции iplot()

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

Помимо графиков с вертикальными полосами, вы также можете строить графики с горизонтальными полосами. Все, что вам нужно сделать, это передать «barh» в качестве атрибута для параметра kind, как показано в следующем скрипте:

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

Вывод:

Постройка графика с горизонтальными полосами

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

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

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

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

Вывод:

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

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

Диаграмма Box

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

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

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

dataset2.iplot(kind='box')

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

Диаграмма hist

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

Диаграмма hist

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

dataset2.scatter_matrix()

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

График распространение

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

График распространение 

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

3D графики

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

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

3D графики

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

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

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

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.
  2. Location: здесь нам нужно передать аббревиатуры для состояний, которые мы хотим отобразить на нашей карте. На нашей карте будут отображаться четыре штата: «Мичиган (Мичиган)», «Колорадо (Колорадо)», «Флорида (Флорида),« Индиана (IN) ».
  3. locationmode будет для штата США, так как мы отображаем карту только для США.
  4. colorscale: этот ключ используется для указания цвета графика.
  5. text: содержит список строк, которые будут отображаться при наведении указателя мыши на местоположение состояния.
  6. Клавиша z содержит список числовых значений, которые будут отображаться при наведении указателя мыши на местоположение состояния.
  7. colorbar – это словарь. Для ключа заголовка вы можете указать текст, который будет отображаться на цветной полосе.
Шаг 2: создайте макет
map_layout = dict(geo = {'scope':'usa'})

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

Шаг 3: создайте объект графика
map_actual = go.Figure(data=[map_data], layout=map_layout)
Шаг 4: вызов метода iplot()
iplot(map_actual)

Вызов метода iplot()

Географические карты США в формате CSV

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

Набор данных

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

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

Набор данных

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

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

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',
}
df['abbrev'] = df['Area'].map(us_state_abbrev)
df.head()

Аббревиатуры штатов в столбце сокращений

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

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")
           )

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

Точно так же для текстового ключа мы передаем столбец «Область», который содержит полное название штата. Наконец, для ключа 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).

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

Географические карты США

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

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

Набор данных

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

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

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'},
      )

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

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

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

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

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

Созданный объект графика

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

Заключение

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

Один комментарий к “Библиотека Plotly для интерактивной визуализации данных в Python

  1. Здравствуйте.спасибо за урок. Подскажите.пожалуйста. после установки plotly and cyfflinks, я ввожу по инструкции «import pandas as pd», но выходит ошибка — «import» не является внутренней или внешней
    командой, исполняемой программой или пакетным файлом.. Подскажите, как это исправить

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

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