Как настроить цветовую панель тепловой карты - PullRequest
0 голосов
/ 28 октября 2019

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

Я определил параметры vmin и vmax в функции heatmap (). Похоже, что цвета отображаются равномерно при отображении значений между vmin и vmax. Однако длина интервалов, для которых применяется цвет, изменяется от цвета к цвету.

Код выглядит следующим образом:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns

X=np.array([
    [ 81.31,  99.91,  99.91,  81.31,  99.91],
    [ 99.91,  99.91,  99.91,  99.91,  99.91],
    [ 99.87,  99.87,  99.87,  99.87,  99.87],
    [ 99.98,  99.98,  99.98,  99.98,  99.98],
    [ 75.64,  75.64,  75.64,  75.62,  75.64],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [ 98.01,  98.01,  98.01,  97.98,  98.01],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [ 93.75,  99.98,  99.98,  93.75,  99.98],
    [ 93.64,  93.64,  93.64,  73.64,  73.64],
    [ 99.98,  79.98,  79.98,  99.98,  99.98],
    [ 99.91,  99.91,  99.91,  99.91,  99.91],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [ 99.96,  99.96,  69.96,  69.96,  99.96],
    [ 99.98,  99.98,  49.98,  49.98,  99.98],
    [ 99.98,  99.98,  99.98,  99.98,  99.98],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [ 99.89,  99.89,  99.89,  99.89,  99.89],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [ 99.87,  99.87,  99.87,  99.87,  99.87]
])
index=['Test{:02d}'.format(i) for i in range(22)]
cols=['Day{}'.format(i) for i in range(1,6)]
X=pd.DataFrame(X,index=index,columns=cols)

fig, ax= plt.subplots(figsize=(12,12))


# colors: red=[0,50], yellow=[50,75], orange=[75,90], green=[90,100]
sns.heatmap(
    data=X,
    ax=ax,
    vmax=100, vmin=0,
    cmap=sns.color_palette(['red', 'yellow', 'orange', 'green']), 
    linewidths=.5, linecolor='lightgray',
    annot=True, fmt=".1f",
    cbar_kws={'pad': .02, 'ticks': [0, 50, 75, 90, 100]},
)
ax.set_yticklabels(ax.get_yticklabels(), rotation=0);

Я ожидаю, что все ячейки со значениями от

  • 100 до 90 будут окрашены в зеленый цвет;
  • 90 и 75 окрашены в оранжевый цвет;
  • 75 и 50 окрашены в желтый цвет;
  • 50 и 0 будут окрашены в красный цвет.

Обновление: 2019-11-02

В случае, если кто-то еще может столкнуться с подобной проблемой, этоРешение, которое я придумал, используя указания из @ImportanceOfBeingErnest:

импортировать библиотеки

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import seaborn as sns

создать настраиваемую карту

# define 100 colors using an existing color map
newcolors = plt.get_cmap('viridis',100).colors

# assign new colors of interest
newcolors[  : 50, :] = colors.to_rgba('red')
newcolors[50: 75, :] = colors.to_rgba('yellow')
newcolors[75: 90, :] = colors.to_rgba('orange')
newcolors[90:100, :] = colors.to_rgba('green')

# create the customized color map
mycmap = colors.ListedColormap(newcolors)

создать пример данных

X = np.array([
    [ 81.31,  99.91,  99.91,  81.31,  99.91],
    [ 99.91,  99.91,  99.91,  99.91,  99.91],
    [ 99.87,  99.87,  99.87,  99.87,  99.87],
    [ 99.98,  99.98,  99.98,  99.98,  99.98],
    [ 75.64,  75.64,  75.64,  75.62,  75.64],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [ 98.01,  98.01,  98.01,  97.98,  98.01],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [ 93.75,  99.98,  99.98,  93.75,  99.98],
    [ 93.64,  93.64,  93.64,  73.64,  73.64],
    [ 99.98,  79.98,  79.98,  99.98,  99.98],
    [ 99.91,  99.91,  99.91,  99.91,  99.91],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [ 99.96,  99.96,  69.96,  69.96,  99.96],
    [ 99.98,  99.98,  49.98,  49.98,  99.98],
    [ 99.98,  99.98,  99.98,  99.98,  99.98],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [ 99.89,  99.89,  99.89,  99.89,  99.89],
    [100.  , 100.  , 100.  , 100.  , 100.  ],
    [ 99.87,  99.87,  99.87,  99.87,  99.87]
])
index = ['Test{:02d}'.format(i) for i in range(22)]
cols = ['Day{}'.format(i) for i in range(1,6)]
X = pd.DataFrame(X,index=index,columns=cols)

производим сюжет

# use the new color map
fig, ax = plt.subplots(figsize=(12,12))
sns.heatmap(
    data=X,
    ax=ax,
    vmax=100, vmin=0,
    cmap=mycmap,
    linewidths=.5, 
    linecolor='lightgray',
    annot=True, 
    fmt=".1f",
    cbar_kws={
        'pad': .02, 
        'ticks': [0, 50, 75, 90, 100],
    },
)
ax.set_yticklabels(ax.get_yticklabels(), rotation=0);

результат

heatmap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...