Автор оригинала: Guest Contributor.
Вступление
A heatmap – это метод визуализации данных, который использует цвет, чтобы показать, как изменяется интересующее значение в зависимости от значений двух других переменных.
Например, вы можете использовать тепловую карту, чтобы понять, как изменяется загрязнение воздуха в зависимости от времени суток в разных городах.
Другим, возможно, более редким случаем использования тепловых карт является наблюдение за поведением человека – вы можете создавать визуализации того, как люди используют социальные сети, как их ответы на опросы менялись с течением времени и т. Д. Эти методы могут быть очень мощными для изучения паттернов поведения, особенно для психологических учреждений, которые обычно посылают пациентам опросы самооценки.
Вот две тепловые карты, которые показывают различия в том, как два пользователя используют Twitter:
Эти диаграммы содержат все основные компоненты тепловой карты. По сути, это сетка цветных квадратов , где каждый квадрат, или bin , отмечает пересечение значений двух переменных, которые простираются вдоль горизонтальной и вертикальной осей.
В этом примере эти переменные:
- Час дня
- Минута часа
Квадраты окрашены в соответствии с тем, сколько твитов попадает в каждую часовую/минутную ячейку. Сбоку от сетки находится легенда, которая показывает нам, как цвет соотносится со значениями счетчика. В этом случае более светлые (или более теплые) цвета означают больше твитов, а более темные (или более холодные) – меньше. Отсюда и название тепловая карта !
Тепловые карты наиболее полезны для выявления закономерностей в больших объемах данных с первого взгляда. Например, более темная и холодная полоска утром указывает на то, что оба кандидата не чирикают до полудня. Кроме того, второй пользователь чирикает гораздо чаще, чем первый, с более резкой линией отсечения в 10 утра, тогда как у первого пользователя нет такой четкой линии. Это можно объяснить личным планированием в течение дня, когда второй пользователь обычно заканчивает какую-то назначенную работу к 10 утра, а затем проверяет социальные сети и использует их.
Тепловые карты часто являются хорошей отправной точкой для более сложного анализа. Но это также привлекательная техника визуализации, что делает ее полезным инструментом для общения.
В этом уроке мы покажем вам, как создать тепловую карту, подобную приведенной выше, с помощью библиотеки Seaborn в Python.
Seaborn-это библиотека визуализации данных, построенная поверх Matplotlib. Вместе они являются фактическими лидерами, когда речь заходит о библиотеках визуализации в Python.
Seaborn имеет API более высокого уровня, чем Matplotlib, что позволяет нам автоматизировать множество настроек и небольших задач, которые мы обычно включаем, чтобы сделать графики Matplotlib более подходящими для человеческого глаза. Он также тесно интегрируется со структурами данных Pandas, что облегчает предварительную обработку и визуализацию данных. Он также имеет много встроенных сюжетов, с полезными значениями по умолчанию и привлекательным стилем.
В этом руководстве мы рассмотрим три основных раздела:
- Подготовка данных
- Построение тепловой карты
- Лучшие практики и настройка тепловой карты
Давайте начнем!
Подготовка набора данных для создания тепловой карты с помощью Seaborn
Загрузка примера набора данных с пандами
Обратите внимание: Это руководство было написано с использованием Python 3.8, Seaborn 0.11.0 и Pandas 1.1.2.
Для этого руководства мы будем использовать набор данных, содержащий временные метки твитов, опубликованных двумя кандидатами в президенты США 2020 года – Джо Байденом и Дональдом Трампом-в период с января 2017 года по сентябрь 2020 года. Описание набора данных и того, как он был создан, можно найти по адресу here .
Забавным упражнением дома может быть создание собственного набора данных из ваших собственных твитов или твитов друзей и сравнение ваших привычек использования социальных сетей!
Наша первая задача-загрузить эти данные и преобразовать их в форму, которую ожидает Сиборн и с которой нам легко работать.
Мы будем использовать библиотеку Pandas для загрузки и обработки данных:
import pandas as pd
Мы можем использовать функцию Pandas read_csv()
для загрузки набора данных tweet count. Вы можете либо передать 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()
815422340540547073 | 2017-01-01 05:00:10+00:00 | 5 | 27134 | realDonaldTrump | 0 | 0 |
815930688889352192 | 2017-01-02 14:40:10+00:00 | 14 | 23930 | realDonaldTrump | 1 | 40 |
815973752785793024 | 2017-01-02 17:31:17+00:00 | 17 | 14119 | realDonaldTrump | 2 | 31 |
815989154555297792 | 2017-01-02 18:32:29+00:00 | 18 | 3193 | realDonaldTrump | 3 | 32 |
815990335318982656 | 2017-01-02 18:37:10+00:00 | 18 | 7337 | realDonaldTrump | 4 | 37 |
Здесь мы напечатали первые 5 элементов в Фрейме данных
. Сначала у нас есть индекс каждой строки, за которым следует id
твита, имя пользователя
пользователя, который написал этот твит, а также информация о времени, такая как date_utc
, hour_utc
и minute_utc
.
Наконец, у нас есть количество ретвитов
в конце, которое можно использовать для проверки интересной связи между содержанием твитов и “вниманием”, которое они получили.
Преобразование Данных В Широкоформатный Фрейм Данных
Обычно можно найти такие данные журнала, организованные в виде long (или tidy ). Это означает, что для каждой переменной существует столбец, и каждая строка данных является единственным наблюдением (конкретным значением) этих переменных. Здесь каждый твит-это каждая переменная. Каждая строка соответствует одному твиту и содержит данные о нем.
Но концептуально тепловая карта требует, чтобы данные были организованы в короткую (или широкую ) форму. И на самом деле библиотека Seaborn требует, чтобы мы имели данные в этой форме для создания визуализаций тепловых карт, подобных тем, которые мы видели раньше.
Данные Wide-form содержат значения независимых переменных в виде заголовков строк и столбцов, в то время как значения зависимой переменной содержатся в ячейках.
Это в основном означает, что мы используем все свойства, которые мы не наблюдаем, как категории. Имейте в виду, что некоторые категории встречаются более одного раза. Например, в исходной таблице мы имеем что-то вроде:
имя пользователя | hour_utc | minute_utc |
realDonaldTrump | 12 | 4 |
realDonaldTrump | 13 | 0 |
realDonaldTrump | 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 столбцов. Если вы представите себе этот спред визуально, то он, по сути, является тепловой картой с числами.
В нашем примере я хочу понять, есть ли какие-то закономерности в том, как кандидаты чирикают в разное время дня. Один из способов сделать это-подсчитать твиты, созданные в каждый час дня и каждую минуту часа.
Технически, у нас есть 2880 категорий. Каждая комбинация hour_utc
, minute_utc
и username
является отдельной категорией, и мы подсчитываем количество вхождений твитов для каждого из них.
Эта агрегация прямолинейна с использованием панд. Час и минута создания доступны в столбцах hour_utc
и minute_utc
. Мы можем использовать функцию Pandas groupby()
для сбора всех твитов для каждой комбинации username
, hour_utc
и minute_utc
:
g = df.groupby(['hour_utc','minute_utc','username'])
Это означает, что только строки, имеющие одинаковое значение hour_utc
, minute_utc
, username
, могут считаться вхождением в одну и ту же категорию.
Теперь мы можем подсчитать количество твитов в каждой группе, применив функцию nunique()
для подсчета количества уникальных id
s. Этот метод позволяет избежать двойного подсчета любых дубликатов твитов, которые могут скрываться в данных, если они не будут очищены должным образом заранее:
tweet_cnt = g.id.nunique()
Это дает нам серию Панд с подсчетами, которые нам нужны для построения тепловой карты:
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
Чтобы преобразовать это в широкую форму Фрейма данных
, необходимую Seaborn, мы можем использовать функцию Pandas pivot ()
.
Для этого примера проще всего взять одного пользователя за раз и построить тепловую карту для каждого из них отдельно. Мы можем поместить это на одну фигуру или на отдельные.
Используйте аксессуар Pandas loc []
, чтобы выбрать количество твитов одного пользователя, а затем применить функцию pivot ()
. Он использует уникальные значения из указанного индекса/столбцов для формирования осей результирующего фрейма данных
. Мы повернем часы и минуты так, чтобы результирующий DataFrame
имел широко распространенную форму:
jb_tweet_cnt = tweet_cnt.loc[:,:,'JoeBiden'].reset_index().pivot(index='hour_utc', columns='minute_utc', values='id')
Затем взгляните на часть полученного фрейма данных
:
jb_tweet_cnt.iloc[:10,:9]
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 | бабушка | 5.0 | 1.0 | 4.0 | 8.0 | бабушка |
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 | бабушка | бабушка | 1.0 | 1.0 | 1.0 |
5 | 1.0 | 2.0 | бабушка | бабушка | бабушка | 1.0 | бабушка | бабушка | бабушка |
6 | бабушка | бабушка | бабушка | бабушка | бабушка | бабушка | бабушка | бабушка | бабушка |
10 | 7.0 | 2.0 | 1.0 | бабушка | бабушка | бабушка | бабушка | бабушка | бабушка |
11 | 2.0 | 5.0 | бабушка | бабушка | бабушка | бабушка | бабушка | бабушка | бабушка |
12 | 4.0 | бабушка | 1.0 | 1.0 | 1.0 | бабушка | 1.0 | бабушка | бабушка |
Работа с пропущенными значениями
Выше мы видим, что наши преобразованные данные содержат пропущенные значения. Там, где не было твитов для данной комбинации minute/hour , функция pivot()
вставляет значение Not-a-Number ( NaN
) в DataFrame
.
Кроме того, pivot()
не создает строку (или столбец), когда в течение определенного часа (или минуты) твитов вообще не было.
См. выше, где часы 7
, 8
и 9
пропали.
Это будет обычным делом при предварительной обработке данных. Данные могут отсутствовать, могут иметь нечетные типы или записи (без проверки) и т. Д.
Seaborn прекрасно справляется с этими недостающими данными, он просто строит график без них, пропуская часы 7, 8 и 9. Однако наши тепловые карты будут более последовательными и интерпретируемыми, если мы заполним недостающие значения. В этом случае мы знаем, что пропущенные значения на самом деле равны нулю.
Чтобы заполнить NaN
s, которые уже были вставлены, используйте fillna()
вот так:
jb_tweet_cnt.fillna(0, inplace=True)
Чтобы вставить отсутствующие строки – убедитесь, что все часовые и минутные комбинации отображаются в тепловой карте – will reindex()
the Data Frame
to insert the missing indexes and their values:
# 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)
Создание базовой тепловой карты с помощью Seaborn
Теперь, когда мы подготовили данные, легко построить тепловую карту с помощью Seaborn. Сначала убедитесь, что вы импортировали библиотеку Seaborn:
import seaborn as sns import matplotlib.pyplot as plt
Мы также импортируем модуль Matplotlib PyPlot, поскольку Seaborn использует его в качестве базового движка. После построения графиков с адекватными функциями Seaborn мы всегда будем вызывать plt.show ()
, чтобы действительно показать эти графики.
Теперь, как обычно с Seaborn, построение графика данных так же просто, как передача подготовленного фрейма данных в функцию, которую мы хотели бы использовать. В частности, мы будем использовать функцию heatmap ()
.
Давайте построим простую тепловую карту активности Трампа в Twitter:
sns.heatmap(dt_tweet_cnt) plt.show()
А потом Байдена:
sns.heatmap(jb_tweet_cnt) plt.show()
Тепловые карты, созданные с использованием настроек Seaborn по умолчанию, сразу же можно использовать. Они показывают те же узоры, что и на графиках в начале руководства, но немного более изменчивы, меньше, а метки осей появляются с нечетной частотой.
Кроме того, мы можем видеть эти паттерны, потому что Seaborn делает много работы для нас автоматически, просто вызывая функцию heatmap()
:
- Он сделал соответствующий выбор цветовой палитры и масштаба
- Он создал легенду, чтобы связать цвета с базовыми значениями
- Он помечал оси
Эти значения по умолчанию могут быть достаточно хороши для ваших целей и первоначального изучения, как любителя или специалиста по данным. Но часто создание действительно эффективной тепловой карты требует от нас настройки презентации в соответствии с потребностями аудитории.
Давайте посмотрим, как мы можем настроить тепловую карту Seaborn для получения тепловых карт, приведенных в начале руководства.
Как настроить тепловую карту Seaborn
Эффективное Использование Цвета
Определяющей характеристикой тепловой карты является использование цвета для представления величины лежащей в ее основе величины.
Легко изменить цвета, которые Seaborn использует для рисования тепловой карты, указав необязательный параметр cmap
(colormap). Например, вот как переключиться на цветовую палитру 'mako'
:
sns.heatmap(dt_tweet_cnt, cmap="mako") plt.show()
Seaborn предоставляет множество встроенных палитр, которые вы можете выбрать, но вы должны быть осторожны, чтобы выбрать хорошую палитру для ваших данных и целей.
Для тепловых карт, показывающих числовые данные – как у нас – последовательные палитры, такие как по умолчанию "ракета"
или "мако"
являются хорошим выбором. Это происходит потому, что цвета в этих палитрах были выбраны как перцептивно однородные . Это означает, что разница, которую мы воспринимаем глазами между двумя цветами, пропорциональна разнице между базовыми значениями.
В результате, взглянув на карту, мы можем сразу почувствовать распределение значений в данных.
Встречный пример демонстрирует преимущества перцептивно однородной палитры и подводные камни плохого выбора палитры. Вот такая же тепловая карта, нарисованная с помощью палитры tab 10
:
sns.heatmap(dt_tweet_cnt, cmap="tab10") plt.show()
Эта палитра-плохой выбор для нашего примера, потому что теперь нам придется очень много работать, чтобы понять взаимосвязь между различными цветами. Она в значительной степени затмила те закономерности, которые были ранее очевидны!
Это связано с тем, что палитра tab 10
использует изменения оттенка, чтобы легко различать категории. Это может быть хорошим выбором, если значения вашей тепловой карты были категоричными.
Если вас интересуют как низкие, так и высокие значения в ваших данных, вы можете рассмотреть возможность использования расходящейся палитры, такой как coolwarm
или icefire
, которая представляет собой единую схему, выделяющую обе крайности.
Для получения дополнительной информации о выборе цветовых палитр в документации Seaborn есть некоторые полезные рекомендации .
Контроль искажающего эффекта выбросов
Выбросы в данных могут вызвать проблемы при построении тепловых карт. По умолчанию Seaborn устанавливает границы цветовой шкалы на минимальное и максимальное значение в данных.
Это означает, что чрезвычайно большие (или малые) значения в данных могут привести к тому, что детали будут скрыты. Чем экстремальнее выбросы, тем дальше мы от равномерной окраски. Мы видели, какой эффект это может иметь с различными цветовыми картами.
Например, если мы добавим экстремальное значение выброса, например 400 твитов в течение одной минуты, то этот единственный выброс изменит цветовое распределение и значительно исказит его:
Одним из способов обработки экстремальных значений без необходимости их удаления из набора данных является использование необязательного параметра robust
. Установка робастная
на True
заставляет Seaborn устанавливать границы цветовой шкалы на 2-м и 98-м процентилях данных, а не на максимуме и минимуме. Это, в подавляющем большинстве случаев, нормализует распространение цвета в гораздо более полезное состояние.
Обратите внимание, что в нашем примере это варьировало распространение вхождения/цвета от 0..16
, в отличие от 0..40
от предыдущего. Это не идеально , но это быстрое и простое решение для экстремальных значений.
Это может вернуть детали, как показывает пример справа. Обратите внимание, что крайняя точка значения все еще присутствует на диаграмме; значения выше или ниже границ цветовой шкалы отсекаются к цветам на концах шкалы.
Также можно вручную задать границы цветовой шкалы, задав значения параметров vmin
и vmax
. Они могут быть очень полезны, если вы планируете иметь две тепловые карты рядом и хотите обеспечить одинаковую цветовую гамму для каждой:
sns.heatmap(tmp, vmin=0, vmax=40) plt.show()
Композиция: Сортировка осей по отношению к поверхности
В нашем примере значения, составляющие оси нашей тепловой карты, часы и минуты, имеют естественный порядок. Важно отметить, что это дискретные, а не непрерывные значения и что они могут быть перестроены, чтобы помочь поверхностным узорам в данных.
Например, вместо того, чтобы иметь минуты в обычном порядке возрастания, мы могли бы выбрать порядок их расположения, основанный на том, какая минута имеет наибольшее количество твитов:
Это обеспечивает новое, альтернативное представление данных о количестве твитов. Из первой тепловой карты мы видим, что Байден предпочитает чирикать на четвертных отметках ( 30
, 45
, 0
и 15
past the hour), подобно тому, как некоторые люди устанавливают громкость телевизора с шагом 5 или как многие люди склонны “ждать подходящего времени”, чтобы начать выполнять задание – обычно на круглое или четвертное число.
С другой стороны, на второй тепловой карте, похоже, нет благоприятной минуты. Существует довольно последовательный разброс во всех минутах часа, и существует не так много паттернов, которые можно наблюдать.
В других контекстах тщательное упорядочение и/или группирование категориальных переменных, составляющих оси тепловой карты, может быть полезно для выделения паттернов в данных и увеличения информационной плотности диаграммы.
Добавление Аннотаций значений
Одним из недостатков тепловых карт является то, что прямые сравнения между значениями затруднены. Барный или линейный график – это гораздо более простой способ сделать это.
Однако можно облегчить эту проблему, добавив аннотации к тепловой карте, чтобы показать лежащие в ее основе значения. Это легко сделать в Seaborn, установив параметр annot
в True
, вот так:
sns.heatmap(jb_tweet_cnt.iloc[14:23,25:35], annot=True) plt.show()
Мы обрезали данные в меньший набор, чтобы было легче просматривать и сравнивать некоторые из этих ячеек. Здесь каждый бин теперь аннотируется базовыми значениями, что значительно облегчает их сравнение. Хотя это не так естественно и интуитивно, как линейный график или гистограмма, это все же полезно.
Нанесение этих значений на всю тепловую карту, которую мы имеем, было бы непрактично, так как числа были бы слишком малы, чтобы их можно было прочитать.
Полезным компромиссом может быть добавление аннотаций только для некоторых интересных значений. В следующем примере добавим аннотацию только для максимального значения.
Это делается путем создания набора меток аннотаций, которые могут быть переданы в функцию Seaborn 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()
Вы можете проявить творческий подход при определении пользовательских наборов меток. Единственное ограничение заключается в том, что данные, которые вы передаете для меток, должны быть того же размера, что и данные, которые вы строите. Кроме того, если ваши метки являются строками, вы должны передать параметр fmt="
, чтобы Seaborn не интерпретировал ваши метки как числа.
Линии сетки и квадраты
Иногда это помогает напомнить вашей аудитории, что тепловая карта основана на ячейках дискретных величин. В некоторых наборах данных цвет между двумя ячейками может быть очень похожим, создавая градиентную текстуру, которая затрудняет различение конкретных значений. Параметр linewidth
и linecolor
можно использовать для добавления линий сетки к тепловой карте.
В аналогичном ключе параметр square
может быть использован для того, чтобы заставить соотношение сторон квадратов быть истинным. Имейте в виду, что вам не нужно использовать квадраты для бункеров.
Давайте добавим тонкую белую линию между каждой ячейкой, чтобы подчеркнуть, что это отдельные записи:
sns.heatmap(jb_tweet_cnt.iloc[14:23,25:35], linewidth=1, linecolor='w', square=True) plt.show()
В каждом из этих случаев от вас зависит, будут ли эти эстетические изменения способствовать достижению целей вашей визуализации или нет.
Категориальные тепловые карты в Сиборне
Бывают случаи, когда полезно упростить тепловую карту, разложив числовые данные по категориям. Например, мы могли бы разделить данные подсчета твитов всего на три категории "высокий"
, "средний"
и "низкий"
, а не на числовой диапазон, такой как 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 для управления внешним видом
Функция 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()
Это, по сути, он, хотя и лишен некоторого стиля, который мы видели в самом начале. Давайте объединим многие настройки, которые мы видели в руководстве, чтобы создать наш окончательный сюжет и экспортировать его в файл .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, чтобы подчеркнуть определенные аспекты диаграммы. К ним относятся аннотации, группировка и упорядочение категориальных осей, а также компоновка.
Как всегда, редакторское суждение со стороны визуализатора данных требуется для выбора наиболее подходящих настроек для контекста визуализации.
Существует множество вариантов тепловой карты, которые могут вас заинтересовать, включая радиальные тепловые карты, мозаичные графики или матричные диаграммы.