You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为树状图的彩色条形添加标签并解决标签与颜色匹配问题

解决树状图彩色条形标签与颜色映射问题

针对你遇到的两个问题,我来一步步帮你搞定:

问题1:彩色条形用二进制值,但Status标签显示4种不同值

这种情况大概率是你的Status列数据类型或者类别定义出了问题——可能数据里藏了隐形的类别(比如字符串类型的"0"/"1"和数字0/1混合,或者有NaN被当成了额外类别)。

你可以先强制把Status转换成明确的二进制数值类型,确保只有0和1两个值:

import pandas as pd

# 假设你的数据存在df里,先清理并转换Status列
df['Status'] = df['Status'].astype(int)
# 如果之前是分类类型,重置类别
df['Status'] = pd.Categorical(df['Status'], categories=[0, 1], ordered=True)

处理完数据后,再生成标签就能保证只有0和1两种显示了。

问题2:分段定义正确,但颜色与分段对应关系错误

核心是要明确建立值与颜色的一对一映射,别依赖默认的颜色映射,手动指定更可靠。同时要注意:彩色条形的顺序必须和树状图叶子节点的顺序完全匹配,这是很多人踩坑的关键!

这里推荐用matplotlib的ListedColormap来精准绑定0→白色、1→红色,代码示例如下:

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from scipy.cluster.hierarchy import dendrogram, linkage

# 先完成树状图绘制
Z = linkage(data, method='ward')
plt.figure(figsize=(10, 6))
dendrogram(Z, labels=df.index, leaf_rotation=90)

# 定义颜色映射:索引0对应0→白色,索引1对应1→红色
cmap = ListedColormap(['white', 'red'])
# 获取树状图叶子节点的顺序(关键!确保和数据顺序一致)
leaf_order = dendrogram(Z, no_plot=True)['leaves']
# 按叶子顺序提取Status值
status_ordered = df['Status'].iloc[leaf_order].values

# 添加彩色条形
ax = plt.gca()
# 条形的位置、高度要和树状图叶子对齐
ax.barh(range(len(status_ordered)), width=0.5, left=plt.xlim()[1]+0.5, 
        color=cmap(status_ordered), tick_label=status_ordered)

plt.tight_layout()
plt.show()

这样就能保证每个分段的颜色和对应的Status值完全匹配了——白色对应0,红色对应1。


内容的提问来源于stack exchange,提问作者Gilgamesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:01:57