Plotly树形图重复数据问题:调用栈可视化异常排查
问题:Plotly Treemap调用栈可视化出现重复根节点
问题描述
尝试用Plotly Treemap可视化调用栈,现有包含parent(调用当前函数的父函数)、function(函数名)、duration(调用时长)的DataFrame,期望所有函数嵌套在根节点Main下,但实际出现大量重复节点(如Function H既在Main下,又作为独立根节点存在),子节点未正确归属到Main下的对应父节点中。
原因分析
误用了Plotly Express的path参数:path=['parent', 'function']是用于分层分组(如类别→子类别),而非表示树状父子关系。该参数会将所有相同parent值的function归为同一顶层分组,导致未纳入Main链的parent被当作独立根节点,最终出现重复。
修复方案
使用Plotly Graph Objects的Treemap组件,通过names和parents参数明确指定每个节点的父子关系,确保所有节点最终归属Main。
修改后代码
import plotly.graph_objects as go import pandas as pd data = {'parent': ['Function A', 'Function A', 'Function A', 'Function A', 'Function A', 'Function A', 'Function B', 'Function B', 'Function B', 'Function B', 'Function C', 'Function C', 'Function D', 'Function E', 'Function F', 'Main', 'Function H', 'Function H', 'Function H', 'Function H', 'Function F', 'Function A', 'Function H', 'Function B'], 'function': ['Function C', 'Function D', 'Function F', 'Function I', 'Function J', 'Function K', 'Function A', 'Function L', 'Function M', 'Function N', 'Function C', 'Function O', 'Function P', 'Function Q', 'Function C', 'Function H', 'Function B', 'Function R', 'Function D', 'Function E', 'Other', 'Other', 'Other', 'Other'], 'duration': [3.0, 1.0, 169.0, 8.0, 3.0, 29.0, 272.0, 6.0, 7.0, 4.0, 60.0, 60.0, 3.0, 1.0, 60.0, 1100.0, 636.0, 10.0, 3.0, 1.0, 109.0, 59.0, 450.0, 347.0]} df = pd.DataFrame(data) # 为每个函数调用生成唯一名称,避免同名节点被合并 df['unique_node'] = df.apply(lambda x: f"{x['function']} (called by {x['parent']})", axis=1) # 构建树结构所需的列表 labels = ['Main'] + df['unique_node'].tolist() parents = [''] # Main无父节点 values = [1100] + df['duration'].tolist() # 为每个节点匹配父节点的唯一名称 func_parent_map = df.set_index(['function', 'parent'])['unique_node'].to_dict() for _, row in df.iterrows(): parent_func = row['parent'] if parent_func == 'Main': parents.append('Main') else: # 找到父函数对应的唯一节点名称 parent_row = df[df['function'] == parent_func].iloc[0] parents.append(func_parent_map[(parent_func, parent_row['parent'])]) # 生成Treemap fig = go.Figure(go.Treemap( labels=labels, parents=parents, values=values, marker=dict(cornerradius=5), root_color="lightgrey" )) fig.show()
替代图表类型
如果不局限于Treemap,可选择以下同样支持嵌套权重数据的图表:
- Sunburst图:环形嵌套布局,更直观展示层级占比,用法与Treemap一致,只需将
go.Treemap替换为go.Sunburst。 - Icicle图:垂直分层的树状布局,适合展示深层调用栈,使用
go.Icicle组件,参数与Treemap兼容。
内容的提问来源于stack exchange,提问作者JustinS
相关产品推荐
相关产品推荐

