Я хочу покрасить свои кластеры с цветовой картой, которую я сделал в виде словаря (т.е. {leaf: color}
).
Я пробовал следовать https://joernhees.de/blog/2015/08/26/scipy-hierarchical-clustering-and-dendrogram-tutorial/, но цвета почему-то перепутались. График по умолчанию выглядит хорошо, я просто хочу назначить эти цвета по-разному. Я видел, что был link_color_func
, но когда я попытался использовать свою цветовую карту (словарь D_leaf_color
), я получил ошибку b/c, это не была функция. Я создал D_leaf_color
для настройки цветов листьев, связанных с конкретными кластерами. В моем фактическом наборе данных цвета означают что-то, поэтому я удаляюсь от произвольных цветовых назначений.
Я не хочу использовать color_threshold
b/c в своих фактических данных, у меня есть еще больше кластеров и SciPy
повторяет цвета, следовательно, этот вопрос.,
Как я могу использовать словарь листового цвета для настройки цвета моих кластеров дендрограмм?
Я сделал проблему GitHub https://github.com/scipy/scipy/issues/6346, где я подробно остановился на подходе к цвету листьев в Интерпретация вывода иерархической кластерной дендрограммы SciPy? (возможно, найдена ошибка...), но я до сих пор не могу понять, как на самом деле: (i) использовать вывод dendrogram для восстановления моей дендрограммы с указанным цветным словарем или (ii) переформатировать мой D_leaf_color
словарь для параметра link_color_func
.
# Init
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
# Load data
from sklearn.datasets import load_diabetes
# Clustering
from scipy.cluster.hierarchy import dendrogram, fcluster, leaves_list
from scipy.spatial import distance
from fastcluster import linkage # You can use SciPy one too
%matplotlib inline
# Dataset
A_data = load_diabetes().data
DF_diabetes = pd.DataFrame(A_data, columns = ["attr_%d" % j for j in range(A_data.shape[1])])
# Absolute value of correlation matrix, then subtract from 1 for disimilarity
DF_dism = 1 - np.abs(DF_diabetes.corr())
# Compute average linkage
A_dist = distance.squareform(DF_dism.as_matrix())
Z = linkage(A_dist,method="average")
# Color mapping
D_leaf_colors = {"attr_1": "#808080", # Unclustered gray
"attr_4": "#B061FF", # Cluster 1 indigo
"attr_5": "#B061FF",
"attr_2": "#B061FF",
"attr_8": "#B061FF",
"attr_6": "#B061FF",
"attr_7": "#B061FF",
"attr_0": "#61ffff", # Cluster 2 cyan
"attr_3": "#61ffff",
"attr_9": "#61ffff",
}
# Dendrogram
# To get this dendrogram coloring below `color_threshold=0.7`
D = dendrogram(Z=Z, labels=DF_dism.index, color_threshold=None, leaf_font_size=12, leaf_rotation=45, link_color_func=D_leaf_colors)
# TypeError: 'dict' object is not callable
Я также попробовал как получить поддеревья дендрограммы, сделанные scipy.cluster.hierarchy