如何在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
相关产品推荐
相关产品推荐

