我想要在一个subplot中创建一个包含树状图的子图和一个包含热力图的子图,同时保持正方形轴。我尝试使用以下代码:
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()
这产生了以下结果:
但问题在于轴不是正方形的,而且色条被认为是第二个子图的一部分。我希望它能够悬停在图外,并且使树状图框和热力图框都是正方形且彼此对齐(即大小相同)。
我尝试使用aspect='equal'
调用subplot
时来获得正方形轴,因为文档建议这样做,但这毁了图表,导致出现这种情况...
如果我尝试在每个子图后面使用plt.axis('equal')
而不是aspect='equal'
,它会奇怪地将热力图变成正方形,但不是它的边界框(如下所示),同时破坏了树状图并且还混乱了xtick标签的对齐.... - 造成这样的混乱:
如何解决这个问题?总结一下,我想绘制一个非常简单的东西:顶部子图中的正方形树状图,底部子图中的正方形热力图,并带有右侧的色条。不需要花哨的东西。
最后,更一般的问题是:是否有一个通用的规则/原理来强制matplotlib始终使轴成为正方形?我想不出任何一个情况不需要正方形轴,但它通常不是默认行为。如果可能的话,我想强制所有图都是正方形的。
a, b, c, d, e, f
不能对齐呢? - user248237