trazado de resultados de clustering jerárquico en la parte superior de una matriz de datos en python


¿Cómo puedo trazar un dendrograma justo encima de una matriz de valores, reordenado apropiadamente para reflejar el agrupamiento, en Python? Un ejemplo es la siguiente figura:

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

Uso scipy.Cluster.dendrograma para hacer mi dendrograma y realizar agrupamiento jerárquico en una matriz de datos. ¿Cómo puedo entonces trazar los datos como una matriz donde las filas se han reordenado para reflejar un agrupamiento inducido por el corte del dendrograma en un umbral particular, y tiene el dendrograma trazado junto a la matriz? Sé cómo trazar el dendrograma en scipy, pero no cómo trazar la matriz de intensidad de datos con la barra de escala correcta al lado.

Cualquier ayuda en esto sería muy apreciada.

Author: Martin Broadhurst, 2010-06-06

2 answers

La pregunta no define matriz muy bien: "matriz de valores", "matriz de datos". Asumo que quieres decir una matriz de distancia . En otras palabras, el elemento D_ij en la matriz de distancia N-by-N simétrica no negativa D denota la distancia entre dos vectores de entidades, x_i y x_j.

Si es así, entonces prueba esto (editado el 13 de junio de 2010, para reflejar dos dendrogramas diferentes):

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

Parcela

¡Buena suerte! Dejar yo sé si necesitas más ayuda.


Editar: Para diferentes colores, ajuste el atributo cmap en imshow. Vea los documentos scipy/matplotlib para ejemplos. Esa página también describe cómo crear tu propio mapa de colores. Para mayor comodidad, recomiendo usar un mapa de colores preexistente. En mi ejemplo, usé YlGnBu.


Editar: add_axes (ver documentación aquí ) acepta una lista o tupla: (left, bottom, width, height). Por ejemplo, (0.5,0,0.5,1) agrega un Axes en la mitad derecha de la figura. (0,0.5,1,0.5) añade un Axes en la mitad superior de la figura.

La mayoría de la gente probablemente usa add_subplot para su conveniencia. Me gusta add_axes por su control.

Para eliminar el borde, use add_axes([left,bottom,width,height], frame_on=False). Ver ejemplo aquí.

 87
Author: Steve Tjoa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-26 13:50:48

Si además de la matriz y el dendrograma se requiere mostrar las etiquetas de los elementos, se puede usar el siguiente código, que muestra todas las etiquetas girando las etiquetas x y cambiando el tamaño de fuente para evitar la superposición en el eje x. Requiere mover la barra de color para tener espacio para las etiquetas 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])

El resultado obtenido es este (con un mapa de color diferente):

El resultado obtenido es este:

 8
Author: Picarus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-13 17:48:06