如何用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()
关键修正点说明
- 节点关联逻辑:
- 目录的父id直接指向其父目录的id,根目录的父id设为空字符串
- 文件的父id绑定到所在目录的id,确保文件正确挂载到对应目录下
- id唯一性保障:使用相对于根目录父级的完整路径作为
ids,即使存在同名文件/目录,id也不会重复 - 根节点处理:通过路径判断设置根节点父id,不依赖遍历顺序,逻辑更可靠
内容的提问来源于stack exchange,提问作者Simon1
相关产品推荐
相关产品推荐

