Полное руководство по тепловым картам в Seaborn с Python

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

Вступление

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

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

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

Вот две тепловые карты, которые показывают разницу в использовании Twitter двумя пользователями:

тепловые карты с морскимиводами

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

В этом примере это следующие переменные:

  1. Час дня
  2. Минута часа

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

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

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

В этом уроке мы покажем вам, как создать тепловую карту, подобную показанной выше, с помощью библиотеки Seaborn в Python.

Seaborn - это библиотека визуализации данных, построенная на основе Matplotlib. Вместе они де-факто лидеры, когда дело доходит до библиотек визуализации в Python.

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

В этом руководстве мы рассмотрим три основных раздела:

  1. Подготовка данных
  2. Построение тепловой карты
  3. Рекомендации и настройка тепловой карты

Давайте начнем!

Подготовка набора данных для создания тепловой карты с помощью Seaborn

Загрузка примера набора данных с помощью Pandas

Обратите внимание: это руководство было написано с использованием Python 3.8, Seaborn 0.11.0 и Pandas 1.1.2.

Для этого руководства мы будем использовать набор данных, который содержит временные метки твитов, опубликованных в то время двумя кандидатами в президенты США 2020 года, Джо Байденом и Дональдом Трампом

  • в период с января 2017 года по сентябрь 2020 года. created можно найти здесь .

Домашним забавным упражнением может быть создание собственного набора данных из собственных твитов или твитов друзей и сравнение ваших привычек использования социальных сетей!

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

Мы будем использовать библиотеку Pandas для загрузки и управления данными:

 import pandas as pd 

Мы можем использовать read_csv() для загрузки набора данных количества твитов. Вы можете либо передать URL-адрес, указывающий на набор данных, либо загрузить его и указать файл вручную:

 data_url = "https://bit.ly/3cngqgL" # or "path/to/biden_trump_tweets.csv" 
 df = pd.read_csv(data_url, 
 parse_dates=['date_utc'], 
 dtype={'hour_utc':int,'minute_utc':int,'id':str} 
 ) 

Всегда стоит использовать head для изучения первых нескольких строк DataFrame , чтобы ознакомиться с его формой:

 df.head() 

  я бы                 имя пользователя       date_utc                         hour_utc   minute_utc   ретвиты

0 815422340540547073 реальныйДональдТрамп 2017-01-01 05: 00: 10 + 00: 00 5 0 27134 1 815930688889352192 реальныйДональдТрамп 2017-01-02 14: 40: 10 + 00: 00 14 40 23930 2 815973752785793024 реальныйДональдТрамп 2017-01-02 17: 31: 17 + 00: 00 17 31 год 14119 3 815989154555297792 реальныйДональдТрамп 2017-01-02 18: 32: 29 + 00: 00 18 32 3193 4 815990335318982656 реальныйДональдТрамп 2017-01-02 18: 37: 10 + 00: 00 18 37 7337

Здесь мы напечатали первые 5 элементов в DataFrame . Сначала у нас есть индекс каждой строки, за которым следует id твита, username пользователя, написавшего этот твит, а также информация о времени, такая как date_utc , hour_utc и minute_utc .

Наконец, у нас есть количество retweets в конце, которое можно использовать для проверки интересной взаимосвязи между содержанием твитов и «вниманием», которое оно привлекло.

Преобразование данных в широкоформатный фрейм данных

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

Но концептуально тепловая карта требует, чтобы данные были организованы в краткой (или широкой ) форме. И на самом деле библиотека Seaborn требует, чтобы мы имели данные в этой форме для создания визуализаций тепловых карт, подобных тем, которые мы видели раньше.

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

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


имя пользователя hour_utc minute_utc реальныйДональдТрамп 12 4 реальныйДональдТрамп 13 0 реальныйДональдТрамп 12 4


Используя принцип категории, мы можем накапливать вхождения определенных свойств:


категория происшествия realDonaldTrump | 12 часов | 4 минуты 2 realDonaldTrump | 13 часов | 0 минут 1


Что мы можем затем преобразовать во что-то более дружественное к тепловым картам:


часы \ минуты 0 1 2 3 4 12 0 0 0 0 2 13 1 0 0 0 0


Здесь у нас есть часы как строки, уникальные значения, а также минуты как столбцы. Каждое значение в ячейках - это количество твитов, появившихся в то время. Например, здесь мы видим 2 твита в 12:04 и один твит в 13:01. При таком подходе у нас всего 24 строки (24 часа) и 60 столбцов. Если представить это распространение визуально, она по существу является Heatmap, хотя, с числами.

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

Технически у нас 2880 категорий. Каждая комбинация hour_utc , minute_utc и username является отдельной категорией, и мы подсчитываем количество твитов для каждой из них.

