Estoy tratando de hacer una subtrama simple con un dendrograma en una subtrama y un mapa de calor en otra, manteniendo los ejes cuadrados. Intento lo siguiente:cómo hacer subtramas cuadradas en matplotlib con heatmaps?
from scipy.cluster.hierarchy import linkage
from scipy.cluster.hierarchy import dendrogram
from scipy.spatial.distance import pdist
fig = plt.figure(figsize=(7,7))
plt.subplot(2, 1, 1)
cm = matplotlib.cm.Blues
X = np.random.random([5,5])
pmat = pdist(X, "euclidean")
linkmat = linkage(pmat)
dendrogram(linkmat)
plt.subplot(2, 1, 2)
labels = ["a", "b", "c", "d", "e", "f"]
Y = np.random.random([6,6])
plt.xticks(arange(0.5, 7.5, 1))
plt.gca().set_xticklabels(labels)
plt.pcolor(Y)
plt.colorbar()
esto produce lo siguiente:
pero los problemas son que los ejes no son cuadrados, y la barra de colores se considera parte de la segunda trama secundaria. Me gustaría colgar fuera de la trama y hacer que la caja de dendrograma y la de calor estén alineadas y cuadradas (es decir, del mismo tamaño).
Intenté usar aspect='equal'
para obtener ejes cuadrados cuando llamando subplot
como la documentación sugiere, pero esto arruinó la trama, dando a este ...
si trato de usar plt.axis('equal')
después de cada subtrama en lugar de aspect='equal'
, cuadra extrañamente el mapa de calor, pero no su cuadro delimitador (ver a continuación), mientras destruye el dendograma por completo y también arruina la alineación de las etiquetas xtick .... - dando lugar a este lío:
¿Cómo puede ser fijo? para resumir, intento trazar algo muy simple: un dendrograma cuadrado en la subparcela superior y un mapa de calor cuadrado en la subparcela inferior, con la barra de color a la derecha. nada sofisticado.
finalmente, pregunta más general: ¿hay una regla general/principio a seguir para forzar matplotlib a siempre hacer ejes cuadrados? No puedo pensar en un solo caso en el que no quiera ejes cuadrados, pero generalmente no es el comportamiento predeterminado. Me gustaría obligar a todas las tramas a ser cuadradas si es posible.
Gracias por la respuesta, pero sus parcelas aún no están alineados como tramas secundarias regulares. Los cuadros delimitadores para la parte superior e inferior no están alineados. Me gustaría que se alineen verticalmente con el color que cuelga hacia la derecha, algo así como lo tienes pero no desalineado. Alguna idea sobre esto? – user248237dfsf
Edité la respuesta, por favor verifíquela. – HYRY
gracias por su respuesta: ¡es exactamente el resultado correcto, pero el código parece inmensamente complejo! ¿hay una manera mas facil? parece que tienes que ser uno de los desarrolladores de matplotlib para saber cómo escribir algo como esto, solo para obtener una barra de color para alinear ... – user248237dfsf