Создание расходящейся цветовой палитры со средним диапазоном вместо средней точки

Я использую пакет python seaborn для создания расходящейся цветовой палитры (seaborn.diverging_palette).

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

Например, мои значения от 0 до 20. Итак, моя средняя точка равна 10. Следовательно, только 10 в белом, а затем он становится более зеленым/более синим при переходе к 0/20. Я хотел бы сохранить белый цвет от 7 до 13 (3 до/после середины), а затем начать переходить к зеленому/синему.

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

Кто-нибудь знает связь между sep и шкалой значений? Или если бы другой параметр мог выполнять ожидаемое поведение?


person pip    schedule 08.03.2016    source источник


Ответы (1)


Похоже, что параметр sep может принимать любое целое число от 1 до 254. Доля цветовой карты, которая будет покрыта цветом средней точки, будет равна sep/256.

Возможно, простой способ визуализировать это — использовать seaborn.palplot с n=256, чтобы разделить палитру на 256 цветов.

Вот палитра с sep = 1:

sns.palplot(sns.diverging_palette(0, 255, sep=1, n=256))

введите описание изображения здесь

А вот и палетка с sep = 8

sns.palplot(sns.diverging_palette(0, 255, sep=8, n=256))

введите описание изображения здесь

Вот sep = 64 (т. е. четверть палитры — это средний цвет)

sns.palplot(sns.diverging_palette(0, 255, sep=64, n=256))

введите описание изображения здесь

Вот sep = 128 (т. е. одна половина — это средний цвет)

sns.palplot(sns.diverging_palette(0, 255, sep=128, n=256))

введите описание изображения здесь

А вот sep = 254 (т.е. все цвета, кроме самого края палитры, являются цветом средней точки)

sns.palplot(sns.diverging_palette(0, 255, sep=254, n=256))

введите описание изображения здесь

Ваша конкретная палитра

Таким образом, для вашего случая, когда у вас есть диапазон 0 - 20, но диапазон средней точки 7 - 13, вы бы хотели, чтобы часть палитры была средней точкой, равной 6/20. Чтобы преобразовать это в sep, нам нужно умножить на 256, так что мы получим sep = 256 * 6 / 20 = 76.8. Однако sep должно быть целым числом, поэтому давайте использовать 77.

Вот сценарий для создания расходящейся палитры и построения цветовой шкалы, чтобы показать, что использование sep = 77 оставляет правильный средний цвет между 7 и 13:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

# Create your palette
cmap = sns.diverging_palette(0,255,sep=77, as_cmap=True)

# Some data with a range of 0 to 20
x = np.linspace(0,20,20).reshape(4,5)

# Plot a heatmap (I turned off the cbar here, so I can create it later with ticks spaced every integer)
ax = sns.heatmap(x, cmap=cmap, vmin=0, vmax=20, cbar = False)

# Grab the heatmap from the axes
hmap = ax.collections[0]

# make a colorbar with ticks spaced every integer
cmap = plt.gcf().colorbar(hmap)
cmap.set_ticks(range(21))

plt.show()

введите описание изображения здесь

person tmdavison    schedule 11.03.2016
comment
В вызовах sns.palplot отсутствует правая скобка - person Tyler; 06.02.2019
comment
@Tyler Спасибо, исправлено - person tmdavison; 06.02.2019