在python中绘制数据matrix顶部的层次聚类结果
我怎样才能在一个matrix的值之上绘制一个树形图,在Python中恰当地重新sorting以反映聚类? 下图是一个例子:
https://publishing-cdn.elifesciences.org/07103/elife-07103-fig6-figsupp1-v2.jpg
我使用scipy.cluster.dendrogram来制作我的树形图并对数据matrix执行分层聚类。 那么我怎样才能把数据绘制成一个matrix,在这个matrix中,行被重新sorting,以反映在特定阈值下切割树形图引起的聚类,并将树形图与matrix一起绘制? 我知道如何在scipy中绘制树形图,但不知道如何用右边的比例尺来绘制数据的强度matrix。
任何帮助,将不胜感激。
这个问题没有很好地定义matrix :“matrix的价值”,“数据的matrix”。 我假定你的意思是一个距离matrix 。 换句话说,对称非负N×N 距离matrix D中的元素D_ij表示两个特征向量x_i和x_j之间的距离。 那是对的吗?
如果是这样,那么试试(编辑2010年6月13日,以反映两个不同的树状图):
import scipy import pylab import scipy.cluster.hierarchy as sch # 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]) # 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(D, method='centroid') Z1 = sch.dendrogram(Y, orientation='right') 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(D, 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')
树状图和距离matrixhttp://up.stevetjoa.com/dendrogram.png
祝你好运! 让我知道如果你需要更多的帮助。
编辑:对于不同的颜色,调整imshow
的cmap
属性。 有关示例,请参阅scipy / matplotlib文档 。 该页面还介绍了如何创build自己的色彩映射。 为了方便,我build议使用预先存在的色彩地图。 在我的例子中,我使用了YlGnBu
。
编辑: add_axes
( 见文档在这里 )接受一个列表或元组:( (left, bottom, width, height)
。 例如, (0.5,0,0.5,1)
在图的右半部分添加一个Axes
。 (0,0.5,1,0.5)
在图的上半部分添加一个Axes
。
为了方便,大多数人可能使用add_subplot
。 我喜欢add_axes
的控制。
要删除边框,请使用add_axes([left,bottom,width,height], frame_on=False)
。 看这里的例子。
如果除matrix和树形图外还需要显示元素的标签,则可以使用以下代码,该代码显示旋转x标签的所有标签并更改字体大小以避免在x轴上重叠。 它需要移动颜色条为y标签留出空间:
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])
得到的结果是这样的(用不同的颜色图):