2013-11-01 24 views
9

私はscikit-learnでKMeansアルゴリズムを使って生成しているプロットを持っています。クラスターは異なる色に対応しています。ここにプロットがあります。 enter image description here凡例をmatplotlibのスキャッタポイントの色に対応させます

プロットのクラスタ番号に対応する凡例が必要です。理想的には、凡例にはクラスタの色が表示され、ラベルにはクラスタ番号が表示されます。ありがとう。

EDIT:私は伝説の色に対応させることができた人々は、この

from sklearn.cluster import KMeans 
km = KMeans(n_clusters=20, init='random') 
km.fit(df) #df is the dataframe which contains points as coordinates 
labels = km.labels_ 
plt.clf() 
fig = plt.figure() 
ax = fig.add_subplot(111, axisbg='w', frame_on=True) 
fig.set_size_inches(18.5, 10.5) 

# Plot the clusters on the map 
# m is a basemap object 
m.scatter(
     [geom.x for geom in map_points], 
     [geom.y for geom in map_points], 
     20, marker='o', lw=.25, 
     c = labels.astype(float), 
     alpha =0.9, antialiased=True, 
     zorder=3) 
m.fillcontinents(color='#555555') 
plt.show() 
+0

をあなたは別の 'm.scatter()'コマンドを使用して、または代替メイクなど、各クラスタをプロットすることができここで

コードですすべてのクラスを持つ個別のカラーバー。 Sklearnギャラリーには、これを行う方法を示す例があります。人々はあなたの例を実行することができないので、それはあなたと協力することは難しいです... –

+0

Thanks @ RutgerKassies .. Sklearnギャラリー – Nitin

+1

@ニチンをチェックアウトします。もし解決策を考えるなら、ここに戻って投稿してください – cd98

答えて

11

をdownvotingているので、私はいくつかのコードを置くべきだと思います。キーは、Rutger Kassiesが述べたように、データ内の各カテゴリに複数の散布図を使用していました。

import numpy as np 
import matplotlib.pyplot as plt 

# Setting various plot properties 
plt.clf() 
fig = plt.figure() 
ax = fig.add_subplot(111, axisbg='w', frame_on=True) 
fig.set_size_inches(18.5, 10.5) 

# Creating a discrete colorbar 
colors = plt.cm.rainbow(np.linspace(0, 1, 20)) 

current_plot_range = 0 
previous_plot_range = 0 

for i,c in enumerate(colors): 
    previous_plot_range += current_plot_range 
    current_plot_range = labels[labels==i].size 
    m.scatter(
     [geom.x for geom in map_points[  
      previous_plot_range:previous_plot_range+current_plot_range]], 
     [geom.y for geom in map_points[ 
      previous_plot_range:previous_plot_range+current_plot_range]], 
     20, lw=.25, marker='o',color = c, label=i, alpha =0.9, antialiased=True, 
     zorder=3) 

plt.legend() 
m.fillcontinents(color='#555555') 

結果はこのようなものになります: enter image description here

+0

この返答いただきありがとうございます! zipではなくenumerateを使用することを検討できます。 – SeF

関連する問題