Desidero colorare i miei cluster con una mappa dei colori che ho creato sotto forma di un dizionario (ad esempio {leaf: color}
).Colori cluster personalizzati del dendrogramma SciPy in Python (link_color_func?)
Ho provato a seguire https://joernhees.de/blog/2015/08/26/scipy-hierarchical-clustering-and-dendrogram-tutorial/ ma i colori sono incasinati per qualche motivo. La trama di default sembra buona, voglio solo assegnare quei colori in modo diverso. Ho visto che c'era un link_color_func
ma quando ho provato ad usare la mia mappa dei colori (dizionario D_leaf_color
) ho ricevuto un errore b/c che non era una funzione. Ho creato D_leaf_color
per personalizzare i colori delle foglie associate a particolari cluster. Nel mio set di dati effettivo, i colori significano qualcosa, quindi mi sto allontanando da assegnazioni di colori arbitrarie.
Non voglio usare color_threshold
b/c nei miei dati effettivi, ho molto più cluster e SciPy
ripete i colori, quindi questa domanda. . .
Come posso utilizzare il mio dizionario foglia-colore per personalizzare il colore dei miei cluster di dendrogrammi?
ho fatto un problema GitHub https://github.com/scipy/scipy/issues/6346 dove ho ulteriormente elaborati sull'approccio per colorare le foglie in Interpreting the output of SciPy's hierarchical clustering dendrogram? (maybe found a bug...), ma non riesco ancora a capire come in realtà sia: (i) utilizzare l'uscita dendrogramma di ricostruire la mia dendrogram con il mio specificato dizionario colori o (ii) riformattare il dizionario D_leaf_color
per il parametro 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
Ho anche provato how do I get the subtrees of dendrogram made by scipy.cluster.hierarchy
Non riesco a distinguere dalla descrizione cosa si intende per dendrogramma risultante * in generale * (ad es. Per un dizionario arbitrario di colori foglia). Per quanto posso dire, non ha senso specificare i colori in termini di foglie da solo, perché non si ha alcuna garanzia che le foglie che si danno allo stesso colore siano vicine l'una all'altra nel dendrogramma.Le cose nel dendrogramma che sono colorate non sono foglie; sono i collegamenti tra i cluster. Hai in qualche modo generato il tuo 'leaf_colors' dai cluster? In tal caso, non puoi invece generare i colori di collegamento dai cluster? – BrenBarn
Questo è vero, ma il modo in cui ho creato il dizionario del colore foglia è utilizzando fcluster per ottenere i cluster effettivi –
Ma non è possibile utilizzare una logica simile per ottenere i collegamenti e specificare i colori in termini di tali? Non è possibile ottenere i colori solo sulla base di 'fcluster', poiché' fcluster' restituisce solo i cluster * flat * e getta via le informazioni sui cluster di livello inferiore. È necessaria la struttura completa del collegamento. – BrenBarn