como fazer subtramas quadrados em matplotlib com heatmaps?

Estou tentando fazer uma subtrama simples com um dendrograma em uma subtrama e um mapa de calor em outra, mantendo os eixos quadrados. Eu tento o seguinte:

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

Isso produz o seguinte:

mas os problemas são que os eixos não são quadrados e a barra de cores é considerada parte da segunda subtrama. Eu gostaria que fosse pendurado fora da trama e fizesse com que a caixa do dendrograma e a caixa do mapa de calor fossem quadradas e alinhadas entre si (ou seja, com o mesmo tamanho).

Eu tentei usaraspect='equal' para obter eixos quadrados ao chamarsubplot como a documentação sugere, mas isso arruinou o enredo, dando isso ...

se eu tento usarplt.axis('equal') depois de cada subtrama em vez deaspect='equal', estranhamente esquadra o mapa de calor, mas não sua caixa delimitadora (veja abaixo), enquanto destrói o dendrograma completamente e também bagunça o alinhamento dos rótulos xtick .... - dando origem a essa confusão:

Como isso pode ser consertado? Para resumir, estou tentando traçar algo muito simples: um dendrograma quadrado na subtrama superior e um mapa de calor quadrado na subtrama inferior, com a barra de cores à direita. nada chique.

finalmente, pergunta mais geral: existe uma regra / princípio geral a seguir para forçar o matplotlib asempre fazer eixos quadrados? Não consigo pensar em um único caso em que eu não queira eixos quadrados, mas geralmente não é o comportamento padrão. Eu gostaria de forçar todos os gráficos a serem quadrados, se possível.

questionAnswers(3)

yourAnswerToTheQuestion