Я строю график ниже. Я хотел бы использовать четыре цвета для визуализации значений, связанных с каждой ячейкой.
Я определил параметры 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);
результат