Matplotlib: Дискретная цветовая панель не работает для пользовательских меток - PullRequest
0 голосов
/ 17 марта 2019

Я столкнулся с серьезной проблемой, когда пытался добавить цветовую шкалу в график рассеяния, который указывает, к каким классам принадлежит отдельный образец. Код отлично работает, когда классы равны [0,1,2], но когда классы, например, [4,5,6], выбирает colorbar, автоматически выбираются значения цвета в конце colormap, и colorbar выглядит сплошным синим цветом. Мне не хватает чего-то очевидного, но я просто не могу понять, что это такое.

Вот пример кода о проблеме:

import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(1 , figsize=(6, 6))
plt.scatter(datapoints[:,0], datapoints[:,1], s=20, c=labels, cmap='jet', alpha=1.0)
plt.setp(ax, xticks=[], yticks=[])
cbar = plt.colorbar(boundaries=np.arange(len(classes)+1)-0.5)
cbar.set_ticks(np.arange(len(classes)))
cbar.set_ticklabels(classes)
plt.show()

Переменные могут быть, например,

datapoints = np.array([[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7]])
labels = np.array([4,5,6,4,5,6,4])
classes = np.array([4,5,6])

Правильный результат получается, когда

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

В моем случае я хочу, чтобы он работал и для классов [4,5,6]

1 Ответ

1 голос
/ 17 марта 2019

buoundaries должно быть в единицах данных.Это означает, что если ваши классы 4,5,6, вы, вероятно, хотите использовать границы 3.5, 4.5, 5.5, 6.5.

import matplotlib.pyplot as plt
import numpy as np

datapoints = np.array([[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7]])
labels = np.array([4,5,6,4,5,6,4])
classes = np.array([4,5,6])


fig, ax = plt.subplots(1 , figsize=(6, 6))
sc = ax.scatter(datapoints[:,0], datapoints[:,1], s=20, c=labels, cmap='jet', alpha=1.0)
ax.set(xticks=[], yticks=[])
cbar = plt.colorbar(sc, ticks=classes, boundaries=np.arange(4,8)-0.5)

plt.show()

enter image description here

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

boundaries=np.arange(classes.min(), classes.max()+2)-0.5

В общем случае альтернативой может быть использование BoundaryNorm, как показано, например, в Создание дискретной цветовой полосы в matplotlib или Как указать разные цвета для определенного диапазона значений года на одном рисунке?(Python) или квантование цветовой карты Python (matplotlib)

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