Как присвоить цвет точке рассеивания

Я пытаюсь назначить цвет точкам на диаграмме рассеяния matplotlib на основе значения, которое не связано со значением x или y. Каждая точка может быть, например, одним из 3 значений, поэтому я хочу три разных цвета для 3 возможных значений. Итак, есть 3 массива: x_arr, y_arr и val_arr, где каждый элемент val_arr может быть 1, 2 или 3. Похоже, что большинство примеров, которые я видел, имеют цвет на основе позиции в массиве, а не на основе самостоятельное значение.

Чтобы получить высокий контраст между тремя типами точек для лучшей видимости там, где точек много, я сделал что-то вроде этого:

 pt_color = plt.cm.Dark2(np.linspace(0, 1, 3))

Чего я не могу понять, так это того, как назначить правильный цвет для каждого элемента значения. Концептуально я хотел бы сделать что-то вроде этого,

gr.scatter(x_arr, y_arr, c=val_arr, cmap=pt_color)

где каждый элемент val_arr сопоставляется с цветом с помощью pt_color, но вышеописанное не работает (я получаю ошибку TypeError, потому что pt_color — нехешируемый тип).

Любые указатели приветствуются.


person ChrisF    schedule 17.09.2015    source источник
comment
Почему бы не разделить ваш val_arr на три разных массива, тогда вы можете легко присвоить разные цвета каждому набору значений... Однако вам нужно скрыть легенду, потому что вы не хотите видеть, что есть 3 набора групп.   -  person Richard    schedule 17.09.2015
comment
@ Ричард Интересная идея. Это может стать довольно запутанным, потому что, хотя я сказал, что есть только 3 типа точек, это было сделано только для упрощения проблемы. Может быть, скажем, 32 различных типа. Спасибо за предложение.   -  person ChrisF    schedule 17.09.2015


Ответы (1)


import matplotlib.pyplot as plt
from numpy.random import random, randint

X = random(10)
Y = random(10)
val_arr = randint(low=0, high=3, size=10)
plt.scatter(X, Y, c=val_arr,
            s=40)
plt.colorbar()
plt.show()

размещает значения val_arr над цветовой картой по умолчанию, а цветовая полоса объясняет, что означают цвета val_arr.

введите здесь описание изображения

person cphlewis    schedule 17.09.2015
comment
настройка makeredegcolor='none' помогает при появлении мелких точечных маркеров светлых тонов. - person tacaswell; 17.09.2015
comment
@cphlewis Спасибо. Это выглядит довольно хорошо. У меня много точек рядом друг с другом. Поскольку первые 2 цвета на карте по умолчанию (красный и синий, если смотреть на ваше изображение) оба темные, их может быть трудно различить. Я предположил, что по умолчанию используется какая-то постепенная карта, где 2 соседних числа (например, 1 и 2) будут иметь почти одинаковые цвета, но я вижу, что это не так. Во всяком случае, именно это побудило меня попробовать cmap не по умолчанию. - person ChrisF; 17.09.2015
comment
@tcaswell Спасибо. Этот кварг мне не подошел. Как и makeedgecolors (при условии, что у вас опечатка). Кроме того, это отличается от edgecolors='None', который мне подходит? - person ChrisF; 17.09.2015
comment
Смежный вопрос... Я не знаю, как изменить легенду для этого графика. В моем предыдущем коде у меня было что-то вроде: leg_colors = plt.cm.Dark2(np.linspace(0, 1, 3)) recs = [] for i in range(3) recs.append(mpatches.Rectangle(0,0),1,1,fc=leg_colors[i]) Как можно указать циклически переключаться между цветами по умолчанию вместо использования Dark2, как в приведенном выше случае для прямоугольников легенды? Другими словами, как бы вы добавили легенду к приведенному вами примеру? - person ChrisF; 17.09.2015
comment
Проверьте markeredgecolor. (Хотя я должен сказать, что я думаю, что сохранение поля помогает с изображениями низкого качества, поэтому это зависит от того, как люди будут смотреть на это.) Не используйте легенду только для объяснения цветов; вот для чего нужна цветовая полоса (добавлено). - person cphlewis; 17.09.2015
comment
Я мог бы попробовать цветную полосу; это выглядит проще. Но это подразумевает, что диапазон значений непрерывен. В моем случае значения представляют собой дискретные целые числа, поэтому я изначально выбрал легенду. - person ChrisF; 18.09.2015
comment
Формы — стили маркеров — могут быть лучшим «познавательным» средством? совпадают, так как они еще более явно категоричны. Вы можете сделать оба сразу, например. с пандами, как в этот пример - person cphlewis; 18.09.2015