#python #hierarchical-clustering #dendrogram
Вопрос:
Я пытаюсь выполнить некоторые HAC, и я хотел бы отобразить дендрограмму с предопределенными цветами, которые я также использую для другого графика, чтобы быть последовательным. Поэтому я использую «plt.get_cmap» и «set_link_color_palette», но в итоге получаю следующее сообщение:
Трассировка (последний последний вызов): Файл «test_HAC.py», строка 47, в файле set_link_color_palette([цвета])
«/Users/blabla/.local/share/virtualenvs/blabla/lib/python3.8/site-packages/scipy/cluster/hierarchy.py», строка 3009, в set_link_color_palette вызывает ошибку типа(«все элементы списка палитр должны быть цветными строками») Ошибка ввода: все элементы списка палитр должны быть цветными строками
Пожалуйста, есть какие-нибудь идеи о том, как преобразовать цвета, подобные массиву, в цветные строки?? Обратите внимание, что я намеренно установил значение distance_threshold на 15, чтобы избежать слишком большого количества кластеров.
Вот код:
import numpy as np
from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram, set_link_color_palette
from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClustering
def plot_dendrogram(model, **kwargs):
# Create linkage matrix and then plot the dendrogram
# create the counts of samples under each node
counts = np.zeros(model.children_.shape[0])
n_samples = len(model.labels_)
for i, merge in enumerate(model.children_):
current_count = 0
for child_idx in merge:
if child_idx < n_samples:
current_count = 1 # leaf node
else:
current_count = counts[child_idx - n_samples]
counts[i] = current_count
linkage_matrix = np.column_stack([model.children_, model.distances_, counts]).astype(float)
# Plot the corresponding dendrogram
dendrogram(linkage_matrix, **kwargs)
iris = load_iris()
X = iris.data
clust = AgglomerativeClustering(n_clusters=None, distance_threshold=15, compute_distances=True)
model = clust.fit(X)
labels = clust.labels_
list_labels = np.unique(labels)
print(list_labels)
cmap_labels = plt.get_cmap('viridis', np.max(list_labels) 1)
list_colors = cmap_labels.colors
print(list_colors)
colors = []
for i, (name, color) in enumerate(zip(list_labels, list_colors), 1):
print(color)
colors.append(color)
print(colors)
set_link_color_palette([colors])
plt.title("Hierarchical Clustering Dendrogram")
# plot the top three levels of the dendrogram
plot_dendrogram(model, p=3, color_threshold=15, above_threshold_color='k', leaf_rotation=90)
plt.xlabel("Number of points in node (or index of point if no parenthesis).")
plt.show()
Спасибо. М.