La question ne définit pas matrice très bien : "matrice de valeurs", "matrice de données". Je suppose que vous voulez dire une matrice de distance . En d'autres termes, l'élément D_ij dans le modèle symétrique non négatif N-by-N matrice de distance D représente la distance entre deux vecteurs de caractéristiques, x_i et x_j. Est-ce correct ?
Si oui, essayez ceci (édité le 13 juin 2010, pour refléter deux dendrogrammes différents) :
import scipy
import pylab
import scipy.cluster.hierarchy as sch
# 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])
# 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(D, method='centroid')
Z1 = sch.dendrogram(Y, orientation='right')
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(D, 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')
Bonne chance ! Faites-moi savoir si vous avez besoin d'aide supplémentaire.
Edit : Pour des couleurs différentes, ajustez le cmap
l'attribut dans imshow
. Voir le docs scipy/matplotlib par exemple. Cette page décrit également comment créer votre propre carte de couleurs. Pour des raisons pratiques, je recommande d'utiliser une carte de couleurs préexistante. Dans mon exemple, j'ai utilisé YlGnBu
.
Edit : add_axes
( voir la documentation ici ) accepte une liste ou un tuple : (left, bottom, width, height)
. Par exemple, (0.5,0,0.5,1)
ajoute un Axes
sur la moitié droite de la figure. (0,0.5,1,0.5)
ajoute un Axes
sur la moitié supérieure de la figure.
La plupart des gens utilisent probablement add_subplot
pour sa commodité. J'aime add_axes
pour son contrôle.
Pour supprimer la bordure, utilisez add_axes([left,bottom,width,height], frame_on=False)
. Voir l'exemple ici.