Как получить доступ к индексу оси X на сингипе? - PullRequest
0 голосов
/ 18 марта 2019

У меня есть данные, для которых я создаю модель связи, например:

model = sc.linkage(data, 'ward')

Где модель выглядит следующим образом:

Z = np.array([
   [  2.        ,   9.        ,  20.12172148,   2.        ],
   [  0.        ,   1.        ,  26.16772232,   2.        ],
   [ 11.        ,  12.        ,  29.40258214,   2.        ],
   [ 14.        ,  16.        ,  30.89332011,   3.        ],
   [  3.        ,   7.        ,  33.70695832,   2.        ],
   [  5.        ,  13.        ,  34.22180543,   2.        ],
   [  4.        ,  15.        ,  35.52080322,   3.        ],
   [ 17.        ,  21.        ,  45.3919152 ,   5.        ],
   [  6.        ,  20.        ,  45.56339627,   3.        ],
   [  8.        ,  23.        ,  66.42828305,   4.        ],
   [ 10.        ,  22.        ,  87.52531145,   6.        ],
   [ 18.        ,  24.        ,  93.78070161,   7.        ],
   [ 19.        ,  26.        , 124.09967826,   9.        ],
   [ 25.        ,  27.        , 160.11685636,  15.        ]])
   Z == model # returns true

Затем я могу построить эту модель связи, используя matplotlib:

# calculate full dendrogram
plt.figure(figsize=(25, 10))
plt.title('Hierarchical Clustering Dendrogram for signature data')
plt.xlabel('sample index')
plt.ylabel('distance')
sc.dendrogram(
    model,
    leaf_rotation=90.,  # rotates the x axis labels
    leaf_font_size=8.,  # font size for the x axis labels
)
plt.show()

enter image description here

Теперь, это строит дендограмму и устанавливает символы в индекс. Я хотел бы заменить это фактическими метками, которые

labels = ['wood', 'stone', 'flora', 'liquid', 'food', 'metal', 'ceramic', 
          'sky', 'glass', 'paper', 'animal', 'skin', 'fabrics', 'gem', 'ground']

как показано, первый тик на оси x гласит 10. Какие будут метки [10]. Однако я не могу узнать, как получить доступ к этому индексу.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Нет необходимости обращаться к индексу.scipy.cluster.hierarchy.dendrogram предоставляет аргумент labels, который вы должны использовать для указания своих меток.

scipy.cluster.hierarchy.dendrogram(Z, labels=labels, ....)

Полный код:

import numpy as np
import scipy.cluster.hierarchy as sc
import matplotlib.pyplot as plt

Z = np.array([
   [  2.        ,   9.        ,  20.12172148,   2.        ],
   [  0.        ,   1.        ,  26.16772232,   2.        ],
   [ 11.        ,  12.        ,  29.40258214,   2.        ],
   [ 14.        ,  16.        ,  30.89332011,   3.        ],
   [  3.        ,   7.        ,  33.70695832,   2.        ],
   [  5.        ,  13.        ,  34.22180543,   2.        ],
   [  4.        ,  15.        ,  35.52080322,   3.        ],
   [ 17.        ,  21.        ,  45.3919152 ,   5.        ],
   [  6.        ,  20.        ,  45.56339627,   3.        ],
   [  8.        ,  23.        ,  66.42828305,   4.        ],
   [ 10.        ,  22.        ,  87.52531145,   6.        ],
   [ 18.        ,  24.        ,  93.78070161,   7.        ],
   [ 19.        ,  26.        , 124.09967826,   9.        ],
   [ 25.        ,  27.        , 160.11685636,  15.        ]])

labels = ['wood', 'stone', 'flora', 'liquid', 'food', 'metal', 'ceramic', 
          'sky', 'glass', 'paper', 'animal', 'skin', 'fabrics', 'gem', 'ground']

# calculate full dendrogram
plt.figure()
plt.title('Hierarchical Clustering Dendrogram for signature data')
plt.xlabel('sample index')
plt.ylabel('distance')
sc.dendrogram(
    Z,
    labels=labels,
    leaf_rotation=90.,  # rotates the x axis labels
    leaf_font_size=8.,  # font size for the x axis labels
)
plt.tight_layout()
plt.show()

enter image description here

0 голосов
/ 18 марта 2019

У меня нет модуля дендограммы, но следующее должно работать для вас.Идея такова:

  • Создать экземпляр оси ax и передать его в dendogram plot в качестве аргумента оси
  • Получить существующие метки x и пометить их как целые числа.Используйте эти целые числа в качестве индексов для доступа к значениям из labels.Это просто для того, чтобы метки располагались в том порядке, в каком вы хотите, чтобы они отображались на оси x
  • . Установите эти новые метки, используя set_xticklabels

соответствующий кусок кода вы можете использовать

fig, ax = plt.subplots(figsize=(25, 10))

sc.dendrogram(
    model,
    leaf_rotation=90.,  
    leaf_font_size=8.,  ax=ax)

fig.canvas.draw()

new_labels = [labels[int(i.get_text())] for i in ax.get_xticklabels()]
ax.set_xticklabels(new_labels)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...