51

Pythonで、クラスタリングを反映するように適切に並べ替えられた、値のマトリックスの真上に樹状図をプロットするにはどうすればよいですか?例は次の図です。

https://publishing-cdn.elifesciences.org/07103/elife-07103-fig6-figsupp1-v2.jpg

scipy.cluster.dendrogramを使用して樹状図を作成し、データのマトリックスに対して階層的クラスタリングを実行します。次に、特定のしきい値で樹状図を切断することによって引き起こされるクラスタリングを反映するように行が並べ替えられたマトリックスとしてデータをプロットし、マトリックスの横に樹状図をプロットするにはどうすればよいですか?樹状図をscipyでプロットする方法は知っていますが、データの強度マトリックスをその横にある右側のスケールバーでプロットする方法はわかりません。

これに関する助けをいただければ幸いです。

4

2 に答える 2

99

質問はマトリックスをうまく定義していません:「値のマトリックス」、「データのマトリックス」。私はあなたが距離行列を意味すると仮定します。言い換えると、対称非負のN行N列の距離行列Dの要素D_ijは、2つの特徴ベクトルx_iとx_jの間の距離を示します。あれは正しいですか?

もしそうなら、これを試してみてください(2010年6月13日編集、2つの異なる樹状図を反映するため):

import scipy
import pylab
import scipy.cluster.hierarchy as sch
from scipy.spatial.distance import squareform


# Generate random features and distance matrix.
x = scipy.rand(40)
D = scipy.zeros([40,40])
for i in range(40):
    for j in range(40):
        D[i,j] = abs(x[i] - x[j])

condensedD = squareform(D)

# Compute and plot first dendrogram.
fig = pylab.figure(figsize=(8,8))
ax1 = fig.add_axes([0.09,0.1,0.2,0.6])
Y = sch.linkage(condensedD, method='centroid')
Z1 = sch.dendrogram(Y, orientation='left')
ax1.set_xticks([])
ax1.set_yticks([])

# Compute and plot second dendrogram.
ax2 = fig.add_axes([0.3,0.71,0.6,0.2])
Y = sch.linkage(condensedD, method='single')
Z2 = sch.dendrogram(Y)
ax2.set_xticks([])
ax2.set_yticks([])

# Plot distance matrix.
axmatrix = fig.add_axes([0.3,0.1,0.6,0.6])
idx1 = Z1['leaves']
idx2 = Z2['leaves']
D = D[idx1,:]
D = D[:,idx2]
im = axmatrix.matshow(D, aspect='auto', origin='lower', cmap=pylab.cm.YlGnBu)
axmatrix.set_xticks([])
axmatrix.set_yticks([])

# Plot colorbar.
axcolor = fig.add_axes([0.91,0.1,0.02,0.6])
pylab.colorbar(im, cax=axcolor)
fig.show()
fig.savefig('dendrogram.png')

プロット

幸運を!さらにサポートが必要な場合はお知らせください。


編集:さまざまな色については、のcmap属性を調整しますimshow例については、 scipy/matplotlibのドキュメントを参照してください。このページでは、独自のカラーマップを作成する方法についても説明しています。便宜上、既存のカラーマップを使用することをお勧めします。私の例では、を使用しYlGnBuました。


編集:(add_axesここのドキュメントを参照)リストまたはタプルを受け入れます:(left, bottom, width, height)。たとえば、図の右半分にを(0.5,0,0.5,1)追加します。図の上半分にを追加します。Axes(0,0.5,1,0.5)Axes

ほとんどの人はおそらくadd_subplotその便利さのために使用します。私add_axesはそのコントロールが好きです。

境界線を削除するには、を使用しますadd_axes([left,bottom,width,height], frame_on=False)こちらの例をご覧ください。

于 2010-06-10T05:40:19.457 に答える
9

マトリックスとデンドログラムに加えて、要素のラベルを表示する必要がある場合は、次のコードを使用できます。このコードでは、すべてのラベルが x ラベルを回転させ、フォント サイズを変更して x 軸での重なりを避けるように表示されます。y ラベル用のスペースを確保するには、カラーバーを移動する必要があります。

axmatrix.set_xticks(range(40))
axmatrix.set_xticklabels(idx1, minor=False)
axmatrix.xaxis.set_label_position('bottom')
axmatrix.xaxis.tick_bottom()

pylab.xticks(rotation=-90, fontsize=8)

axmatrix.set_yticks(range(40))
axmatrix.set_yticklabels(idx2, minor=False)
axmatrix.yaxis.set_label_position('right')
axmatrix.yaxis.tick_right()

axcolor = fig.add_axes([0.94,0.1,0.02,0.6])

得られた結果は次のとおりです (別のカラー マップを使用)。

得られた結果は次のとおりです。

于 2014-04-13T17:48:06.290 に答える