2016-06-23 2 views
1

J'utilise l'exemple dendrogram de this post dans mon travail mais je voudrais aussi garder une trace de quelle ligne/colonne provient quelle donnée.Scipy dendrogram avec les noms

J'ai édité le code avec les enregistrements des noms des données comme names comme suit et je voudrais imprimer les noms en bas et à droite de la visualisation de la matrice de distance. J'ai essayé d'ajouter labels = names dans l'appel à dendrogram mais cela n'a pas aidé.

Est-ce que quelqu'un sait comment ajouter des étiquettes à cela?

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]) 

### new code 
names = [ ] 
for i in range(40): 
    names.append('str%i'%(i)) 
    print names[-1] 
### end new code 

# 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') 

Répondre

1

Le paquet python heatmapcluster (disponible on PyPI) que j'ai écrit accepte (en fait, exige) les étiquettes.

Voici une version simplifiée de votre script en utilisant heatmapcluster:

import numpy as np 
import matplotlib.pyplot as plt 
from heatmapcluster import heatmapcluster 


# Generate random features and distance matrix. 
x = np.random.rand(40) 
D = np.abs(np.subtract.outer(x, x)) 

names = ['str%i' % i for i in range(len(x))] 

h = heatmapcluster(D, names, names, 
        num_row_clusters=3, num_col_clusters=3, 
        label_fontsize=8, 
        xlabel_rotation=-75, 
        cmap=plt.cm.coolwarm, 
        show_colorbar=True, 
        top_dendrogram=True) 

plt.show() 

Et voici l'intrigue qu'il génère: plot

(Notez que, pour un tableau symétrique comme D, il n'y a vraiment pas point en regroupant les deux axes, ils généreront par symétrie le même dendrogramme.)