Эта агрегация проста с использованием Pandas. Час и минута создания доступны в столбцах hour_utc и minute_utc . Мы можем использовать groupby() чтобы собрать вместе все твиты для каждой комбинации имени username , hour_utc и minute_utc :

 g = df.groupby(['hour_utc','minute_utc','username']) 

Это означает, что только строки, которые имеют одинаковое значение hour_utc , minute_utc , username могут считаться экземплярами одной и той же категории.

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

 tweet_cnt = g.id.nunique() 

Это дает нам серию Pandas со счетчиками, необходимыми для построения тепловой карты:

 tweet_cnt.head() 

 hour_utc minute_utc username 
 0 0 JoeBiden 26 
 realDonaldTrump 6 
 1 JoeBiden 16 
 realDonaldTrump 11 
 2 JoeBiden 6 
 Name: id, dtype: int64 

Чтобы преобразовать это в широкоформатный DataFrame необходимый Seaborn, мы можем использовать функцию pivot()

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

Используйте loc[] чтобы выбрать количество твитов одного пользователя, а затем примените функцию pivot() Он использует уникальные значения из указанного индекса / столбцов для формирования осей результирующего DataFrame . DataFrame часы и минуты так, чтобы полученный DataFrame имел широко распространенную форму:

 jb_tweet_cnt = tweet_cnt.loc[:,:,'JoeBiden'].reset_index().pivot(index='hour_utc', columns='minute_utc', values='id') 

Затем взгляните на часть получившегося DataFrame :

 jb_tweet_cnt.iloc[:10,:9] 

minute_utc 0 1 2 3 4 5 6 7 8


hour_utc
0 26,0 16.0 6.0 7.0 4.0 24,0 2.0 2.0 9.0 1 24,0 7.0 5.0 6.0 4.0 19.0 1.0 2.0 6.0 2 3.0 3.0 3.0 NaN 5.0 1.0 4.0 8.0 NaN 3 3.0 3.0 3.0 4.0 5.0 1.0 3.0 5.0 4.0 4 1.0 1.0 1.0 2.0 NaN NaN 1.0 1.0 1.0 5 1.0 2.0 NaN NaN NaN 1.0 NaN NaN NaN 6 NaN NaN NaN NaN NaN NaN NaN NaN NaN 10 7.0 2.0 1.0 NaN NaN NaN NaN NaN NaN 11 2.0 5.0 NaN NaN NaN NaN NaN NaN NaN 12 4.0 NaN 1.0 1.0 1.0 NaN 1.0 NaN NaN

Работа с недостающими значениями

Выше мы видим, что наши преобразованные данные содержат пропущенные значения. Если для данной комбинации минут / часов не было твитов, pivot() вставляет значение Not-a-Number ( NaN ) в DataFrame .

Кроме того, pivot() не создает строку (или столбец), если в течение определенного часа (или минуты) вообще не было твитов.

См. Выше, где отсутствуют часы 7 , 8 и 9 .

Это обычное дело при предварительной обработке данных. Данные могут отсутствовать, иметь нечетные типы или записи (без проверки) и т. Д.

Seaborn отлично справляется с этими недостающими данными, он просто построит график без них, пропуская часы 7, 8 и 9. Однако наши тепловые карты будут более последовательными и интерпретируемыми, если мы введем недостающие значения. В этом случае мы знаем, что пропущенные значения на самом деле равны нулю.

Чтобы заполнить уже вставленные NaN fillna() следующим образом:

 jb_tweet_cnt.fillna(0, inplace=True) 

Чтобы вставить отсутствующие строки - убедитесь, что на DataFrame reindex() DataFrame, чтобы вставить отсутствующие индексы и их значения:

 # Ensure all hours in table 
 jb_tweet_cnt = jb_tweet_cnt.reindex(range(0,24), axis=0, fill_value=0) 
 # Ensure all minutes in table 
 jb_tweet_cnt = jb_tweet_cnt.reindex(range(0,60), axis=1, fill_value=0).astype(int) 

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

 dt_tweet_cnt = tweet_cnt.loc[:,:,'realDonaldTrump'].reset_index().pivot(index='hour_utc', columns='minute_utc', values='id') 
 dt_tweet_cnt.fillna(0, inplace=True) 
 dt_tweet_cnt = dt_tweet_cnt.reindex(range(0,24), axis=0, fill_value=0) 
 dt_tweet_cnt = dt_tweet_cnt.reindex(range(0,60), axis=1, fill_value=0).astype(int) 

Создание простого Heatmap Использование Сиборн

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

 import seaborn as sns 
 import matplotlib.pyplot as plt 

