2016-06-23 17 views
1

Ich verwende das Beispiel Dendrogramm von this post in meiner Arbeit, möchte aber auch verfolgen, welche Zeile/Spalte aus welchem ​​Datenstück stammt.Scipy Dendrogramm mit Namen

Ich habe den Code mit Datensätzen der Namen der Daten wie names wie folgt bearbeitet und möchte die Namen am unteren Rand und rechts von der Entfernungsmatrix Visualisierung ausdrucken. Ich habe versucht, labels = names in den Anruf zu dendrogram hinzuzufügen, aber das hat nicht geholfen.

Kann jemand Etiketten hinzufügen?

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

Antwort

1

Das Python-Paket heatmapcluster (erhältlich on PyPI), die ich akzeptiert schrieb (in der Tat erfordert) Etiketten.

Hier ist eine vereinfachte Version des Skriptes ist heatmapcluster mit:

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

Und hier ist die Handlung es erzeugt: plot

(Beachten Sie, dass bei einer symmetrischen Anordnung wie D, gibt es wirklich keine Punkt in Clustering beide Achsen.Mit Symmetrie, werden sie das gleiche Dendrogramm erzeugen.)