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

如何在Plotly树形图(Treemap)中自定义单个节点的颜色

这问题我之前也碰到过!Plotly的px.treemap确实不能直接把颜色数组传给color参数,但有两种靠谱的方法能实现你要的自定义颜色需求,完全适配你不用DataFrame的场景:

方法1:通过类别映射实现(符合Plotly原生逻辑)

这种方法适合有重复颜色规则的场景,管理起来更清晰:

  • 第一步:给每个节点分配类别标签
    遍历你的names数组,根据自定义规则给每个节点打标签,比如"test_file"、"binary_file"、"regular"。
  • 第二步:调用treemap时传入类别数组和颜色映射
    把类别数组传给color参数,再用color_discrete_map把类别映射到具体颜色值。

示例代码:

import plotly.express as px

# 假设你已经准备好这些核心数组
names = ["root", "src", "test_utils.py", "data.bin", "test_login.py"]
ids = ["root", "src", "src/test_utils.py", "src/data.bin", "src/test_login.py"]
parents = ["", "root", "src", "src", "src"]
values = [100, 80, 20, 30, 30]

# 生成类别标签数组
colors_category = []
for name in names:
    if name.startswith("test_"):
        colors_category.append("test_file")
    elif name.endswith((".bin", ".exe", ".dll")):  # 自定义二进制文件后缀
        colors_category.append("binary_file")
    else:
        colors_category.append("regular")

# 创建树形图并绑定颜色规则
fig = px.treemap(
    names=names,
    ids=ids,
    parents=parents,
    values=values,
    color=colors_category,
    color_discrete_map={
        "test_file": "#ff4444",  # 红色
        "binary_file": "#3366ff",  # 蓝色
        "regular": "#aaaaaa"  # 默认灰色
    }
)

# 不需要图例的话可以关闭
fig.update_layout(showlegend=False)
fig.show()

方法2:直接指定每个节点的颜色(更灵活)

如果不想搞类别映射,想直接给每个节点硬编码颜色,你可以在生成基础图之后,用update_traces直接修改节点颜色:

示例代码:

import plotly.express as px

# 同样假设你有这些核心数组
names = ["root", "src", "test_utils.py", "data.bin", "test_login.py"]
ids = ["root", "src", "src/test_utils.py", "src/data.bin", "src/test_login.py"]
parents = ["", "root", "src", "src", "src"]
values = [100, 80, 20, 30, 30]

# 直接生成颜色数组
node_colors = []
for name in names:
    if name.startswith("test_"):
        node_colors.append("#ff4444")
    elif name.endswith((".bin", ".exe", ".dll")):
        node_colors.append("#3366ff")
    else:
        node_colors.append("#aaaaaa")

# 创建基础树形图
fig = px.treemap(
    names=names,
    ids=ids,
    parents=parents,
    values=values
)

# 覆盖每个节点的颜色
fig.update_traces(marker=dict(colors=node_colors))

fig.show()

补充说明

如果你的目录节点也需要特殊颜色,只要在遍历names的时候加上判断逻辑就行——比如通过ids的结构(无文件后缀)或者parents的层级来识别目录,再给它分配对应颜色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:07:51