В моей предыдущей статье я объяснил, как можно использовать библиотеку Pandas для построения графиков основных и временных рядов. Хотя библиотеки Pandas , Matplotlib и Seaborn являются отличными библиотеками для построения графиков данных, они могут строить только статические графики. Статические графики похожи на простые неинтерактивные изображения. В большинстве случаев для передачи информации достаточно статических графиков. Однако в некоторых случаях вы можете захотеть добавить в свои графики возможность взаимодействия с пользователем.
В этой статье мы увидим, как библиотеку Python Plotly можно использовать для построения интерактивных графиков. Мы нанесем на карту географические данные, используя сюжетно, и объясним, как пользователь может взаимодействовать с такими графиками.
Установка необходимых библиотек
Чтобы установить библиотеку Plotly с помощью утилиты «pip», вам необходимо выполнить следующую команду:
$ pip install plotly
В дополнение к Plotly мы также будем использовать Cufflinks , который работает как связующее звено между библиотекой Pandas и Plotly и помогает нам строить интерактивные графики напрямую с использованием фрейма данных Pandas.
Чтобы установить Cufflinks с помощью pip, выполните следующий скрипт:
$ pip install cufflinks
Импорт необходимых библиотек
Plotly - это, по сути, онлайн-библиотека, в которой хранятся ваши визуализации данных, однако она также предоставляет автономный пакет данных, который можно использовать для рисования интерактивных графиков в автономном режиме.
Прежде чем мы сможем запустить Plotly в блокноте Jupyter, который я использую для запуска своих скриптов, мне нужно как обычно импортировать библиотеки 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 к нашей записной книжке. Поскольку графики Plotly интерактивны, они негласно используют JavaScript. Скрипты, которые мы собираемся запустить, будут выполняться в записной книжке Jupyter. Чтобы подключить блокнот 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()
Результат скрипта выглядит так:
{.ezlazyload .img-responsive}
Из выходных данных вы можете видеть, что наш набор данных содержит три
числовых столбца: total_bill
, tip
и size
а также четыре столбца
по категориям: sex
, smoker
, day
и time
.
Прежде чем использовать Plotly для рисования интерактивных графиков,
давайте вспомним, как мы использовали Pandas для построения статических
графиков. Давайте вызовем метод plot()
в нашем фрейме данных, чтобы
увидеть, как Pandas строит статические графики. Мы построим график
значений для столбцов total_bill, tip и sex. Взгляните на следующий
сценарий:
dataset2 = dataset[["total_bill", "tip", "size"]]
dataset2.plot()
Вы можете видеть, что для построения графика мы просто вызвали plot
в
нашем фрейме данных.
Выход:
{.ezlazyload .img-responsive}
На выходе вы можете увидеть статический линейный график для столбцов total_bill и tips.
Теперь давайте посмотрим, как мы можем рисовать интерактивные графики с
помощью Plotly. В разделе, куда мы импортировали библиотеки, мы
импортируем функцию plot()
из модуля plotly.offline
Для построения
интерактивных графиков с использованием панды dataframe, нам просто
нужно вызвать iplot()
метод вместо plot
метод. Взгляните на
следующий пример:
dataset2.iplot()
После выполнения вышеуказанного сценария вы должны увидеть интерактивный
линейный график для total_bill
, tip
и sex
как показано ниже:
Если вы наведете курсор на график, вы увидите, что значения меняются. Вы можете увеличивать и уменьшать масштаб графика, используя параметры, доступные в верхнем правом углу графика. Вы также можете добавлять и удалять столбцы на графике. Наконец, вы также можете сохранить график как статическое изображение.
В оставшейся части раздела мы построим некоторые из наиболее часто используемых интерактивных графиков с помощью Plotly.
Барный участок
Чтобы построить интерактивную гистограмму с помощью Plotly, вы можете
использовать iplot()
. Вам нужно пройти «бар» в качестве значения для
kind
параметра iplot()
функции. Кроме того, вам необходимо передать
список категориальных столбцов, для которых вы хотите построить графики,
атрибуту x
Наконец, числовой столбец передается как значение в атрибут
y
Следующий скрипт строит гистограмму для time
и sex
по оси x и
total_bill
по оси y.
dataset.iplot(kind='bar', x=['time', 'sex'],y='total_bill')
Выход:
Из выходных данных видно, что для общей суммы счета построено четыре
столбца. Полосы показывают все возможные комбинации значений в столбцах
sex
и time
Помимо указания столбцов для гистограмм, вы можете просто вызвать
агрегатную функцию в iplot()
и передать «bar» в качестве значения для
атрибута kind
Это построит столбец для каждого числового столбца в
соответствии с агрегатной функцией. Например, если вы хотите построить
гистограмму, содержащую средние значения для total_bill
, tip
и
size
, вы можете использовать следующий скрипт:
dataset.mean().iplot(kind='bar')
Выход:
На выходе вы можете увидеть гистограммы со средними значениями для
total_bill
, tip
и size
.
Помимо графиков с вертикальными полосами, вы также можете строить
графики с горизонтальными полосами. Все, что вам нужно сделать, это
передать "barh" в качестве атрибута для kind
, как показано в
следующем скрипте:
dataset.mean().iplot(kind='barh')
Выход:
На выходе вы можете увидеть графики горизонтальных total_bill
, tip
и size
.
Диаграмма рассеяния
Для того, чтобы построить интерактивный график рассеяния, вам необходимо
пройти «разброс» в качестве значения для kind
параметра iplot()
функции. Кроме того, вам необходимо передать имена столбцов для осей x и
y. Следующий скрипт строит total_bill
диаграмму для столбца total_bill
по оси x и tip
по оси y.
dataset.iplot(kind='scatter', x='total_bill', y='tip', mode='markers')
Выход:
Наведите указатель мыши на интерактивный график, чтобы увидеть
изменяющиеся значения для total_bill
и tip
.
Коробчатый сюжет
В одной из своих предыдущих статей я объяснил, что такое коробчатая диаграмма и как мы можем нарисовать ее с помощью библиотеки Seaborn. Ящичковая диаграмма отображает информацию о квартилях для числовых столбцов. Расстояние между нижним усом и нижней частью поля отображает первый квартиль. Расстояние между нижней частью и серединой поля отображает второй квартиль. Точно так же расстояние от середины прямоугольника до верхнего края прямоугольника количественно определяет третий квартиль, а расстояние от верха поля до верхнего уса отображает последний квартиль.
Используя Plotly, вы можете рисовать интерактивные блочные диаграммы.
Все , что вам нужно сделать , это передать box
в качестве значения
kind
параметра iplot()
функции , как показано ниже:
dataset2.iplot(kind='box')
На выходе вы увидите прямоугольные диаграммы для всех числовых столбцов
данных, то есть total_bill
, tip
и size
.
Выход:
Исторический сюжет
Библиотеку Plotly также можно использовать для построения графиков
интерактивных гистограмм для любого столбца в наборе данных. Чтобы
сделать это, вы должны пройти «Hist» в качестве значения kind
параметра iplot()
функции. Вы также можете указать количество ящиков,
используя атрибут bins
Следующий скрипт строит гистограмму для столбца
total_bill
dataset['total_bill'].iplot(kind='hist',bins=25)
Выход:
График матрицы рассеяния
График матрицы разброса - это в основном набор всех графиков разброса для числовых столбцов в наборе данных.
dataset2.scatter_matrix()
Распространение сюжета
График распределения показывает разброс между двумя или более числовыми
столбцами в любой конкретной точке. Например, чтобы увидеть спред между
total_bil
и tip
, вы можете использовать функцию распространения
следующим образом:
dataset[['total_bill','tip']].iplot(kind='spread')
Выход:
Из выходных данных вы можете видеть, что по total_bill
увеличения
total_bill спред между total_bill
и tip
также увеличивается.
3D графики
Наконец, в дополнение к 2D-графикам вы также можете создавать трехмерные
интерактивные графики с помощью библиотеки Plotly. Например, чтобы
увидеть трехмерный график для total_bill
, tip
и size
, выполните
следующий скрипт.
dataset2 = dataset[["total_bill", "tip", "size"]]
data = dataset2.iplot(kind='surface', colorscale='rdylbu')
На выходе вы можете увидеть трехмерный график, вы можете перемещать, поворачивать его, увеличивать и уменьшать масштаб графика.
Выход:
В этом разделе мы увидели некоторые из наиболее часто используемых интерактивных графиков, предлагаемых 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")
)
Вам нужно указать значения для нескольких ключей в словаре данных. Вот они:
type
: поскольку мы используем хороплетные карты, тип всегда будетchoropleth
.locations
: Здесь нам нужно передать аббревиатуры для состояний, которые мы хотим отобразить на нашей карте. На нашей карте будут отображаться четыре штата: «Мичиган (Мичиган)», «Колорадо (Колорадо)», «Флорида (Флорида),« Индиана (IN) ».locationmode
будет дляUSA-state
так как мы отображаем карту только для США.colorscale
: этот ключ используется для указания цвета графика. Обратитесь к документации, чтобы узнать о других цветовых вариантах.text
: содержит список строк, которые будут отображаться при наведении указателя мыши на местоположение состояния.z
содержит список числовых значений, которые будут отображаться при наведении указателя мыши на местоположение состояния.colorbar
- это словарь. Дляtitle
вы можете указать текст, который будет отображаться на цветной полосе.
Шаг 2. Создайте макет
После того, как вы создали словарь данных, следующим шагом будет создание словаря макета. Словарь макета для США прост, как показано в следующем сценарии.
map_layout = dict(geo = {'scope':'usa'})
Словарь принимает другой словарь с именем geo
. Мы прошли значение
«США» для scope
ключа , так как наша карта ограничиваются только США.
Шаг 3: Создайте объект графика
Если вы посмотрите на раздел, в который мы импортировали библиотеки, мы
импортировали класс plotly.graph_objs
Третий шаг - создать объект
этого графа. Для этого нам нужно вызвать Figure
из объекта. Объект
принимает два параметра: data
и layout
. Мы передадим наш словарь
данных первому параметру, а словарь макета - второму параметру, как
показано ниже:
map_actual = go.Figure(data=[map_data], layout=map_layout)
Шаг 4: вызов метода iplot ()
Последний шаг - вызвать iplot()
и передать ей объект графика, который
мы создали на третьем шаге, как показано ниже:
iplot(map_actual)
На выходе вы увидите географический график для четырех штатов США. Вы
можете видеть, что остальная часть состояния не была окрашена, поскольку
мы не указали никакой информации об этих состояниях. Если вы наведете
указатель мыши на цветные состояния, вы увидите соответствующие значения
text
и z
которые мы указали при создании нашего словаря данных.
Географические карты США в формате CSV
Теперь у нас есть основное представление о том, как мы можем создавать географические графики с помощью карт Plotly и choropleth. Давайте теперь создадим более сложную карту. Мы увидим, как мы можем использовать данные из файла CSV для создания географического графика. Мы создадим географическую карту, на которой будет отображаться ВВП на душу населения для всех штатов США.
Набор данных
Набор данных для этого раздела можно загрузить по этой ссылке Kaggle , которая поставляется в формате CSV. Я изменил имя файла для удобства чтения.
Следующий сценарий импортирует набор данных и выводит его первые пять строк на консоль.
df = pd.read_csv(r'E:/state_gdp.csv')
df.head()
Результат выглядит так:
{.ezlazyload .img-responsive}
Набор данных содержит названия штатов США в столбце 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',
}
Следующим шагом является добавление в набор данных столбца, содержащего
сокращения. Мы можем сделать это, сопоставив значения в Area
с ключами
в словаре us_state_abbrev
Соответствующие значения затем можно
добавить во вновь созданный столбец сокращений, как показано ниже:
df['abbrev'] = df['Area'].map(us_state_abbrev)
Теперь, если вы снова распечатаете верхнюю часть фрейма данных с помощью
функции head()
, вы увидите недавно созданный abbrev
, как показано
ниже:
df.head()
Результат выглядит так:
{.ezlazyload .img-responsive}
Вы можете увидеть аббревиатуры штатов в столбце 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
ключа мы передаем столбец «Область», который
содержит полное название штата. Наконец, для z
мы передаем ВВП на душу
населения за 2017 год.
Также важно отметить, что у нас есть новый ключ, то есть marker
. Это
используется для создания границы между разными состояниями. Значение
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()
и передать
ему наш вновь созданный объект графика:
iplot(map_actual)
Выполнив приведенный выше сценарий, вы увидите карту США с ВВП на душу населения. У более светлых штатов меньше ВВП, чем у более темных.
{.ezlazyload .img-responsive}
Географические карты мира
В предыдущих разделах мы видели графические карты США. В этом разделе мы
увидим, как построить географические карты мира. Процесс остается
более-менее похожим. В качестве первого шага мы создадим словарь данных,
а затем словарь макета и объект графика. Наконец, мы будем использовать
iplot()
для построения графика.
Набор данных
Набор данных, который мы собираемся использовать, содержит население мира по странам за 1960-2016 годы. Мы построим географическую карту мира, на которой будет показано население каждой страны на 2016 год.
Набор данных можно скачать по этой ссылке Kaggle . Набор данных будет загружен в формате CSV.
Следующий скрипт импортирует набор данных и отображает его первые пять
строк с помощью метода head()
df = pd.read_csv(r'E:/world_pop.csv')
df.head()
Следующее изображение содержит снимок экрана с выводом:
{.ezlazyload .img-responsive}
Давайте создадим словарь данных, в котором будет храниться информация о данных, которые мы хотим построить, из только что загруженного набора данных о населении.
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 и передать ему как данные, так и словари макета, которые мы создали, как показано ниже:
map_actual = go.Figure(data=[map_data], layout=map_layout)
В качестве последнего шага нам нужно вызвать iplot()
и передать ей
только что созданный объект графика.
Результат должен выглядеть так:
На выходе вы можете увидеть карту всего мира вместе с плотностью населения. Вы можете видеть, что карта Индии и Китая темнее по сравнению с другими странами, поскольку они намного более населены по сравнению с менее населенными европейскими странами. Если вы наведете указатель мыши на любую страну, вы должны увидеть название страны вместе с общей численностью населения.
Ищете более подробное руководство по Plotly и другим библиотекам визуализации Python? Просмотрите визуализацию данных в Python,{.ebook-link} чтобы получить отличный ресурс о 9 самых популярных библиотеках, включая их уникальные функции, сильные стороны и нюансы.
Заключение
Plotly - чрезвычайно полезная библиотека Python для интерактивной визуализации данных. В этой статье мы увидели, как мы можем использовать Plotly для построения основных графиков, таких как точечные графики, линейные графики, гистограммы и базовые трехмерные графики. Мы также увидели, как Plotly можно использовать для построения географических графиков с помощью картографической карты. В качестве примера мы строим географические сюжеты как для Соединенных Штатов, так и для всего мира.
Я бы посоветовал вам изучить библиотеку хороплетов и попытаться попрактиковаться в создании еще нескольких географических сюжетов, так как есть много возможностей для изучения. Подробная документация по хороплетным картам доступна по этой ссылке: https://plot.ly/python/choropleth-maps/ .