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

如何用plotly.graph_objects.Treemap生成目录树状图?解决渲染空白问题

解决Plotly Treemap渲染空白问题(重复标签下的ids/parents配置)

问题根源

你的代码核心错误在于**parents字段的赋值逻辑错误**,导致节点无法找到正确的父节点,从而无法构建树形结构:

  • 目录的parents被设为自身的相对路径(而非父目录的id)
  • 文件的parents被设为自身的相对路径(而非所在目录的id)
    同时根节点的处理依赖遍历顺序,不够严谨。

修正后的代码

生成测试目录结构(不变)

import os

folder = 'Documents'

for i in range(10):
    for j in range(100):
        path = os.path.join(folder, f'folder_{i}', f'sub-folder-{j}')
        if not os.path.isdir(path):
            os.makedirs(path)
        for k in range(20):
            with open(os.path.join(path, f'file_{k + 1}.txt'), 'w') as file_out:
                file_out.write(f'Hello from file {k + 1}!\n')

修正后的树形图生成代码

import os
from pathlib import Path
import pandas as pd
import plotly.graph_objects as go

directory = '[input your directory here]/Documents'
root_dir = Path(directory)
root_parent = root_dir.parent

def calculate_size(folder):
    result = []
    for root, dirs, files in os.walk(folder):
        current_path = Path(root)
        # 当前节点的id:相对于根目录父级的路径,保证唯一性
        node_id = str(current_path.relative_to(root_parent))
        # 当前节点的父id:根目录的父id为空,其他节点取父目录的id
        parent_id = str(current_path.parent.relative_to(root_parent)) if current_path != root_dir else ""
        
        # 计算当前目录的大小(仅包含当前目录下文件,若需包含子目录大小需后续累加)
        dir_size = sum(os.path.getsize(current_path / name) for name in files)
        result.append({
            'parents': parent_id,
            'labels': current_path.name,
            'size': dir_size,
            'ids': node_id,
        })

        # 处理每个文件
        for f in files:
            file_path = current_path / f
            file_id = str(file_path.relative_to(root_parent))
            result.append({
                'parents': node_id,  # 文件的父节点是所在目录的id
                'labels': f,
                'size': os.path.getsize(file_path),
                'ids': file_id,
            })

    return result

result = calculate_size(directory)
df = pd.DataFrame(result)

# 提取绘图所需字段
labels = df['labels'].tolist()
parents = df['parents'].tolist()
ids = df['ids'].tolist()
values = df['size'].tolist()

fig = go.Figure(go.Treemap(
    labels = labels,
    parents = parents,
    ids = ids,
    values = values,
    # maxdepth=3  # 可根据需要开启,限制展示的层级深度
))
  
fig.update_traces(root_color="lightgrey")
fig.update_layout(margin = dict(t=50, l=25, r=25, b=25))

fig.show()

关键修正点说明

  1. 节点关联逻辑:
    • 目录的父id直接指向其父目录的id,根目录的父id设为空字符串
    • 文件的父id绑定到所在目录的id,确保文件正确挂载到对应目录下
  2. id唯一性保障:使用相对于根目录父级的完整路径作为ids,即使存在同名文件/目录,id也不会重复
  3. 根节点处理:通过路径判断设置根节点父id,不依赖遍历顺序,逻辑更可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:55:15