графическое изображение результатов иерархической кластеризации ontop матрицы данных в Python

Как я могу вывести древовидную схему на печать прямо сверх матрицы значений, переупорядоченных соответственно для отражения кластеризации, в Python? Примером является следующее число:

https://publishing-cdn.elifesciences.org/07103/elife-07103-fig6-figsupp1-v2.jpg

Я использую scipy.cluster.dendrogram, чтобы сделать мою древовидную схему и выполнить иерархическую кластеризацию на матрице данных. Как я могу затем отобразить данные на графике как матрицу, где строки были переупорядочены для отражения кластеризации, вызванной вырезанием древовидной схемы в конкретном пороге, и древовидная схема вывелась на печать вместе с матрицей? Я знаю, как вывести древовидную схему на печать в scipy, но не, как вывести матрицу интенсивности на печать данных с правильной шкалой рядом с ним.

Любая справка на этом значительно ценилась бы.

48
задан Martin Broadhurst 3 January 2017 в 16:38
поделиться

1 ответ

Вопрос не очень хорошо определяет матрицу : «матрица значений», «матрица данные". Я предполагаю, что вы имеете в виду матрицу расстояний . Другими словами, элемент D_ij в симметричной неотрицательной N-by-N матрице расстояний D обозначает расстояние между двумя векторами признаков, x_i и x_j. Это правильно?

Если да, то попробуйте следующее (отредактировано 13 июня 2010 г., чтобы отразить две разные дендрограммы):

import scipy
import pylab
import scipy.cluster.hierarchy as sch
from scipy.spatial.distance import squareform


# 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])

condensedD = squareform(D)

# 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(condensedD, method='centroid')
Z1 = sch.dendrogram(Y, orientation='left')
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(condensedD, 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')

Plot

Удачи! Дай мне знать, если тебе еще понадобится помощь.


Изменить: для разных цветов настройте атрибут cmap в imshow . См. Примеры в документации scipy / matplotlib . На этой странице также описывается, как создать свою собственную цветовую карту. Для удобства я рекомендую использовать уже существующую цветовую карту. В моем примере я использовал YlGnBu .


Изменить: add_axes ( см. Документацию здесь ) принимает список или кортеж: (слева, снизу, ширина, высота) . Например, (0,5,0,0.5,1) добавляет оси в правую половину рисунка. (0,0.5,1,0.5) добавляет Axes в верхнюю половину рисунка.

Большинство людей, вероятно, используют add_subplot для удобства. Мне нравится add_axes за его контроль.

Чтобы удалить границу, используйте add_axes ([left, bottom, width, height], frame_on = False) . См. Пример здесь.

93
ответ дан 26 November 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: