Как сделать так, чтобы cmap разумно соответствовал списку для целей индикатора? - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь использовать карту цветов для обозначения метки, которой принадлежит каждая точка данных в наборе данных.

В моем дизайне есть 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 соответствует «салатовый».

уродливый раствор (фрагмент_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

вывод теперь приемлем с уродливым обходным путем.

решение по этому посту , кажется, здесь не применимо.

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 должна соответствовать "известковому".

есть ли способ сделать вещи элегантными?

Ответы [ 2 ]

1 голос
/ 18 июня 2019

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

1 голос
/ 18 июня 2019

, вдохновленный @ss95, это может удовлетворить ваши потребности.

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...