Мы также импортируем модуль PyPlot из Matplotlib, поскольку Seaborn полагается на него как на базовый движок. После построения графиков с соответствующими функциями plt.show() чтобы фактически отображать эти графики.

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

Построим простую тепловую карту активности Трампа в Twitter:

 sns.heatmap(dt_tweet_cnt) 
 plt.show() 

тепловая картатвитов{.ezlazyload}

А потом Байден:

 sns.heatmap(jb_tweet_cnt) 
 plt.show() 

тепловая картатвитов{.ezlazyload}

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

Помимо этого, мы можем видеть эти закономерности, потому что Seaborn автоматически выполняет большую работу за нас, просто вызывая функцию heatmap()

  1. Сделал соответствующий выбор цветовой палитры и гаммы.
  2. Он создал легенду, чтобы связать цвета с базовыми значениями.
  3. На нем обозначены оси

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

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

Как Настроить Сиборн Heatmap

Эффективное использование цвета

Определяющей характеристикой тепловой карты является использование цвета для представления величины базовой величины.

Цвета, которые Seaborn использует для рисования cmap карты, легко изменить, указав необязательный параметр cmap (colormap). Например, вот как переключиться на цветовую палитру 'mako'

 sns.heatmap(dt_tweet_cnt, cmap="mako") 
 plt.show() 

Цветовая схема мако для тепловых карт вморе{.ezlazyload}

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

Для тепловых карт, показывающих числовые данные - как у нас - последовательные палитры, такие как 'rocket' или 'mako' по умолчанию, являются хорошим выбором. Это связано с тем, что цвета в этих палитрах были выбраны одинаковыми для восприятия. Это означает, что разница между двумя цветами, которую мы воспринимаем глазами, пропорциональна разнице между основными значениями.

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

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

 sns.heatmap(dt_tweet_cnt, cmap="tab10") 
 plt.show() 

цветная карта tab10 для тепловых карт морскогодна{.ezlazyload}

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

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

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

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

Управляйте искажающим эффектом выбросов

Выбросы в данных могут вызвать проблемы при построении тепловых карт. По умолчанию Seaborn устанавливает границы цветовой шкалы на минимальное и максимальное значение в данных.

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

Например, если мы добавим экстремальное значение выброса, такое как 400 твитов за одну минуту, этот единственный выброс изменит цветовой разброс и значительно его исказит:

Тепловая карта seaborn смягчает влияниевыбросов{.ezlazyload}

Один из способов обработки экстремальных значений без удаления их из набора данных - использование необязательного параметра robust Если для параметра robust значение True Seaborn устанавливает границы цветовой шкалы на уровне 2-го и 98-го процентилей данных, а не на максимуме и минимуме. Это в подавляющем большинстве случаев нормализует разброс цвета до гораздо более удобного состояния.

Обратите внимание , что в нашем примере это варьировалось распространение появления / цвета от 0..16 , в отличие от 0..40 от до. Это не идеально , но позволяет быстро и легко исправить экстремальные значения.

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

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

 sns.heatmap(tmp, vmin=0, vmax=40) 
 plt.show() 

Композиция: сортировка осей по взаимосвязям поверхностей

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

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

Сортировка осей на тепловой картеseaborn{.ezlazyload}

Это обеспечивает новое, альтернативное представление данных о количестве твитов. Из первой тепловой карты мы видим, что Байден предпочитает твитнуть четвертные отметки ( 30 , 45 , 0 и 15 после часа), подобно тому, как некоторые люди устанавливают громкость телевизора с шагом 5 или сколько людей склонны «ждать подходящего времени», чтобы начать выполнение задачи - обычно с круглым или четвертым числом.

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

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

Добавление аннотаций значений

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

Однако эту проблему можно решить, добавив аннотации к тепловой карте, чтобы показать базовые значения. Это легко сделать в Seaborn, установив для параметра annot True , например:

 sns.heatmap(jb_tweet_cnt.iloc[14:23,25:35], annot=True) 
 plt.show() 

добавление аннотаций значений к тепловой картеseaborn{.ezlazyload}

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

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

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

Это делается путем создания набора меток аннотаций, которые можно передать в функцию annot heatmap() через параметр annot. Параметр annot_kws также можно использовать для управления такими аспектами метки, как размер используемого шрифта:

 # Create data labels, using blank string if under threshold value 
 M = jb_tweet_cnt.iloc[14:23,25:35].values.max() 
 labels = jb_tweet_cnt.iloc[14:23,25:35].applymap(lambda v: str(v) if v == M else '') 
 
 # Pass the labels to heatmap function 
 sns.heatmap(jb_tweet_cnt.iloc[14:23,25:35], annot=labels, annot_kws={'fontsize':16}, fmt='') 
 
 plt.show() 

