分類用の色付けを持ったヒートマップを描く
何らかの方法でクラスタリングして、その分類を示しつつ、もとのデータの状態をヒートマップで確認したいというような要望が良くあるような気がします。例えば、AffinityPropagation法を使ってデータをクラスタリングした場合はこんな感じです。

from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs

# dataはいつものように、pandas.DataFrame(サンプルは列方向)
# 行方向にサンプルが並んでいるときはTいりません。
af = AffinityPropagation(preference=-2000).fit(data.T)
# サンプルをクラスターグループごとに並べます。
_idx = []
for i,c in enumerate(af.labels_):
_idx.append((c,data.columns[i]))
_idx.sort()
sorted_data = data[[v[1] for v in _idx ]]
# サイズはお好みで。
fig = pylab.figure(figsize=(16,9))
ax1 = fig.add_axes([0.07,0.2,0.85,.6])
im = ax1.matshow(sorted_data.ix[idx],vmin=0.0,vmax=1.0,aspect='auto',cmap = plt.get_cmap('Blues'))
ax1.set_axis_off()
axcolor = fig.add_axes([0.94,0.4,0.02,0.2])
pylab.colorbar(im, cax=axcolor)
# クラスター番号の並び配列を用意します。
import copy
c_data = copy.deepcopy(af.labels_)
c_data.sort()
cmap = plt.cm.jet
cmaplist = [cmap(i) for i in range(cmap.N)]
random.shuffle(cmaplist)
cmap = cmap.from_list('My cmap', cmaplist)
ax2 = fig.add_axes([0.07,0.17,0.85,0.02])
ax2.matshow([c_data], cmap=cmap, interpolation='nearest',aspect='auto')
ax2.set_axis_off()
fig.show()
fig.savefig('my_img.png')

出来上がりはこんな感じ。ちなみに、クラスターの色分けをrandom.shuffleしているのは、そのままだと隣り合った色がどうしても似てしまって分かりにくいから。しかし、これだと結果がその都度変わるなーと思ったり。
cls15.png
スポンサーサイト
【2014/08/18 19:50】 | Python | トラックバック(0) | コメント(0) | page top↑
<<Pandas.DataFrameでデータの標準化 | ホーム | Pandas.read_csvのちょっとした話>>
コメント
コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバックURL
→http://tanopy.blog79.fc2.com/tb.php/112-e452ea4d
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |