matplotlib - 如何创建将整数映射到颜色的离散颜色图,不受输入数据范围的影响
问题描述
假设我有一个向量,其中包含集合 [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 显示为紫色,而未使用红色。
解决方案
不完全确定,但我认为这个最小的例子可以解决你的问题。在这里,我采用了一个实际的颜色图并对其进行了编辑以生成它的较小版本。希望能帮助到你!
#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()
#======================================
推荐阅读
- flutter - Flutter Stripe 原生支付崩溃
- python - QTableWidget子窗口如何放在父窗口前面或父窗口下面?
- javascript - 单击菜单项后导航栏抽屉菜单未关闭
- javascript - 将 div 移动到父 div 的顶部
- latex - 带黑色三角形的开始和结束部分
- reactjs - 从 Material UI 分页中获取价值
- c++ - C 终端程序中的状态行
- validation - 如何使用验证器 v10 验证 null.v4 包类型的结构字段?
- java - openjdk-8-jdk - 缺少 src.zip?
- java - 将列表中的数据映射到java中新对象列表的属性