аннотирование только одного значения на тепловой картеseaborn{.ezlazyload}

Вы можете проявить творческий подход в определении наборов специальных меток. Единственное ограничение заключается в том, что данные, которые вы передаете для меток, должны быть того же размера, что и данные, которые вы выводите на график. Кроме того, если ваши метки являются строками, вы должны передать параметр fmt='' чтобы Seaborn не интерпретировал ваши метки как числа.

Линии сетки и квадраты

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

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

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

 sns.heatmap(jb_tweet_cnt.iloc[14:23,25:35], linewidth=1, linecolor='w', square=True) 
 
 plt.show() 

добавление линий сетки и форсированиеквадратов{.ezlazyload}

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

Категориальные тепловые карты в Seaborn

Бывают случаи, когда полезно упростить тепловую карту, поместив числовые данные в категории. Например, мы могли бы разделить данные о количестве твитов всего на три категории: 'high' , 'medium' и 'low' , вместо числового диапазона, такого как 0..40 .

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

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

Мы воспользуемся помощью Matplotlib, движка, лежащего в основе Seaborn, поскольку он имеет множество низкоуровневых параметров настройки, и у нас есть полный доступ к нему. Здесь мы можем «взломать» легенду справа, чтобы отобразить желаемые значения:

 import matplotlib.pyplot as plt 
 
 fig,ax = plt.subplots(1,1,figsize=(18,8)) 
 my_colors=[(0.2,0.3,0.3),(0.4,0.5,0.4),(0.1,0.7,0),(0.1,0.7,0)] 
 
 sns.heatmap(dt_tweet_cnt, cmap=my_colors, square=True, linewidth=0.1, linecolor=(0.1,0.2,0.2), ax=ax) 
 
 colorbar = ax.collections[0].colorbar 
 M=dt_tweet_cnt.max().max() 
 colorbar.set_ticks([1/8*M,3/8*M,6/8*M]) 
 colorbar.set_ticklabels(['low','med','high']) 
 
 plt.show() 

категориальная тепловая карта легендаseaborn{.ezlazyload}

Подготовка тепловых карт к презентации

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

Использование контекста Seaborn для управления внешним видом

Функция set_context() предоставляет удобный способ управления некоторыми элементами графика без изменения его общего стиля. Например, это может быть удобный способ настройки размеров и семейств шрифтов.

Доступно несколько предустановленных контекстов :

 sns.set_context("notebook", font_scale=1.75, rc={"lines.linewidth": 2.5, 'font.family':'Helvetica'}) 

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

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

Мы можем использовать функцию subplot() matplotlib.pyplot для управления компоновкой тепловых карт в Seaborn. Это даст вам максимальный контроль над окончательной графикой и позволит легко экспортировать изображение.

Создать подзаголовки с помощью Matplotlib так же просто, как определить их форму (в нашем случае 2 подзаголовка в 1 столбце):

 import matplotlib.pyplot as plt 
 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12,12)) 
 sns.heatmap(jb_tweet_cnt, ax=ax1) 
 sns.heatmap(dt_tweet_cnt, ax=ax2) 
 
 plt.show() 

построение подзаголовков тепловых карт с помощьюseaborn{.ezlazyload}

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

 import matplotlib.pyplot as plt 
 fig, ax = plt.subplots(2, 1, figsize=(24,12)) 
 
 for i,d in enumerate([jb_tweet_cnt,dt_tweet_cnt]): 
 
 labels = d.applymap(lambda v: str(v) if v == d.values.max() else '') 
 sns.heatmap(d, 
 cmap="viridis", # Choose a squential colormap 
 annot=jb_labels, # Label the maximum value 
 annot_kws={'fontsize':11}, # Reduce size of label to fit 
 fmt='', # Interpret labels as strings 
 square=True, # Force square cells 
 vmax=40, # Ensure same 
 vmin=0, # color scale 
 linewidth=0.01, # Add gridlines 
 linecolor="#222",# Adjust gridline color 
 ax=ax[i], # Arrange in subplot 
 ) 
 
 ax[0].set_title('@JoeBiden') 
 ax[1].set_title('@realDonaldTrump') 
 ax[0].set_ylabel('Hour of Day') 
 ax[1].set_ylabel('Hour of Day') 
 ax[0].set_xlabel('') 
 ax[1].set_xlabel('Minute of Hour') 
 plt.tight_layout() 
 plt.savefig('final.png', dpi=120) 

Тепловаякарта

Заключение

В этом руководстве мы рассмотрели тепловые карты и способы их создания с помощью Python и библиотеки визуализации Seaborn.

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

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

Как всегда, редакционная оценка со стороны визуализатора данных необходима для выбора наиболее подходящих настроек для контекста визуализации.

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

comments powered by Disqus