如何创建一个离散的颜色图,将整数映射到颜色,而不改变输入数据的范围

时间:2019-06-18 22:16:55

标签: matplotlib colors seaborn colormap

比方说,我有一个向量,其中包含集合[1,2,3]中的整数。我想创建一个颜色图,其中无论输入数据的范围如何,1始终显示为蓝色,2始终显示为红色,3始终显示为紫色-例如,即使输入矢量仅包含1和2 ,我仍希望它们分别显示为蓝色和红色(在这种情况下不使用紫色)。

我尝试了以下代码:

这可以正常工作(数据包含1、2和3):

attention_1 = Dense(1, activation="tanh")(forwards_1)
attention_1 = Flatten()(attention_1)  # squeeze (None,50,1)->(None,50)
attention_1 = Activation("softmax")(attention_1)
attention_1 = RepeatVector(num_rnn_unit)(attention_1)
attention_1 = Permute([2, 1])(attention_1)
attention_1 = multiply([forwards_1, attention_1])
attention_1 = Lambda(lambda xin: K.sum(xin, axis=1), output_shape=(num_rnn_unit,))(attention_1)

last_out_1 = Lambda(lambda xin: xin[:, -1, :])(forwards_1)
sent_representation_1 = concatenate([last_out_1, attention_1])

无法正常工作(数据仅包含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,3])
sns.heatmap(data.reshape(-1,1), cmap=cmap, norm=norm, annot=True)

在第一个示例中,根据需要,1出现为蓝色,2出现为红色,3出现为紫色。

在第二个示例中,1显示为蓝色,2显示为紫色,而未使用红色。

1 个答案:

答案 0 :(得分:0)

不确定,但是我认为这个最小的示例可以解决您的问题。在这里,我已经拍摄了一个实际的色彩图并对其进行了编辑,以生成较小的色彩图。希望对您有帮助!

#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()
#======================================