Câu hỏi không xác định ma trận rất tốt: "ma trận giá trị", "ma trận dữ liệu". Tôi giả sử rằng bạn có nghĩa là ma trận khoảng cách . Nói cách khác, phần tử D_ij trong ma trận không đối xứng N-by-N ma trận khoảng cách D biểu thị khoảng cách giữa hai vectơ đặc trưng, x_i và x_j. Đúng không?
Nếu vậy, sau đó thử này (sửa 13 tháng 6 năm 2010, để phản ánh hai dendrograms khác nhau):
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')
Dendrogram and distance matrix http://up.stevetjoa.com/dendrogram.png
Chúc may mắn! Hãy cho tôi biết nếu bạn cần thêm trợ giúp.
Chỉnh sửa: Đối với các màu khác nhau, điều chỉnh thuộc tính cmap
trong imshow
. Xem các ví dụ scipy/matplotlib docs. Trang đó cũng mô tả cách tạo bản đồ màu của riêng bạn. Để thuận tiện, tôi khuyên bạn nên sử dụng một bản đồ có sẵn từ trước. Trong ví dụ của tôi, tôi đã sử dụng YlGnBu
.
Edit: add_axes
(see documentation here) chấp nhận một danh sách hoặc tuple: (left, bottom, width, height)
. Ví dụ: (0.5,0,0.5,1)
thêm Axes
vào nửa bên phải của hình. (0,0.5,1,0.5)
thêm Axes
vào nửa trên của hình.
Hầu hết mọi người có thể sử dụng add_subplot
để thuận tiện cho nó. Tôi thích add_axes
để kiểm soát.
Để xóa đường viền, hãy sử dụng add_axes([left,bottom,width,height], frame_on=False)
. See example here.
Đây là chi tiết của một câu hỏi matplotlib, tôi đã gắn thẻ lại. – dwf
Có thể trùng lặp: http://stackoverflow.com/questions/2455761/reordering-matrix-elements-to-reflect-column-and-row-clustering-in-naiive-python –
Vui lòng cập nhật liên kết đến hình ảnh. –