plt.scatter():由于'c'参数而导致ValueError

时间:2019-12-02 11:16:09

标签: python matplotlib colors scatter-plot

我正在研究群集的散点图。
使用sklearn.cluster.KMeans,我得到的列表的长度与2D矩阵X的长度相同...

运行

k = 5
df = pd.read_csv('data_latlong.csv')
lat = df['Lat'].values
long = df['Long'].values

X = np.matrix(list(zip(lat, long)))
kmeans = KMeans(n_clusters=k).fit(X)

plt.figure(figsize=(10, 10))
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.title("n = 5")
plt.show()

给我以下ValueError:
ValueError:'c'参数包含3909个元素,不能与大小为3909的'x',大小为3909的'y'一起使用。

有人建议如何处理吗?
谢谢!

解决方案-以正确的方式准备X:
代替
X = np.matrix(list(zip(lat, long)))
我用过
X = np.array([lat, long]).T

.T用于移调(而不是使用zip())-然后我得到了X[:, 0]X[:, 1]正确的形状!

1 个答案:

答案 0 :(得分:0)

TL; DR:尝试c=kmeans.labels_.reshape(kmeans.labels_.shape[0])。这会将标签从(3909,1)数组转换为(3909,)向量。

使用sklearn“ iris”数据集,您所做的工作对我有用:

from sklearn import datasets
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt

irises = datasets.load_iris()
X = irises['data']
clust = KMeans(n_clusters=3).fit(X)

plt.figure(figsize=(10, 10))
plt.scatter(X[:, 0], X[:, 1], c=clust.labels_)

print(X.shape)             # (150, 4)
print(clust.labels_.shape) # (150,)

enter image description here

请注意,我的clust.labels_是一个(150,)向量。相反,如果我将其重塑为(150,1)并尝试传递该值,则会收到与您相同的错误:

c_bad = clust.labels_.reshape((150,1))
plt.scatter(X[:, 0], X[:, 1], c=c_bad) # fails

因此,我认为我们有不同版本的sklearn,其中我的标签放置在向量中,而你的标签放置在数组中。解决方案是采用相反的方法,并尝试将标签的形状从数组重塑为向量:

plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_.reshape(3909))

另请参见