求助:修正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
相关产品推荐
相关产品推荐

