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

求助:修正Plotly Express树形图父节点增长率的聚合计算方法

解决Plotly树形图父节点增长率加权错误的问题

问题说明

需要生成树形图展示两日期间数值增长,要求:

  • 方块大小与日期2的数值成正比
  • 颜色依据日期1到日期2的数值增长率缩放

但使用px.treemap时,父节点的增长率计算逻辑不符合需求:Plotly默认用日期2的数值加权计算子节点增长率的平均值,而实际需要用日期1的数值加权。比如示例中父节点I的正确增长率应为20%,但默认计算得到183%。

原始问题代码

import pandas as pd
import plotly.express as px

data = {'variable': ['a', 'b', 'c'],
        'parent': ['I', 'I', 'II'],
     'value_1': [1,4,5],
     'value_2': [4,2,5]
     }

df = pd.DataFrame(data)
df['growth'] = 100 * (df['value_2'] / df['value_1'] - 1)

fig = px.treemap(df,  path=['parent', 'variable'], values = 'value_2', color='growth', 
                 color_continuous_scale='plasma')

fig.show()

解决方案:手动计算父节点聚合值

要实现基于value_1加权的父节点增长率,需手动计算父节点的总数值和对应增长率,再将父节点数据与子节点合并后绘图。

修正后代码

import pandas as pd
import plotly.express as px

# 原始数据
data = {'variable': ['a', 'b', 'c'],
        'parent': ['I', 'I', 'II'],
        'value_1': [1,4,5],
        'value_2': [4,2,5]
        }
df = pd.DataFrame(data)

# 计算子节点的增长率
df['growth'] = 100 * (df['value_2'] / df['value_1'] - 1)

# 聚合父节点的总value_1和value_2
parent_agg = df.groupby('parent').agg(
    value_1=('value_1', 'sum'),
    value_2=('value_2', 'sum')
).reset_index()

# 配置父节点的层级信息,计算正确增长率
parent_agg['variable'] = parent_agg['parent']
parent_agg['growth'] = 100 * (parent_agg['value_2'] / parent_agg['value_1'] - 1)
parent_agg['parent'] = ''  # 将父节点设为顶层节点

# 合并父、子节点数据
combined_df = pd.concat([df, parent_agg], ignore_index=True)

# 绘制树形图
fig = px.treemap(combined_df, 
                 path=['parent', 'variable'], 
                 values='value_2', 
                 color='growth',
                 color_continuous_scale='plasma')

fig.show()

效果说明

  • 父节点I的增长率会显示为正确的20%,父节点II的增长率为0%(因value_1与value_2均为5)
  • 方块大小仍与value_2成正比,符合初始需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:10:44