首页 > 解决方案 > 如何创建将整数映射到颜色的离散颜色图,不受输入数据范围的影响

问题描述

假设我有一个向量,其中包含集合 [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 显示为紫色,而未使用红色。

标签: matplotlibcolorsseaborncolormap

解决方案


不完全确定,但我认为这个最小的例子可以解决你的问题。在这里,我采用了一个实际的颜色图并对其进行了编辑以生成它的较小版本。希望能帮助到你!

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

推荐阅读