python - 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 -> 蓝色)可能是错误的。
任何提示将不胜感激。
解决方案
基于@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)
推荐阅读
- javascript - 我不明白这个警告有什么问题 - 列表中的每个孩子都应该有一个唯一的“关键”道具
- php - 在 PHP 中显示文件中的图像的问题
- kubernetes - Kubernetes 将密钥作为令牌注入到设置的模板文件 AKS
- python - 使用具有不同长度值的 dict 填充数据帧
- javascript - 如何在同一字段的两个用户 ID 中获取第二个用户 ID
- javascript - 如何在 API 调用中编写 if 语句以模拟加载状态?
- swift - 无法将“NSSplitViewController”(0x7fff8fbe20c8)类型的值转换为“AppName.ViewController”(0x100049988)
- r - 如何为 r 包记录数据集?
- svg - 为什么我打包的 Electron 应用程序不显示 SVG?
- dataframe - groupByKey 可以用来优化和减少计算工作吗