#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)