如何在px.treemap中跳过None条目并消除额外分组
Plotly Treemap 消除None/空格导致的额外分组问题
问题重现
原代码尝试绘制多层级树状图时,因New列存在None值触发错误:'None entries cannot have not-None children';将None替换为空格后,又生成了不必要的空格分组。原代码如下:
import pandas as pd import plotly.express as px test_df = pd.DataFrame( { 'Product': ['Auto', 'Auto', 'Auto', 'Auto', 'PP', 'PP'], 'New': ['No', 'No', 'Yes', 'Yes', None, None], 'Category': ['A', 'B', 'A', 'B', 'A', 'B'], 'Count': [1003, 307, 44, 65, 3814, 3095], 'Price': [1872.1, 6753.2, 7380.4, 7673.4, 2951.9, 2447.25] } ) fig = px.treemap( test_df, path=[px.Constant('Group'), 'Product', 'New', 'Category'], values='Price', hover_data=['Count'], color='Price', color_continuous_scale='RdBu' ) fig.show()
解决方案
核心思路是为不同产品构造动态路径:Auto保留New层级,PP直接跳过该层级,避免无效分组。具体实现代码如下:
import pandas as pd import plotly.express as px test_df = pd.DataFrame( { 'Product': ['Auto', 'Auto', 'Auto', 'Auto', 'PP', 'PP'], 'New': ['No', 'No', 'Yes', 'Yes', None, None], 'Category': ['A', 'B', 'A', 'B', 'A', 'B'], 'Count': [1003, 307, 44, 65, 3814, 3095], 'Price': [1872.1, 6753.2, 7380.4, 7673.4, 2951.9, 2447.25] } ) # 生成动态路径:Auto保留New层级,PP跳过该层级 test_df['path'] = test_df.apply( lambda row: ['Group', row['Product'], row['New'], row['Category']] if row['Product'] == 'Auto' else ['Group', row['Product'], row['Category']], axis=1 ) fig = px.treemap( test_df, path='path', values='Price', hover_data=['Count'], color='Price', color_continuous_scale='RdBu' ) fig.show()
原理说明
Plotly Treemap要求路径层级中不能存在None父节点,同时固定层级会强制所有行遵循同一结构,导致空格这类无效值生成额外分组。通过动态生成路径,让不同产品的层级结构匹配实际数据,既避免了None报错,又消除了不必要的中间分组。
内容的提问来源于stack exchange,提问作者abdelgha4
相关产品推荐
相关产品推荐

