¿Cómo puedo trazar un dendrograma a la derecha en la parte superior de una matriz de valores, reordenar adecuadamente para reflejar la agrupación, en Python? Un ejemplo es el de la siguiente figura:

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

Yo uso scipy.clúster.dendrograma para hacer mi dendrograma y realizar la agrupación jerárquica en una matriz de datos. ¿Cómo puedo entonces graficar los datos como una matriz donde las filas se han reorganizado para reflejar una agrupación inducida por el corte del dendrograma a un determinado umbral, y tienen el dendrograma se trazan junto a la matriz? Sé cómo trazar el dendrograma en scipy, pero no la forma de representar la intensidad de la matriz de datos con la escala de la derecha de la barra de al lado.

Cualquier ayuda sería muy apreciada.

InformationsquelleAutor | 2010-06-06

2 Comentarios

  1. 92

    La pregunta no define matriz muy bien: «matriz de valores», «matriz de datos». Supongo que te refieres a un matriz de distancias. En otras palabras, el elemento D_ij en el simétrica no negativo N-por-N matriz de distancias D denota la distancia entre dos vectores, x_i y x_j. Es eso correcto?

    Si es así, a continuación, intente esto (editado 13 de junio de 2010, para reflejar dos diferentes dendrograms):

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

    trazado de los resultados de la agrupación jerárquica encima de una matriz de datos en python

    ¡Buena suerte! Déjeme saber si usted necesita más ayuda.


    Edit: Para los diferentes colores, ajustar el cmap atributo en imshow. Ver el scipy/matplotlib docs para los ejemplos. En esa página también se describe cómo crear tu propio mapa de colores. Para mayor comodidad, recomiendo el uso de una preexistente mapa de colores. En mi ejemplo, he utilizado YlGnBu.


    Edición: add_axes (consulte la documentación aquí) acepta una lista o tupla: (left, bottom, width, height). Por ejemplo, (0.5,0,0.5,1) añade 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 el uso add_subplot para su conveniencia. Me gusta add_axes para su control.

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

    • Esta es una gran pregunta. Un par de preguntas más: ¿cómo puedo mostrar la agrupación de las muestras en la parte superior? Si la matriz es de los genes de las muestras, se ha mostrado que los genes de la izquierda, pero quiero mostrar las muestras de la agrupación en la parte superior. ¿Cómo puedo ajustar los ejes adecuadamente a hacer eso? También, ¿cómo puedo ajustar el mapa de color a amarillo, el azul y el control de la escala de la barra de la derecha? muchas gracias!
    • He subido una figura con un color diferente del mapa. Ver editar. ¿Podrías definir el «gen» y «ejemplo»? Cómo es la similitud calculada? Sin embargo, también he añadido una segunda dendrograma por encima de la matriz. Esperemos que se puede ajustar como mejor le parezca.
    • Gracias Steve, que respondió a mi pregunta sobre la parte superior dendrograma. Sólo otra forma más rápida aclaración: ¿cómo establecer los argumentos de add_axes? No estoy seguro de cómo se escogieron los valores numéricos. Por ejemplo, me gustaría eliminar las casillas de alrededor de la dendrograms y sólo mostrar el árbol. Si estos eran regulares subparcelas, yo podría «set_color(ninguno)» en cada columna vertebral en subtrama.ax.las espinas. Puedo hacer lo mismo aquí?
    • Creo que la forma de utilizar la vinculación de la función que está mal. Si miramos el código fuente de ligamiento(), si el primer parámetro (aquí se utilice D) es una matriz, que va a ser tratados como datos, no la distancia. A la entrada de la distancia, usted tiene que tomar el triángulo superior de D y convertirlo en un vector de dimensión, a continuación, pasar a la vinculación().
    • Esto es genial! ¿Cómo puedo modificar la etiqueta de los ejes de los dos dendrograms así (Básicamente necesito que las parcelas tienen 3 diferentes sistemas de coordenadas de modo que yo pueda leer directamente los valores en la dendragrams)? También, ¿qué puedo hacer si tengo valores atípicos que «exprimir» el menor de los árboles en el dendrograms?
    • Respecto a su segunda pregunta, tratar de una manera diferente method parámetro en el sch.linkage() función. Diferentes métodos de agrupamiento manejar los valores atípicos de manera diferente. Respecto a tu primera pregunta, no estoy seguro de la parte superior de mi cabeza.
    • la respuesta a esto es muy útil! pero, como @danioyuan mencionado, el linkage uso de función parece estar mal ahora. utilizando la matriz de distancias, convertirlo en vector-formulario matriz de distancias. es decir, D = squareform(D) antes de usar linkage. github.com/scipy/scipy/blob/v0.15.1/scipy/cluster/…
    • FYI: acabo de poner esto en github: github.com/WarrenWeckesser/heatmapcluster
    • gracias steve. ¿Estamos de acuerdo en que la trazada de la matriz no es más que una matriz de distancias? Una vez que las filas y las columnas se reordenan de manera diferente, se me hace difícil interpretar la nueva matriz…
    • He actualizado el código para pasar un condensada matriz de distancias para linkage. Yo también fija la orientación de la izquierda dendrograma; un error en dendrogram fue fijada hace algún tiempo, por lo que ahora se encarga de la orientation argumento de manera diferente.

  2. 8

    Si, además de la matriz y el dendrograma es necesario para mostrar las etiquetas de los elementos, el código siguiente puede utilizarse, que muestra todas las etiquetas de la rotación de la x etiquetas y cambiar el tamaño de la fuente para evitar la superposición en el eje x. Se requiere mover la colorbar tener espacio para los y las etiquetas:

    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 color diferente del mapa):

    trazado de los resultados de la agrupación jerárquica encima de una matriz de datos en python

Dejar respuesta

Please enter your comment!
Please enter your name here