循环遍历簇并绘制scatter而不指定任何颜色时,将使用活动属性循环器(颜色循环)的默认颜色。 活动属性循环器在rcParams定义。 它是通过使用的风格设置的; 在你的情况下,使用'fivethirtyeight'
print(plt.rcParams["axes.prop_cycle"])
> cycler('color', ['#008fd5', '#fc4f30', '#e5ae38', '#6d904f', '#8b8b8b', '#810f7c'])
这个('#008fd5','#fc4f30')的前两种颜色是你在图中看到的颜色。
使用带有clusters作为颜色参数的scatter时,这些值将通过颜色图映射到颜色。 如果未指定rcParam映射,则将采用rcParam定义的默认rcParam映射。
print(plt.rcParams["image.cmap"])
> "viridis"
'fivethirtyeight'样式没有定义任何特殊'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()