Когда вы зацикливаете кластеры и наносите на график scatter
без указания какого-либо цвета, будут использоваться цвета по умолчанию активного свойства cycler (цветовой цикл).Активное свойство cycler определено в rcParams
.Он устанавливается через используемый стиль;в вашем случае, используя 'fivethirtyeight'
print(plt.rcParams["axes.prop_cycle"])
> cycler('color', ['#008fd5', '#fc4f30', '#e5ae38', '#6d904f', '#8b8b8b', '#810f7c'])
Первые два цвета этого ('# 008fd5', '# fc4f30') - это тот, который вы видите на графике.
Когда вы используете scatter
с clusters
в качестве аргумента цвета, эти значения будут сопоставлены с цветом с помощью карты цветов.Если цветовая карта не указана, будет использоваться цветовая карта по умолчанию, определенная в rcParam
.
print(plt.rcParams["image.cmap"])
> "viridis"
Стиль 'fivethirtyeight'
не определяет никакой специальной карты цветов, поэтому значение по умолчанию не изменится.(Тот факт, что на вашей картинке вы видите цветную карту, отличную от viridis, объясняется тем, что был еще какой-то еще активный код, который не показан в вопросе.)
На этом этапе мне нужно начать интерпретацию.;Я думаю, что ваш вопрос на самом деле заключается в том, как заставить единый разброс использовать цветовую карту, которая имеет те же цвета, что и цветовой цикл.Ни одна из предопределенных цветовых карт не содержит цветов тридцатитысячного цикла.Следовательно, вы должны определить эту цветовую карту вручную, взяв цвета из цикла ,
import matplotlib.colors as mcolors
cmap = mcolors.ListedColormap(plt.rcParams['axes.prop_cycle'].by_key()['color'])
Теперь вам нужен способ индексировать цветовую карту, потому что у вас есть отдельные кластеры.
n = len(clusters.unique())
norm = mcolors.BoundaryNorm(np.arange(n+1)-0.5, n)
Конечно, для этого необходимо, чтобы количество цветов в цветовой карте было больше или равно количеству классов, как здесь.
Собираем все вместе (я добавил другую категорию,чтобы сделать его более наглядным)
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.colors as mcolors
plt.style.use('fivethirtyeight') #relevant here!!
X=pd.Series([1, 2, 3, 4, 5, 11, 12, 13, 14, 15])
Y=pd.Series([1,1,1,1,1,2,2,2,2,2])
clusters=pd.Series([0,0,0,0,0,1,1,1,1,2])
cmap = mcolors.ListedColormap(plt.rcParams['axes.prop_cycle'].by_key()['color'])
n = len(clusters.unique())
norm = mcolors.BoundaryNorm(np.arange(n+1)-0.5, n)
plt.figure(figsize = (6, 4))
sc = plt.scatter(X,Y, c=clusters, cmap=cmap, norm=norm)
plt.colorbar(sc, ticks=clusters.unique())
plt.title("example4")
plt.show()
![enter image description here](https://i.stack.imgur.com/QlhrF.png)