Matplotlib 如何创建一个离散的颜色映射,将整数映射到颜色,对输入数据的范围保持不变

Matplotlib 如何创建一个离散的颜色映射,将整数映射到颜色,对输入数据的范围保持不变,matplotlib,colors,seaborn,colormap,Matplotlib,Colors,Seaborn,Colormap,假设有一个向量包含集合[1,2,3]中的整数。我想创建一个颜色映射,其中1始终显示为蓝色,2始终显示为红色,3始终显示为紫色,而不管输入数据的范围如何——例如,即使输入向量仅包含1和2,我仍然希望它们分别显示为蓝色和红色(在本例中不使用紫色) 我尝试了以下代码: 这与预期一样有效(数据包含1、2和3): cmap=colors.ListedColormap([“蓝色”、“红色”、“紫色”)) 界限=[0.5,1.5,2.5,3.5] 范数=颜色。边界范数(边界,cmap.N) data=np.数

假设有一个向量包含集合[1,2,3]中的整数。我想创建一个颜色映射,其中1始终显示为蓝色,2始终显示为红色,3始终显示为紫色,而不管输入数据的范围如何——例如,即使输入向量仅包含1和2,我仍然希望它们分别显示为蓝色和红色(在本例中不使用紫色)

我尝试了以下代码:

这与预期一样有效(数据包含1、2和3):

cmap=colors.ListedColormap([“蓝色”、“红色”、“紫色”))
界限=[0.5,1.5,2.5,3.5]
范数=颜色。边界范数(边界,cmap.N)
data=np.数组([1,2,1,2,3])
sns.heatmap(数据重塑(-1,1),cmap=cmap,norm=norm,annot=True)
未按预期工作(数据仅包含1和2):

cmap=colors.ListedColormap([“蓝色”、“红色”、“紫色”))
界限=[0.5,1.5,2.5,3.5]
范数=颜色。边界范数(边界,cmap.N)
data=np.数组([1,2,1,2,2])
sns.heatmap(数据重塑(-1,1),cmap=cmap,norm=norm,annot=True)
在第一个示例中,根据需要,1显示为蓝色,2显示为红色,3显示为紫色


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

不完全确定,但我认为这个最小的示例解决了您的问题。在这里,我已经采取了一个实际的彩色地图,并编辑它,以产生一个较小的版本。希望有帮助

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

不完全确定,但我认为这个最小的例子解决了您的问题。在这里,我已经采取了一个实际的彩色地图,并编辑它,以产生一个较小的版本。希望有帮助

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

可能是seaborn中的一个bug,因为当您使用
plt.imshow
plt.pcolormesh
而不是
sns.heatmap
时,它会按预期工作。有趣的是,感谢您指出这一点——使用这些命令时,它也会按预期工作。这实际上是我在使用另一个不调用seaborn AFAIK的软件包(nilearn)中的绘图函数时发现的一个问题的最小工作示例,因此我需要深入研究该软件包的调用以了解发生了什么。可能是seaborn中的一个bug,因为当您使用
plt.imshow
plt.pcolormesh
而不是
sns.heatmap
时,它会按预期工作。有趣的是,感谢您指出这一点——使用这些命令时,它也会按预期工作。这实际上是我在使用另一个不调用seaborn AFAIK的软件包(nilearn)中的绘图函数时发现的一个问题的最小工作示例,因此我需要深入研究该软件包的调用以了解发生了什么。