Настройка цветовой шкалы в Seaborn - тепловая карта - PullRequest
0 голосов
/ 09 марта 2020

У меня есть тепловая карта для представления дискретных значений.

import seaborn as sns
import pandas as pd

data = np.array([[2, 1, 1, 1, 2, 3, 3, 3, 3, 3],
                 [3, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],])

x_labels = ['a', 'b', 'c', 'd']

dataFrame = pd.DataFrame(data.T)

#get discrete colormap
cmap = colors.ListedColormap(['blue','red','black','yellow'])

ax = sns.heatmap(dataFrame, cmap=cmap, linewidths=.5, linecolor='lightgray')
ax.set_xticklabels(x_labels)
ax.set_yticklabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'])

# Manually specify colorbar labelling after it's been generated
colorbar = ax.collections[0].colorbar
colorbar.set_ticks([1.3, 1.7, 2.2, 2.7])
colorbar.set_ticklabels(['A', 'B', 'C', 'NA'])

plt.show()

enter image description here enter image description here

Как я могу указать эти цвета таким образом, чтобы представлять цвета = {1: 'A', 2: 'B', 3: 'C', 4: 'NA'} в данных

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

По умолчанию цветовые карты масштабируются до диапазона ваших данных. В вашем случае ваши данные равны [1-3], поэтому matplotlib масштабирует вашу четырехцветную цветовую карту до этого диапазона.

Поскольку вы фактически хотите масштабировать цветовую карту до диапазона [1-4 ], вам придется использовать аргументы vmin= и vmax=, чтобы сообщить системе, какой диапазон данных использовать.

ax = sns.heatmap(dataFrame, cmap=cmap, linewidths=.5, linecolor='lightgray', vmin=1, vmax=4)
1 голос
/ 09 марта 2020

Это соответствует порядку, который вы даете. Так как ваш код имеет

cmap = ListedColormap(['red','black','yellow', 'blue'])
colorbar.set_ticklabels(['A', 'B', 'C', 'NA'])

Цвета сопоставлены с этими категориями. Измените порядок, скажем, на ['red','black', 'blue','yellow'], и ярлыки изменятся соответственно.

...