我想用我以字典形式制作的颜色Map(即{leaf: color}
)为我的集群着色。
我试过使用https://joernhees.de/blog/2015/08/26/scipy-hierarchical-clustering-and-dendrogram-tutorial/,但由于某种原因,颜色变得混乱。默认图看起来不错,我只是想以不同的方式分配这些颜色。我看到有一个link_color_func
,但当我尝试使用我的颜色Map时(D_leaf_color
字典)我得到了一个错误B/c它不是一个函数。我创建了D_leaf_color
来自定义与特定聚类相关的叶子的颜色。在我的实际数据集中,颜色有一定的含义,所以我避免了任意的颜色分配。
我不想在我的实际数据中使用color_threshold
B/c,我有更多的簇,SciPy
重复了颜色,因此这个问题. . .
如何使用叶色字典自定义树状聚类的颜色?
我做了一个GitHub问题https://github.com/scipy/scipy/issues/6346,在那里我进一步阐述了在Interpreting the output of SciPy's hierarchical clustering dendrogram? (maybe found a bug...)中为叶子着色的方法,但我仍然不知道如何实际操作:(i)使用树状图输出来用我指定的颜色字典重建我的树状图,或者(ii)为link_color_func
参数重新格式化我的D_leaf_color
字典。
# 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
我也试过how do I get the subtrees of dendrogram made by scipy.cluster.hierarchy
4条答案
按热度按时间uqzxnwby1#
这里的解决方案使用
linkage()
的返回矩阵Z
(前面描述过,但在docs中有点隐藏)和link_color_func
:输出如下:
hpxqektj2#
用于将自定义颜色Map表应用于簇分支的双行代码:
然后,您可以将 rainbow 替换为任何cmap,并将您想要的集群数量更改为10。
0md85ypi3#
这个答案很有帮助,但并不是简单地转换为更一般的情况-这里有一个函数运行scipy的凝聚聚类并绘制相应的树状图,使用自定义提供的颜色,对于给定的距离阈值:
这将返回聚类标签,并生成如下所示的图:
希望这对以后的人有帮助。
kdfy810k4#
我找到了一个很简单的解决方案,需要使用颜色阈值(但我需要使用它来获得相同的原始着色,否则颜色与OP中呈现的颜色不一样),但可以引导您找到解决方案。然而,您可能没有足够的信息来知道如何设置调色板顺序。
结果是: