Ответ 1
Вопрос не очень хорошо определяет матрицу: "матрица значений", "матрица данных". Я предполагаю, что вы имеете в виду матрицу расстояний. Другими словами, элемент D_ij в симметричной неотрицательной N-на-N матрице расстояния D обозначает расстояние между двумя объектными векторами x_i и x_j. Это правильно?
Если это так, попробуйте это (отредактировано 13 июня 2010 года, чтобы отразить две разные дендрограммы):
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')
Дендрограмма и матрица расстояний http://up.stevetjoa.com/dendrogram.png
Удачи! Дайте мне знать, если вам нужна дополнительная помощь.
Изменить: для разных цветов отрегулируйте атрибут cmap
в imshow
. Для примера см. scipy/matplotlib docs. На этой странице также описано, как создать свою собственную цветочную карту. Для удобства я рекомендую использовать существующую цветовую палитру. В моем примере я использовал 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)
. См. пример здесь.