gpt4 book ai didi

python - 如何让 cmap 智能匹配列表以达到指标目的?

转载 作者:行者123 更新时间:2023-12-01 07:42:11 26 4
gpt4 key购买 nike

我正在尝试使用颜色图来指示数据集中每个数据点所属的标签。

有3个示例以及对应的标签

X = np.array([[0,0],[1,0],[2,0]])
labels = np.array([0,1,2])

在我的设计中,标签[0,1,2]分别由“深红色”,“柠檬绿”,“海军蓝”表示。

color_list = ["crimson", "limegreen", "navy"]
cmap = mpl.colors.ListedColormap(color_list)
plt.scatter(X[:,0],X[:,1], c = labels, cmap=cmap, s=100)

输出

enter image description here

到目前为止,一切都很好。

当标签改变时,事情就会变得丑陋

labels[2] = 1
cmap = mpl.colors.ListedColormap(color_list)
plt.scatter(X[:,0],X[:,1], c = labels, cmap=cmap, s=100)

输出

enter image description here

这是合理的,因为标签 1 是标签中最大的标签,而“navy”是最大的 cmap。

但这不是我需要的。在我的设计中,标签1对应于“limegreen”。

如下所示的丑陋解决方案 (snippet_1)

color_list = color_list[:-1]
cmap = mpl.colors.ListedColormap(color_list)
plt.scatter(X[:,0],X[:,1], c = labels, cmap=cmap, s=100)

输出

enter image description here

现在的输出是可以接受的,但有一个丑陋的解决方法。

这个问题的解决方案post似乎不适用于此处。

X = np.array([[0,0],[1,0],[2,0]])
labels = np.array([0,1,1])
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=100, norm=norm)

输出

enter image description here

标签 1 应对应于“limegreen”。

有没有办法让事情变得优雅?

最佳答案

BoundaryNorm 需要考虑所有可能的标签。因此,从可用的颜色开始并枚举它们是有意义的。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors


X = [0,1,2]
labels = np.array([[0,1,2], [0,0,2], [1,1,1], [1,2,1]])

color_list = ["crimson", "limegreen", "navy"]
cmap = mcolors.ListedColormap(color_list)
norm = mcolors.BoundaryNorm(np.arange(len(color_list)+1)-.5, cmap.N)

for label in labels:
sc = plt.scatter(X,[f"{label}"]*3, c = label, norm=norm, cmap=cmap, s=100)

plt.colorbar(sc, ticks=np.arange(len(color_list)))
plt.show()

enter image description here

关于python - 如何让 cmap 智能匹配列表以达到指标目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56642301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com