Управление цветом

Работая с разными типами графиков, рано или поздно, вы заметите, что цвет элементов (особенно "легких", таких как точки и линии), в некоторых ситуациях облегчает восприятие, а в некоторых, наоборот, сильно усложняет. Если сравнивать данные с головоломкой, то графики - это подсказки, а цветовые палитры позволяют сделать эти подсказки более очевидными. Поэтому, внимательное отношение к цветовым схемам графика может оказаться очень полезной привычкой.

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

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

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()

Создание цветовых палитр

Пожалуй, самой важной функцией при работе с дискретными палитрами можно считать функцию color_palette(). Она используется во всех функциях, которые содержат аргумент palette и предоставляет интерфейс для создания многих палитр Seaborn. Вызов данной функции без аргументов вернет текущую цветовую палитру:

sns.color_palette()

Цветовая палитра Seaborn установленная по умолчанию

Условно, цветовые палитры можно разделить на три категории:

  • категориальные (или качественные) палитры - лучше всего подходят для визуализации категориальных данных;
  • последовательные палитры - используются для визуализации числовых данных;
  • расходящиеся палитры - подходят для визуализации числовых данных с категориальными границами.

Именно для создания этих палитр и может пригодиться функция color_palette(), которая может принимать любую цветовую палитру Seaborn, любую цветовую карту Matplotlib (кроме jet, которая по мнению создателя библиотеки Seaborn, вообще никогда не должна использоваться), а так же список цветов, в любом допустимом формате цветов Matplotlib.


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

Категориальные палитры лучше всего подходят для визуализации тяжелых элементов, таких как boxplot или violinplot. В этом случае необходимо просто различать элементы поэтому используются палитры из небольшого количества цветов. По умолчанию, установлена палитра всего из 10 цветов, вы уже видели ее выше. Но вы можете взглянуть и на другие палитры, например tab10:

sns.color_palette('tab10')

Цветовая палитра tab10 в Seaborn.

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

sns.color_palette('deep')

Цветовая палитра deep в Seaborn.

sns.color_palette('muted')

Цветовая палитра muted в Seaborn.

sns.color_palette('pastel')

Цветовая палитра pastel в Seaborn.

sns.color_palette('bright')

Цветовая палитра bright в Seaborn.

sns.color_palette('dark')

Цветовая палитра dark в Seaborn.

sns.color_palette('colorblind')

Цветовая палитра colorblind в Seaborn.

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

Круговые палитры

Если "тяжелых" элементов слишком много, т.е. очень много категорий в данных, то самый простой способ их различать, не выделяя ни одной из них - это использовать круговые палитры. Круговая палитра - это палитра цвета в которой меняются в циклическом пространстве цветов с сохранением яркости и насыщенности. Самый простой способ создания таких палитр - это применение пространства hls:

sns.color_palette('hls', 15)

Круговая цветовая палитра hls в Seaborn.

Если нужно контролировать яркость и насыщенность цветов, то можно воспользоваться функцией hls_palette():

sns.hls_palette(15, l=0.4, s=0.9)

Круговая цветовая палитра hls в Seaborn с настраиваемой яркостью и насыщенностью.

Однако, использование hls все же допускает выделение элементов, так как для нашей зрительной системы желтый цвет кажется более ярким чем синий. Если нужно гарантированно "сгладить" все элементы, то лучше воспользоваться системой husl (HSLuv):

sns.color_palette('husl', 15)

Круговая цветовая палитра husl в Seaborn.

Как видите, насыщенность и яркость в данной палитре выглядит гораздо равномернее. Если нужен более гибкий доступ к этой системе цветов, то можно воспользоваться функцией husl_palette():

sns.husl_palette(15, l=0.4, s=0.9)

Круговая цветовая палитра husl в Seaborn с настраиваемой яркостью и насыщенностью.

Категориальные палитры ColorBrewer

Инструмент ColorBrewer является хорошим источником палитр, но помимо этого он так же дает некоторые рекомендации по поводу того, какая палитра для какой ситуации лучше всего подходит. Что бы использовать палитры ColorBrewer достаточно указать их название:

sns.color_palette('RdPu', 10)

Цветовая палитра RdPu в Seaborn.

sns.color_palette('Set3', 10)

Цветовая палитра set3 в Seaborn.


Последовательные палитры

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

Matplotlib и ColorBrewer предоставляют большой выбор таких палитр. Например, вот несколько последовательных палитр из ColorBrewer:

sns.color_palette('Oranges', 10)

Последовательная цветовая палитра Oranges в Seaborn.

sns.color_palette('Purples', 10)

Последовательная цветовая палитра Purples в Seaborn.

В Matplotlib, что бы сменить направление изменения насыщенности и яркости нужно к названию палитры добавить суффикс '_r':

sns.color_palette('Greens', 10)    # прямое направление

Последовательная цветовая палитра Greens в Seaborn.

sns.color_palette('Greens_r', 10)     # обратное направление

Последовательная цветовая палитра Greens_r в Seaborn.

В Seaborn есть еще один суффикс - '_d', который позволяет "затемнить" последовательну палитру:

sns.color_palette('Greens_d', 10)

Последовательная цветовая палитра Greens_d в Seaborn.

Последовательные палитры cubehelix

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

sns.color_palette('cubehelix', 15)

Последовательная цветовая палитра cubehelix в Matplotlib.

В Seaborn данная палитра изменена так, что оттенок меняется гораздо слабее интенсивности:

sns.cubehelix_palette(15)

Последовательная цветовая палитра cubehelix в Seaborn.

Функция cubehelix_palette() позволяет настраивать данную палитру, например, можно задать начальный цвет (значения из интервала [0; 3]) и поворот в системе оттенков:

sns.cubehelix_palette(15, start=2, rot=0.5)

Последовательная цветовая палитра cubehelix в Seaborn с настройками начального цвета и поворота.

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

sns.cubehelix_palette(15, start=2, rot=0.5, dark=0.05, light=0.7, reverse=True)

Последовательная цветовая палитра cubehelix в Seaborn с настройками начального цвета, поворота и яркости концов.


Расходящиеся палитры

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

Matplotlib и ColorBrewer предоставляют большой выбор расходящихся палитр:

sns.color_palette('PRGn', 15)

Расходящаяся цветовая палитра PRGn в Seaborn.

sns.color_palette('PiYG', 15)

Расходящаяся цветовая палитра PiYG в Seaborn.

sns.color_palette('PiYG_r', 15)

Расходящаяся цветовая палитра PiYG_r в Seaborn.

sns.color_palette('PiYG_d', 15)

Расходящаяся цветовая палитра PiYG_d в Seaborn.