Установить цветовые ограничения для карты цветов matplotlib - PullRequest
0 голосов
/ 20 апреля 2020

Я сделал функцию для получения шестнадцатеричного кода, заданного для набора данных следующим образом:

from matplotlib import cm, colors
def get_color(series_data, cmap='Reds'):
    color_map = cm.get_cmap(cmap, 20)
    f = lambda x: colors.rgb2hex(color_map(x/series_data.max())[:3])
    return series_data.apply(f)

* cm.get_cmap(cmap, 20) генерирует объект matplotlib.colors.LinearSegmentedColormap, который ранжируется от минимального значения вход series_data на максимум.

Я не вижу, как я могу определить пределы цвета для данных, которые будут оценены. Например, что если я хотел бы установить постоянные ограничения цвета, определяя как минимум значение 0 и максимум 100? Как я мог сделать это в моей функции?

Я пытался заменить series_data.max() на 100, чтобы контролировать максимальный эквивалентный цвет (max), но я не мог контролировать cmin.

1 Ответ

1 голос
/ 27 апреля 2020

Параметр color_map необходимо масштабировать до диапазона [0., 1.). Например, если для значения lo (hi) необходимо получить минимальное (максимальное) значение цвета:

from matplotlib import cm, colors
import pandas as pd

def get_color(series_data, cmap='Reds', lo=None, hi=None):
    if lo is None:
        lo = series_data.min()
    if hi is None:
        hi = series_data.max()
    if lo == hi:
        raise Exception('Invalid range.')
    color_map = cm.get_cmap(cmap, 20)
    f = lambda x: colors.rgb2hex(color_map((x-lo)/(hi-lo))[:3])
    return series_data.apply(f)

s = pd.Series(np.linspace(0,3,16))
colz = get_color(s, lo=1, hi=2)
for x, c in zip(s, colz):
    print('{:.2f} {}'.format(x,c))

Пример вывода составляет

0.00 #fff5f0
0.20 #fff5f0
0.40 #fff5f0
0.60 #fff5f0
0.80 #fff5f0
1.00 #fff5f0
1.20 #fdc7b0
1.40 #fc8363
1.60 #ed392b
1.80 #af1117
2.00 #67000d
2.20 #67000d
2.40 #67000d
2.60 #67000d
2.80 #67000d
3.00 #67000d
...