Как раскрасить каждый массив точек x, y в списке

#python #matplotlib

Вопрос:

У меня проблема с паром:

У меня есть список массивов с точками x, y, например, 100 массивов с формой (400, 2) (или просто массив формы (100, 400, 2) ), где последнее измерение соответствует координатам x, y. Я хотел бы раскрасить каждый массив другим цветом, отличным от цветового градиента, как показано на рисунке ниже:

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

Итак, точки, соответствующие 0, 1, 2 … 10 имеют цвета от фиолетового до синего, от 10 до 100-от зеленого до желтого и т. Д.

Я попробовал использовать приведенный ниже код:

 import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib as mpl
import numpy as np

N = 100
my_cord = np.stack([np.random.randn(400, 2)   np.random.randn(1, 2)*10 for j in range(N)])
fig, ax = plt.subplots()
cmap = plt.get_cmap('spring', N)
for i in range(N):
    x, y = my_cord[i].T
    cf = ax.scatter(x, y, cmap=cmap(i))

norm = mpl.colors.Normalize(vmin=0,vmax=N)
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
plt.colorbar(sm)


ax.set_xlabel('IC 1')
ax.set_ylabel('IC 2')
fig.tight_layout()
plt.show()
 

но я получаю другие цвета диаграммы рассеяния, чем определено в cmap:

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

Комментарии:

1. Установите значение альфа/прозрачности цветов.

2. @KonradRudolph Но тогда очки «исчезнут» или вы что-то имеете в виду ?

3. cf = ax.scatter(x, y, color=cmap(i)) Разве это не правильная настройка?

4. @r-новичкам Спасибо, это работает! Не могли бы вы опубликовать это в качестве ответа ?

5. @DanielWiczew Весь смысл в том, чтобы исчезнуть, да. Посмотрите на исходный сюжет: цвета исчезают по краям, вы получаете сплошной цвет только там, где множество точек частично перекрывают друг друга. Я не думаю, что все цвета в исходном сюжете имеют альфа-компонент: фиолетовые точки достаточно редки, и, возможно, другие цвета также сплошные; но черный определенно (очень) прозрачный.

Ответ №1:

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

 cmap = plt.get_cmap('spring', N)
for i in range(N):
    x, y = my_cord[i].T
    cf = ax.scatter(x, y, color=cmap(i))
 

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

Ответ №2:

Поскольку ваша цветовая панель логарифмическая, имеет смысл использовать a LogNorm . Размер точек можно сделать меньше. Для очень маленьких точек контур следует удалить (например, настройка ec='none' ).

 import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

N = 100
my_cord = np.stack([np.random.randn(400, 2)   np.random.randn(1, 2) * 10 for j in range(N)])
fig, ax = plt.subplots()
cmap = plt.get_cmap('spring', N)
norm = mpl.colors.LogNorm(vmin=1, vmax=N   1)
for i in range(N):
    cf = ax.scatter(my_cord[i, :, 0], my_cord[i, :, 1], color=cmap(norm(i   1)), ec='none', marker=',', s=1)

sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
plt.colorbar(sm)

ax.set_xlabel('IC 1')
ax.set_ylabel('IC 2')
fig.tight_layout()
plt.show()
 

точечная диаграмма с логнормальными цветами

PS: Сюжет также может быть создан за один раз, используя индекс как c= и непосредственно передавая cmap :

 norm = mpl.colors.LogNorm(vmin=1, vmax=N   1)
cf = ax.scatter(my_cord[:, :, 0], my_cord[:, :, 1],
                c=np.repeat(np.arange(1, N   1), my_cord.shape[1]),
                cmap='spring', ec='none', marker=',', s=1)
plt.colorbar(cf)