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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Matplotlib

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

Q&A

解決済

2回答

2642閲覧

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

SAMUSAMUN

総合スコア32

Matplotlib

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

0グッド

0クリップ

投稿2017/09/13 06:42

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

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

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

###該当のソースコード

python

1#!/usr/bin/env python 2# -*- coding: utf8 -*- 3 4import pandas as pd 5import numpy as np 6from sklearn.cluster import KMeans 7import matplotlib.pyplot as plt 8 9#クラスタ数 10N_CLUSTERS = 5 11# データセットを読み込み 12cust_df = pd.read_csv("Wholesale_customers_data.csv") 13 14# 不要なカラムを削除 15del(cust_df['Channel']) 16del(cust_df['Region']) 17 18#print(cust_df) 19 20# Pandas のデータフレームから Numpy の行列 (Array) に変換 21cust_array = np.array([cust_df['Fresh'].tolist(), 22 cust_df['Milk'].tolist(), 23 cust_df['Grocery'].tolist(), 24 cust_df['Frozen'].tolist(), 25 cust_df['Milk'].tolist(), 26 cust_df['Detergents_Paper'].tolist(), 27 cust_df['Delicassen'].tolist() 28 ], np.int32) 29 30# 行列を転置 31#cust_array = cust_array.T 32features = cust_array.T 33 34# クラスタ分析を実行 (クラスタ数=4) 35#pred = KMeans(n_clusters=4).fit_predict(cust_array) 36cls = KMeans(n_clusters=N_CLUSTERS) 37pred = cls.fit_predict(features) 38#クラスタ後,ラベル表示 39print(pred) 40 41# Pandas のデータフレームにクラスタ番号を追加 42#cust_df['cluster_id']=pred 43 44 45# 可視化(散布図) 46for i in range(N_CLUSTERS): 47 labels = features[pred == i] 48 plt.scatter(labels[:, 0], labels[:, 1]) 49 50# クラスタのセントロイド (重心) を描く 51centers = cls.cluster_centers_ 52plt.scatter(centers[:, 0], centers[:, 1], s=100, 53 facecolors='none', edgecolors='black') 54 55plt.show() 56

###試したこと
参考記事
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系

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

簡単に実装するなら

Python

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

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

Python

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

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

更に説明すると

Python

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

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

Python

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

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

Python

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

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

あと完全に補足ですが

Python

1cust_array = np.array([cust_df['Fresh'].tolist(), 2 cust_df['Milk'].tolist(), 3 cust_df['Grocery'].tolist(), 4 cust_df['Frozen'].tolist(), 5 cust_df['Detergents_Paper'].tolist(), 6 cust_df['Delicassen'].tolist() 7 ], np.int32)

の部分は

Python

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

と書けますね

投稿2017/09/14 15:17

編集2017/09/15 03:34
magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SAMUSAMUN

2017/09/15 09:49

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

0

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

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

matplot(散布図)

投稿2017/09/13 07:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SAMUSAMUN

2017/09/14 14:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問