我正在尝试使用ListedColormap()为散点图自定义颜色图。
这是散点图的数据集:
labels = [ 0, 1, 1, 100, 100]
X = np.array([[0, 2],
[0, 0],
[1, 0],
[5, 0],
[5, 2]])
这段代码
color_list = ["red", "yellow", 'blue']
cmap = mpl.colors.ListedColormap(color_list)
plt.scatter(X[:,0], X[:,1], c=labels, cmap=cmap, s=200);
输出
似乎plt.scatter
无法识别cmap
生成的ListedColormap()
。
我构造了cmap
,使其左下角的点为黄色,这是没有发生的。
我对颜色顺序的理解(0->红色,1->黄色,100->蓝色)可能是错误的。
任何提示将不胜感激。
答案 0 :(得分:0)
以@ImportanceOfBeingEarnest的注释为基础,对于您当前的labels
值,如果考虑等距范围0-33.33、33.34-66.66、66.67-100,则不会出现黄色。以下答案突出了这一点。但是,如果labels
落在正确的范围内,则下面的第二个图显示黄色。在BoundaryNorm
上查看official page以获得更多示例。
这里的关键行是ranges = np.linspace(labels.min(), labels.max(), len(color_list)+1)
,它将您的值范围(labels
)分成相等的间隔。
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
labels = np.array([ 0, 1, 1, 100, 100]) # converted to array for ease
X = np.array([[0, 2], [0, 0], [1, 0], [5, 0], [5, 2]])
color_list = ["red", "yellow", 'blue']
cmap = mpl.colors.ListedColormap(color_list)
ranges = np.linspace(labels.min(), labels.max(), len(color_list)+1)
norm = mpl.colors.BoundaryNorm(ranges, cmap.N)
plt.scatter(X[:,0], X[:,1], c=labels, cmap=cmap, s=200, norm=norm)
带有黄点
labels = np.array([ 0, 56, 63, 100, 100]) # <--- new label values
X = np.array([[0, 2], [0, 0], [1, 0], [5, 0], [5, 2]])
color_list = ["red", "yellow", 'blue']
cmap = mpl.colors.ListedColormap(color_list)
ranges = np.linspace(labels.min(), labels.max(), len(color_list)+1)
norm = mpl.colors.BoundaryNorm(ranges, cmap.N)
plt.scatter(X[:,0], X[:,1], c=labels, cmap=cmap, s=200, norm=norm)