修改底层数据集后Plotly Sunburst Chart无法渲染问题求助
问题核心原因
渲染失败的核心原因是生成的层级DataFrame存在重复ID,Plotly旭日图要求所有节点的id必须全局唯一,不能出现多个同ID对应不同父级的情况,从你输出的df_all_trees可以验证这一点:存在多个ID为Fri、Dinner的节点,分别对应不同的父级,Plotly无法解析层级关系,导致渲染失败。
修复方案
1. 移除冗余代码
删除无用的Unnamed: 0列插入逻辑,该列无实际作用,反而会在groupby聚合时干扰计算结果,原代码中以下两行可以直接删除:
df.insert(0, "Unnamed: 0", range(0, 0 + len(df))) df.reset_index(inplace=True,drop=True)
2. 修改层级ID生成逻辑
调整build_hierarchical_dataframe函数中id和parent的生成规则,给每个节点拼接完整层级路径保证全局唯一,修改后的函数核心逻辑如下:
def build_hierarchical_dataframe(df, levels, value_column, color_columns=None): df_all_trees = pd.DataFrame(columns=['id', 'parent', 'value', 'color']) for i, level in enumerate(levels): df_tree = pd.DataFrame(columns=['id', 'parent', 'value', 'color']) dfg = df.groupby(levels[i:]).sum(numeric_only=True).reset_index() # 拼接完整层级路径作为唯一id df_tree['id'] = dfg[levels[i:]].apply(lambda x: '-'.join(map(str, x)), axis=1) if i < len(levels) - 1: # parent取上一级的完整路径 df_tree['parent'] = dfg[levels[i+1:]].apply(lambda x: '-'.join(map(str, x)), axis=1) else: df_tree['parent'] = 'total' df_tree['value'] = dfg[value_column] df_tree['color'] = dfg[color_columns[0]] / dfg[color_columns[1]] df_all_trees = pd.concat([df_all_trees, df_tree], ignore_index=True) total = pd.Series(dict(id='total', parent='', value=df[value_column].sum(), color=df[color_columns[0]].sum() / df[color_columns[1]].sum())) df_all_trees = pd.concat([df_all_trees, total.to_frame().T], ignore_index=True) return df_all_trees
注意:Pandas 1.3.2版本中
append方法已经不推荐使用,替换为pd.concat兼容性更好,同时groupby.sum添加numeric_only=True参数避免非数值列聚合报错。
修改完成后重新运行代码即可正常在浏览器中渲染旭日图。
内容的提问来源于stack exchange,提问作者Nathanial Gainer
相关产品推荐
相关产品推荐

