Как создать дискретную цветовую карту, которая отображает целые числа в цвета, инвариантные к диапазону входных данных - PullRequest
1 голос
/ 19 июня 2019

Допустим, у меня есть вектор, содержащий целые числа из набора [1,2,3].Я хотел бы создать цветовую карту, в которой 1 всегда отображается синим цветом, 2 всегда красным, а 3 всегда фиолетовым, независимо от диапазона входных данных - например, даже если входной вектор содержит только 1 и 2Мне бы все же хотелось, чтобы они отображались синим и красным соответственно (и фиолетовый в этом случае не используется).

Я пробовал код ниже:

Это работает как ожидалось (данные содержат 1, 2 и 3):

cmap = colors.ListedColormap(["blue", "red", "purple"])
bounds = [0.5,1.5,2.5,3.5]
norm = colors.BoundaryNorm(bounds, cmap.N)

data = np.array([1,2,1,2,3])
sns.heatmap(data.reshape(-1,1), cmap=cmap, norm=norm, annot=True)

Не работает должным образом (данныесодержит только 1 и 2):

cmap = colors.ListedColormap(["blue", "red", "purple"])
bounds = [0.5,1.5,2.5,3.5]
norm = colors.BoundaryNorm(bounds, cmap.N)

data = np.array([1,2,1,2,2])
sns.heatmap(data.reshape(-1,1), cmap=cmap, norm=norm, annot=True)

В первом примере 1 отображается синим цветом, 2 - красным, а 3 - фиолетовым по желанию.

Во втором примере 1 отображается синим цветом, а 2 - фиолетовым, а красный не используется.

1 Ответ

0 голосов
/ 20 июня 2019

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

#0. Import libraries
#==============================
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import colors
import seaborn as sns
import numpy as np
#==============================

#1. Create own colormap
#======================================

#1.1. Choose the colormap you want to
#pick up colors from
source_cmap=matplotlib.cm.get_cmap('Set2')

#1.2. Choose number of colors and set a step
cols=4;step=1/float(cols - 1)

#1.3. Declare a vector to store given colors
cmap_vec=[]

#1.4. Run from 0 to 1 (limits of colormap)
#stepwise and pick up equidistant colors
#---------------------------------------
for color in np.arange(0,1.1,step):
    #store color in vector
    cmap_vec.append( source_cmap(color) )
#---------------------------------------

#1.5. Create colormap with chosen colors
    custom_cmap=\
    colors.ListedColormap([ color for color in cmap_vec ])
#====================================

#2. Basic example to plot in
#======================================
A = np.matrix('0 3; 1 2')
B=np.asarray(A)
ax=sns.heatmap(B,annot=True,cmap=custom_cmap)
plt.show()
#======================================
...