質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Matplotlib

    340questions

    MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

クラスタ毎の色変更ができません

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,446

SAMUSAMUN

score 20

前提・実現したいこと

クラスタリングの勉強をしています.
scikit-learnでクラスタリングしようと思っています.
下記の2つの記事を参考にさせていただいています.
こちらの記事では,棒グラフですが,散布図に変更しようとしています.
上手く図は出たのですが,色が一色だけしか表示できず,
クラスタ毎に色を変更したいと思います.
よろしくお願い致します.

発生している問題・エラーメッセージ

散布図は表示されるのですが,青一色だけでクラスタ毎に色を変えたいと思います.

該当のソースコード

#!/usr/bin/env python
# -*- coding: utf8 -*-

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

#クラスタ数
N_CLUSTERS = 5
# データセットを読み込み
cust_df = pd.read_csv("Wholesale_customers_data.csv")

# 不要なカラムを削除
del(cust_df['Channel'])
del(cust_df['Region'])

#print(cust_df)

# Pandas のデータフレームから Numpy の行列 (Array) に変換
cust_array = np.array([cust_df['Fresh'].tolist(),
                       cust_df['Milk'].tolist(),
                       cust_df['Grocery'].tolist(),
                       cust_df['Frozen'].tolist(),
                       cust_df['Milk'].tolist(),
                       cust_df['Detergents_Paper'].tolist(),
                       cust_df['Delicassen'].tolist()
                       ], np.int32)

# 行列を転置
#cust_array = cust_array.T
features = cust_array.T

# クラスタ分析を実行 (クラスタ数=4)
#pred = KMeans(n_clusters=4).fit_predict(cust_array)
cls = KMeans(n_clusters=N_CLUSTERS)
pred = cls.fit_predict(features)
#クラスタ後,ラベル表示
print(pred)

# Pandas のデータフレームにクラスタ番号を追加
#cust_df['cluster_id']=pred


# 可視化(散布図)
for i in range(N_CLUSTERS):
    labels = features[pred == i]
    plt.scatter(labels[:, 0], labels[:, 1])

# クラスタのセントロイド (重心) を描く
centers = cls.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], s=100,
                facecolors='none', edgecolors='black')

plt.show()

試したこと

参考記事
http://blog.amedama.jp/entry/2017/03/19/160121
http://pythondatascience.plavox.info/scikit-learn/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E5%88%86%E6%9E%90-k-means

補足情報(言語/FW/ツール等のバージョンなど)

OS X
python2系 

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

簡単に実装するなら

colors = ['red','blue','yellow','pink','green']


のように色のリストを作成して

# 可視化(散布図)
for i in range(N_CLUSTERS):
    labels = features[pred == i]
    plt.scatter(labels[:, 0], labels[:, 1], c=colors[i])


のように散布図の描写毎に違う色を指定するとよいと思います

更に説明すると

from matplotlib.colors import ListedColormap
colors = ['red','blue','yellow','pink','green']
cmap = ListedColormap(colors)


のように独自のカラーマップ(数に対応する色のマップ)を作成しておくことで、散布図の描写を

# 可視化(散布図)
plt.scatter(features[:, 0], features[:, 1], c=pred, cmap=cmap)


のようにループを使わずに1行で c にクラスタ番号を指定するだけで書けるようになります。
これは重心の描写でも

# クラスタのセントロイド (重心) を描く
centers = cls.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], s=80, marker='p', edgecolor='k', c=range(N_CLUSTERS), cmap=cmap)


のように使うことができるかと思います。

あと完全に補足ですが

cust_array = np.array([cust_df['Fresh'].tolist(),
                       cust_df['Milk'].tolist(),
                       cust_df['Grocery'].tolist(),
                       cust_df['Frozen'].tolist(),
                       cust_df['Detergents_Paper'].tolist(),
                       cust_df['Delicassen'].tolist()
                       ], np.int32)


の部分は

# DataFrameからNumpy配列を作成
cust_array  = cust_df.as_matrix().T


と書けますね

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/15 18:49

    とてもわかりやすく教えていただきありがとうございます.
    簡単に変更することができました.

    キャンセル

0

plt.scatter(labels[:, 0], labels[:, 1],c=red)

scatter内にcの属性を入れてみても不可能ですか?

matplot(散布図)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/14 23:36

    ご指摘ありがとうございます.
    色は変更できたのですが,クラスタ毎に色を変えたく思っています.
    図で表した時に,色別になっているとわかりやすいからです
    もっと自分でも調べてみようと思います

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Matplotlib

    340questions

    MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。