scipy树状图中的倒置分支

Posted

技术标签:

【中文标题】scipy树状图中的倒置分支【英文标题】:Upside down branching in scipy dendrogram 【发布时间】:2019-08-12 23:45:26 【问题描述】:

我试图模仿这个问题中发现的情节: plotting results of hierarchical clustering ontop of a matrix of data in python

我已经多次使用那里找到的代码,没有任何问题。但是在将其应用于一些新数据时,我发现在树状图的链接中有一个倒置的模式。

正如您将在深蓝色链接的上部看到的那样,这些集群从分支点上方开始。也许这是某些情况下的典型行为,但树状图以低于子分支的多样性进行分支似乎违反直觉。这里比较的是跨一组特征的各种蛋白质丰度。减去特征之间的相关性是实际输入 scipy 链接函数的内容。整个情节的代码如下:

#Making correlation matrix with dendrograms
corr = 1 - df_log2.corr() 
corr_condensed = hc.distance.squareform(corr) # convert to condensed

# Compute and plot first dendrogram.
fig = pylab.figure(figsize=(30,30))
ax1 = fig.add_axes([-0.1,0.1,0.35,0.6])
Y = hc.linkage(corr_condensed, method='centroid')
Z1 = hc.dendrogram(Y, orientation='left')
ax1.set_xticks([])
ax1.set_yticks([])

# Compute and plot second dendrogram.
ax2 = fig.add_axes([0.3,0.75,0.6,0.35])
Y = hc.linkage(corr_condensed, method='centroid')
Z2 = hc.dendrogram(Y)
ax2.set_xticks([])
ax2.set_yticks([])

# Plot distance matrix.
axmatrix = fig.add_axes([0.3,0.1,0.6,0.6])
idx = list(Z1['leaves'])
featdict = 0: 'IndA 3K', 1: 'IndA 5.4K', 2: 'IndA 12.2K', 3: 'IndA 24K', 4: 'IndA 78.4K', 5: 'IndA 110K', 6: 'IndA 195.5K', 
            7: 'IndB 3K', 8: 'IndB 5.4K', 9: 'IndB 12.2K', 10: 'IndB 24K', 11: 'IndB 78.4K', 12: 'IndB 110K', 13 :'IndB 195.5K', 
            14: 'IndC 3K', 15: 'IndC 5.4K', 16: 'IndC 12.2K', 17: 'IndC 24K', 18: 'IndC 78.4K', 19: 'IndC 110K', 20: 'IndC 195.5K', 
            21: 'UnA 3K', 22: 'UnA 5.4K', 23: 'UnA 12.2K', 24: 'UnA 24K', 25: 'UnA 78.4K', 26: 'UnA 110K', 27: 'UnA 195.5K', 
            28: 'UnB 3K', 29: 'UnB 5.4K', 30: 'UnB 12.2K', 31: 'UnB 24K', 32: 'UnB 78.4K', 33: 'UnB 110K', 34: 'UnB 195.5K', 
            35: 'UnC 3K', 36: 'UnC 5.4K', 37: 'UnC 12.2K', 38: 'UnC 24K', 39: 'UnC 78.4K', 40: 'UnC 110K', 41: 'UnC 195.5K'
corr.index = list(range(0,42))
corr.columns = list(range(0,42))
#corr = corr[idx1][:]
#corr = corr[:][idx2]
carray = corr.values
corrind = carray[idx,:][:,idx]
corrflip = 1 - corrind
im = axmatrix.matshow(corrflip, aspect='auto', origin='lower', cmap=pylab.cm.YlGnBu)
idx = [featdict[x] for x in idx]
axmatrix.set_xticklabels(['']+idx, rotation = 90)
axmatrix.set_yticklabels(['']+idx)
axmatrix.xaxis.set_major_locator(ticker.MultipleLocator(1))
axmatrix.yaxis.set_major_locator(ticker.MultipleLocator(1))

# Plot colorbar.
axcolor = fig.add_axes([0.91,0.1,0.02,0.6])
pylab.colorbar(im, cax=axcolor)
fig.suptitle('Pearson Correlation \nMatrix with Centroid \nLinkage Dendrogram', x=0.13, y=0.9, fontsize=40)
fig.savefig('PearsonCorr_matrixwithdendro_normlog2.png', dpi=500, bbox_inches='tight')

【问题讨论】:

您能创建一个minimal, complete and verifiable example 以便我们运行以重现问题吗?如果没有实际的示例可以使用,可能很难弄清楚发生了什么。 我试图找出最好的方法。数据集本身是每个特征内的 7,000 个样本(蛋白质)。正如我所提到的,我还没有看到其他数据集存在这个问题。因此,不幸的是,它似乎是特定于这些数据的。 【参考方案1】:

在对另一个问题进行了一些偶然的搜索之后,我碰巧发现使用“质心”链接实际上会导致某些数据的树状图中出现这些倒置或反转。它们显然是不可避免的。 StackExchange 上有一个很好的答案来讨论这个问题:https://stats.stackexchange.com/questions/26769/cluster-analysis-in-r-produces-reversals-on-dendrogram

【讨论】:

以上是关于scipy树状图中的倒置分支的主要内容,如果未能解决你的问题,请参考以下文章

在 Scipy/Matplotlib 中注释树状图节点

带有名称的 Scipy 树状图

SciPy 树状图绘图

neuoj1472 yuki的氪金之旅(倒置树状数组

在 Scipy 错误中为大型数据集绘制树状图

2 树状图 + 来自 scipy 的压缩相关矩阵的热图