首页 > 解决方案 > plt.scatter 无法识别由 ListedColormap() 生成的 cmap

问题描述

我正在尝试使用 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 -> 蓝色)可能是错误的。

任何提示将不胜感激。

标签: pythonmatplotlib

解决方案


基于@ImportanceOfBeingEarnest的评论,对于您当前的 值labels,如果您考虑 0-33.33、33.34-66.66、66.67-100 的等距范围,您将不会得到黄色。以下答案突出了这一点。然而,下面的第二个图显示黄色,前提是您有labels正确的范围之间的下降。查看官方页面以获取更多示例BoundaryNorm

这里的关键线是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)

在此处输入图像描述


推荐阅读