Seaborn heatmap что это
Визуализация матричных моделей
Перед тем как приводить примеры, давайте как обычно выполним все необходимые импорты:
Тепловые карты
Тепловые карты, с виду, очень похожи на двумерные гистограммы:
Так же как и двумерная гистограмма, тепловая карта состоит из прямоугольных ячеек, но смысл гистограммы заключается в подсчете попаданий точек в каждую ячейку, а в тепловых картах каждая ячейка просто обозначает цветом значение той или инной ячейки в таблице с данными. Выше, я намеренно сделал квадратную тепловую карту, но она может иметь любую форму, в зависимости от того с какими данными вы работаете:
Тепловые карты больше всего похожи на двумерную столбчатую диаграмму. Эта аналогия станивится более очевидной если взглянуть всего на одну строку в данных и построить для нее эти графики:
year | month | passengers | |
---|---|---|---|
0 | 1949 | Jan | 112 |
1 | 1949 | Feb | 118 |
2 | 1949 | Mar | 132 |
3 | 1949 | Apr | 129 |
4 | 1949 | May | 121 |
А теперь сделаем сводную таблицу по годам и месяцам:
year | 1949 | 1950 | 1951 | 1952 | 1953 | 1954 | 1955 | 1956 | 1957 | 1958 | 1959 | 1960 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
month | ||||||||||||
Jan | 112 | 115 | 145 | 171 | 196 | 204 | 242 | 284 | 315 | 340 | 360 | 417 |
Feb | 118 | 126 | 150 | 180 | 196 | 188 | 233 | 277 | 301 | 318 | 342 | 391 |
Mar | 132 | 141 | 178 | 193 | 236 | 235 | 267 | 317 | 356 | 362 | 406 | 419 |
Apr | 129 | 135 | 163 | 181 | 235 | 227 | 269 | 313 | 348 | 348 | 396 | 461 |
May | 121 | 125 | 172 | 183 | 229 | 234 | 270 | 318 | 355 | 363 | 420 | 472 |
Jun | 135 | 149 | 178 | 218 | 243 | 264 | 315 | 374 | 422 | 435 | 472 | 535 |
Jul | 148 | 170 | 199 | 230 | 264 | 302 | 364 | 413 | 465 | 491 | 548 | 622 |
Aug | 148 | 170 | 199 | 242 | 272 | 293 | 347 | 405 | 467 | 505 | 559 | 606 |
Sep | 136 | 158 | 184 | 209 | 237 | 259 | 312 | 355 | 404 | 404 | 463 | 508 |
Oct | 119 | 133 | 162 | 191 | 211 | 229 | 274 | 306 | 347 | 359 | 407 | 461 |
Nov | 104 | 114 | 146 | 172 | 180 | 203 | 237 | 271 | 305 | 310 | 362 | 390 |
Dec | 118 | 140 | 166 | 194 | 201 | 229 | 278 | 306 | 336 | 337 | 405 | 432 |
А теперь построим тепловую карту для этой таблицы:
Как видите, теперь, визуальное восприятие тех же данных стало более простым.
Еще одно, очень частое применение тепловых карт можно встретить при визуализации корреляционных матриц. Для примера давайте сгенерируем какие-нибудь данные:
А теперь взглянем как все это выглядит:
Визуально очень сложно оценить, какие линиии движутся в одном направлении, т.е. как изменение одной величины влияет на изменение других. Но если мы вычислим корреляционную матрицу Пирсона и изобразим ее в виде тепловой карты, то все станет гораздо нагляднее:
Кластерная карта
Кластерные карты удобны. но с первого взгляда они вообще непонятны. Давайте начнем с чего-нибудь простого и пока просто разберемся что такое иерархическая кластеризация и дендрограммы.
Допустим у нас есть семь точек со следующими координатами:
А вот как выглядят эти точки на графике:
Полученный результат, это верхний треугольник матрицы расстояний, сжатый до одной оси. Что бы было легче разобраться, мы можем привести его к исходному (несжатому) виду:
Далее мы можем на основе этой матрицы расстояний, объединять точки в кластеры на основе их близости:
Сам процесс слияния может быть представлен следующей дендрограммой:
Выглядеть кластеры будут вот так:
А теперь «скормим» те же данные функции clustermap() :
Обратите на дендрограмму слева, она визуализирует иерархическую кластеризацию и позволяет оценить меру сходства отдельных подмножеств точек.
А теперь давайте сгенерируем 10 кластеров:
Обратите внимание на то, что одни кластеры ближе друг к другу чем другие. Отразится ли эта близость отдельных кластеров друг к другу на кластерной карте? Давайте посмотрим:
Как видите, дендрограмма соответствует действительности.
Наверняка, вам хочется спросить, а почему бы вообще не строить вместо кластерных карт те же самые графики разброса. Дело в количестве переменных, если их больше 3-х, то очевидного и простого способа построения графика разброса нет. А вот кластерная карта покажет близость подмножеств. Допустим у нас есть 10 кластеров, но уже не в двухмерном а 15-мерном пространстве признаков:
Вероятнее всего, выполняя этот пример, вы получили предупреждение:
Это означает, что исходная матрица очень большая и ее обработка выполняется средствами SciPy и что установка библиотеки Fastcluster ускорит вычисления.
seaborn.heatmap¶
Plot rectangular data as a color-encoded matrix.
Parameters data rectangular dataset
2D dataset that can be coerced into an ndarray. If a Pandas DataFrame is provided, the index/column information will be used to label the columns and rows.
vmin, vmax floats, optional
Values to anchor the colormap, otherwise they are inferred from the data and other keyword arguments.
cmap matplotlib colormap name or object, or list of colors, optional
The mapping from data values to color space. If not provided, the default will depend on whether center is set.
center float, optional
The value at which to center the colormap when plotting divergant data. Using this parameter will change the default cmap if none is specified.
robust bool, optional
If True and vmin or vmax are absent, the colormap range is computed with robust quantiles instead of the extreme values.
annot bool or rectangular dataset, optional
fmt str, optional
String formatting code to use when adding annotations.
annot_kws dict of key, value mappings, optional
Keyword arguments for matplotlib.axes.Axes.text() when annot is True.
linewidths float, optional
Width of the lines that will divide each cell.
linecolor color, optional
Color of the lines that will divide each cell.
cbar bool, optional
Whether to draw a colorbar.
cbar_kws dict of key, value mappings, optional
cbar_ax matplotlib Axes, optional
Axes in which to draw the colorbar, otherwise take space from the main Axes.
square bool, optional
If True, set the Axes aspect to “equal” so each cell will be square-shaped.
xticklabels, yticklabels “auto”, bool, list-like, or int, optional
If True, plot the column names of the dataframe. If False, don’t plot the column names. If list-like, plot these alternate labels as the xticklabels. If an integer, use the column names but plot only every n label. If “auto”, try to densely plot non-overlapping labels.
mask bool array or DataFrame, optional
If passed, data will not be shown in cells where mask is True. Cells with missing values are automatically masked.
ax matplotlib Axes, optional
Axes in which to draw the plot, otherwise use the currently-active Axes.
kwargs other keyword arguments
Returns ax matplotlib Axes
Axes object with the heatmap.
Plot a matrix using hierachical clustering to arrange the rows and columns.
Plot a heatmap for a numpy array:
Change the limits of the colormap:
Plot a heatmap for data centered on 0 with a diverging colormap:
Plot a dataframe with meaningful row and column labels:
Annotate each cell with the numeric value using integer formatting:
Add lines between each cell:
Use a different colormap:
Center the colormap at a specific value:
Plot every other column label and don’t plot row labels:
Don’t draw a colorbar:
Use different axes for the colorbar:
Use a mask to plot only part of a matrix
© Copyright 2012-2021, Michael Waskom. Created using Sphinx 3.3.1.
Полное руководство по тепловым картам в Seaborn с Python
Вступление
Например, вы можете использовать тепловую карту, чтобы понять, как загрязнение воздуха меняется в зависимости от времени суток в наборе городов.
Вот две тепловые карты, которые показывают разницу в использовании Twitter двумя пользователями:
Эти диаграммы содержат все основные компоненты тепловой карты. По сути, это сетка из цветных квадратов, где каждый квадрат или ячейка отмечает пересечение значений двух переменных, которые простираются вдоль горизонтальной и вертикальной осей.
В этом примере это следующие переменные:
Тепловые карты наиболее полезны для быстрого выявления закономерностей в больших объемах данных. Например, более темная и холодная полоса утром указывает на то, что оба кандидата мало пишут в Твиттере до полудня. Кроме того, второй пользователь пишет твиты гораздо чаще, чем первый пользователь, с более четкой границей в 10 утра, тогда как у первого пользователя такая четкая линия отсутствует. Это может быть связано с личным расписанием в течение дня, когда второй пользователь обычно заканчивает некоторую назначенную работу к 10 часам утра, а затем проверяет работу в социальных сетях и использует ее.
Тепловые карты часто являются хорошей отправной точкой для более сложного анализа. Но это также привлекательная техника визуализации, что делает ее полезным инструментом для общения.
В этом уроке мы покажем вам, как создать тепловую карту, подобную показанной выше, с помощью библиотеки Seaborn в Python.
У Seaborn есть API более высокого уровня, чем у Matplotlib, что позволяет нам автоматизировать множество настроек и небольших задач, которые нам обычно приходится включать, чтобы сделать графики Matplotlib более подходящими для человеческого глаза. Он также тесно интегрируется со структурами данных Pandas, что упрощает предварительную обработку и визуализацию данных. Он также имеет множество встроенных графиков с полезными настройками по умолчанию и привлекательным стилем.
В этом руководстве мы рассмотрим три основных раздела:
Подготовка набора данных для создания тепловой карты с помощью Seaborn
Загрузка примера набора данных с помощью Pandas
Обратите внимание: это руководство было написано с использованием Python 3.8, Seaborn 0.11.0 и Pandas 1.1.2.
Для этого руководства мы будем использовать набор данных, который содержит временные метки твитов, опубликованных в то время двумя кандидатами в президенты США 2020 года, Джо Байденом и Дональдом Трампом
Домашним забавным упражнением может быть создание собственного набора данных из собственных твитов или твитов друзей и сравнение ваших привычек использования социальных сетей!
Мы будем использовать библиотеку Pandas для загрузки и управления данными:
Мы можем использовать read_csv() для загрузки набора данных количества твитов. Вы можете либо передать URL-адрес, указывающий на набор данных, либо загрузить его и указать файл вручную:
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
Наконец, у нас есть количество 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
Это дает нам серию Pandas со счетчиками, необходимыми для построения тепловой карты:
Чтобы преобразовать это в широкоформатный DataFrame необходимый Seaborn, мы можем использовать функцию pivot()
В этом примере проще всего взять одного пользователя за раз и построить тепловую карту для каждого из них отдельно. Мы можем нанести это на одну фигуру или на отдельные.
Затем взгляните на часть получившегося DataFrame :
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() не создает строку (или столбец), если в течение определенного часа (или минуты) вообще не было твитов.
Это обычное дело при предварительной обработке данных. Данные могут отсутствовать, иметь нечетные типы или записи (без проверки) и т. Д.
Seaborn отлично справляется с этими недостающими данными, он просто построит график без них, пропуская часы 7, 8 и 9. Однако наши тепловые карты будут более последовательными и интерпретируемыми, если мы введем недостающие значения. В этом случае мы знаем, что пропущенные значения на самом деле равны нулю.
Чтобы заполнить уже вставленные NaN fillna() следующим образом:
Отлично. Теперь мы можем завершить подготовку данных, повторив те же шаги для других твитов кандидатов:
Создание простого Heatmap Использование Сиборн
Теперь, когда мы подготовили данные, можно легко построить тепловую карту с помощью Seaborn. Сначала убедитесь, что вы импортировали библиотеку Seaborn:
Мы также импортируем модуль PyPlot из Matplotlib, поскольку Seaborn полагается на него как на базовый движок. После построения графиков с соответствующими функциями plt.show() чтобы фактически отображать эти графики.
DataFrame график данных так же просто, как передать подготовленный DataFrame функции, которую мы хотели бы использовать. В частности, мы будем использовать функцию heatmap()
Построим простую тепловую карту активности Трампа в Twitter:
Тепловые карты, созданные с использованием настроек Seaborn по умолчанию, можно сразу же использовать. Они показывают те же шаблоны, что и на графиках в начале руководства, но немного более прерывистые, меньше и метки осей появляются с нечетной частотой.
Помимо этого, мы можем видеть эти закономерности, потому что Seaborn автоматически выполняет большую работу за нас, просто вызывая функцию heatmap()
Этих настроек по умолчанию может быть достаточно для ваших целей и первоначального изучения, как любителя или специалиста по данным. Но часто для создания действительно эффективной карты кликов необходимо настроить презентацию в соответствии с потребностями аудитории.
Давайте посмотрим, как мы можем настроить тепловую карту Seaborn для создания тепловых карт, показанных в начале руководства.
Как Настроить Сиборн Heatmap
Эффективное использование цвета
Определяющей характеристикой тепловой карты является использование цвета для представления величины базовой величины.
Цвета, которые Seaborn использует для рисования cmap карты, легко изменить, указав необязательный параметр cmap (colormap). Например, вот как переключиться на цветовую палитру ‘mako’
Seaborn предоставляет множество встроенных палитр, из которых вы можете выбирать, но вы должны быть осторожны, чтобы выбрать хорошую палитру для ваших данных и целей.
В результате, взглянув на карту, мы можем сразу почувствовать распределение значений в данных.
Контрпример демонстрирует преимущества воспринимаемой однородной палитры и подводные камни неправильного выбора палитры. tab10 карта, нарисованная с помощью палитры tab10:
Это связано с тем, что tab10 использует изменения оттенка, чтобы упростить различение категорий. Это может быть хорошим выбором, если значения вашей тепловой карты категоричны.
Если вас интересуют как низкие, так и высокие значения в ваших данных, вы можете рассмотреть возможность использования расходящейся палитры, такой как coolwarm или icefire которая представляет собой единую схему, которая выделяет обе крайности.
Управляйте искажающим эффектом выбросов
Выбросы в данных могут вызвать проблемы при построении тепловых карт. По умолчанию Seaborn устанавливает границы цветовой шкалы на минимальное и максимальное значение в данных.
Это означает, что очень большие (или маленькие) значения в данных могут привести к нечеткости деталей. Чем более резкие выбросы, тем дальше мы отходим от однородного шага окраски. Мы видели, какой эффект это может иметь при использовании различных цветовых карт.
Например, если мы добавим экстремальное значение выброса, такое как 400 твитов за одну минуту, этот единственный выброс изменит цветовой разброс и значительно его исказит:
Это может вернуть детали, как показывает пример справа. Обратите внимание, что крайняя точка все еще присутствует на графике; значения выше или ниже границ цветовой шкалы обрезаются по цветам на концах шкалы.
Композиция: сортировка осей по взаимосвязям поверхностей
В нашем примере значения, составляющие оси нашей тепловой карты, часы и минуты, имеют естественный порядок. Важно отметить, что это дискретные, а не непрерывные значения, и что они могут быть перегруппированы, чтобы помочь поверхностным структурам в данных.
Например, вместо того, чтобы указывать минуты в обычном порядке возрастания, мы могли бы упорядочить их в зависимости от того, какая минута имеет наибольшее количество твитов:
С другой стороны, на второй тепловой карте, похоже, нет благоприятной минуты. Существует довольно постоянный разброс на протяжении всех минут часа, и не так много закономерностей, которые можно наблюдать.
В других контекстах тщательное упорядочивание и / или группирование категориальных переменных, составляющих оси тепловой карты, может быть полезно для выделения закономерностей в данных и увеличения плотности информации на диаграмме.
Добавление аннотаций значений
Мы обрезали данные в меньший набор, чтобы упростить просмотр и сравнение некоторых из этих подборок. Здесь каждая ячейка теперь аннотирована базовыми значениями, что значительно упрощает их сравнение. Хотя это не так естественно и интуитивно понятно, как линейная диаграмма или гистограмма, это все же полезно.
Нанести эти значения на всю полученную тепловую карту было бы непрактично, поскольку числа были бы слишком маленькими для чтения.
Полезным компромиссом может быть добавление аннотаций только для определенных интересных значений. В следующем примере добавим аннотацию только для максимального значения.
Это делается путем создания набора меток аннотаций, которые можно передать в функцию annot heatmap() через параметр annot. Параметр annot_kws также можно использовать для управления такими аспектами метки, как размер используемого шрифта:
Вы можете проявить творческий подход в определении наборов специальных меток. Единственное ограничение заключается в том, что данные, которые вы передаете для меток, должны быть того же размера, что и данные, которые вы выводите на график. Кроме того, если ваши метки являются строками, вы должны передать параметр fmt=» чтобы Seaborn не интерпретировал ваши метки как числа.
Линии сетки и квадраты
Давайте добавим тонкую белую линию между каждой ячейкой, чтобы подчеркнуть, что это отдельные записи:
В каждом из этих случаев вам решать, способствуют ли эти эстетические изменения целям вашей визуализации.
Категориальные тепловые карты в Seaborn
К сожалению, на момент написания Seaborn не имеет встроенной возможности создавать тепловые карты для таких категориальных данных, поскольку ожидает ввода числовых значений. Вот фрагмент кода, который показывает, что его можно «подделать» с помощью небольшой палитры и взлома цветовой полосы.
Хотя это одно обстоятельство, при котором вы можете рассмотреть достоинства других пакетов визуализации, которые имеют такие встроенные функции.
Мы воспользуемся помощью Matplotlib, движка, лежащего в основе Seaborn, поскольку он имеет множество низкоуровневых параметров настройки, и у нас есть полный доступ к нему. Здесь мы можем «взломать» легенду справа, чтобы отобразить желаемые значения:
Подготовка тепловых карт к презентации
Несколько последних шагов, чтобы добавить последние штрихи к тепловой карте.
Использование контекста Seaborn для управления внешним видом
Функция set_context() предоставляет удобный способ управления некоторыми элементами графика без изменения его общего стиля. Например, это может быть удобный способ настройки размеров и семейств шрифтов.
Использование подзаголовков для управления компоновкой тепловых карт
Мы можем использовать функцию subplot() matplotlib.pyplot для управления компоновкой тепловых карт в Seaborn. Это даст вам максимальный контроль над окончательной графикой и позволит легко экспортировать изображение.
Создать подзаголовки с помощью Matplotlib так же просто, как определить их форму (в нашем случае 2 подзаголовка в 1 столбце):
Заключение
В этом руководстве мы рассмотрели тепловые карты и способы их создания с помощью Python и библиотеки визуализации Seaborn.
Сила тепловых карт заключается в том, как они используют цвет для передачи информации, другими словами, они позволяют любому легко увидеть общие закономерности с первого взгляда.
Мы видели, как для этого нужно тщательно выбирать цветовую палитру и масштаб. Мы также видели, что существует ряд опций для настройки тепловой карты с помощью Seaborn, чтобы выделить определенные аспекты диаграммы. К ним относятся аннотации, категориальные оси группировки и упорядочения, а также макет.
Как всегда, редакционная оценка со стороны визуализатора данных необходима для выбора наиболее подходящих настроек для контекста визуализации.
Существует множество вариантов тепловых карт, которые могут вас заинтересовать, включая радиальные тепловые карты, мозаичные графики или матричные диаграммы.