Plotly旭日图:为内外圈层设置不同颜色(泰坦尼克号数据集场景)
Kaggle泰坦尼克挑战赛:Plotly旭日图分圈层配色解决方案
你的核心问题是Plotly Express的sunburst只能基于单一字段统一配色,没法给内外圈层分别指定配色规则。要实现内圈(性别/客舱等级)用一套配色、外圈(存活/死亡)用另一套配色,得用Plotly Graph Objects手动控制每个节点的颜色,以下是具体实现:
优化版代码(以性别为内圈为例)
import plotly.graph_objects as go import pandas as pd # 1. 预处理数据:把存活状态转为易读标签,然后按性别-存活状态分组统计 total_raw_df['survived_label'] = total_raw_df['survived'].map({0: 'Deceased', 1: 'Survived'}) grouped_df = total_raw_df.groupby(['sex', 'survived_label']).size().reset_index(name='counts') # 2. 定义圈层专属配色 color_map = { # 内圈性别配色 'male': '#2D5F91', # 蓝色 'female': '#8B25BE', # 粉色 # 外圈存活状态配色 'Deceased': '#97909A', # 灰色 'Survived': '#2D9157' # 绿色 } # 3. 构建旭日图的层级结构(根节点 + 内圈节点 + 外圈节点) labels = ['', 'male', 'female'] + [f"{row['sex']}-{row['survived_label']}" for _, row in grouped_df.iterrows()] parents = ['', '', ''] + [row['sex'] for _, row in grouped_df.iterrows()] values = [ 0, # 根节点(不显示,仅用于层级支撑) grouped_df[grouped_df['sex']=='male']['counts'].sum(), # 男性总人数 grouped_df[grouped_df['sex']=='female']['counts'].sum(), # 女性总人数 ] + list(grouped_df['counts']) # 各性别-存活状态的人数 # 4. 匹配每个节点的颜色 colors = [ '#FFFFFF', # 根节点透明隐藏 color_map['male'], color_map['female'], ] + [color_map[row['survived_label']] for _, row in grouped_df.iterrows()] # 5. 绘制旭日图 fig = go.Figure(go.Sunburst( labels=labels, parents=parents, values=values, marker=dict(colors=colors), textinfo="label+percent parent", insidetextorientation='horizontal' )) fig.update_layout(font=dict(size=18)) fig.show()
替换内圈为客舱等级的快速调整
如果要把内圈换成pclass(客舱等级),只需要修改3处:
- 调整分组逻辑:
grouped_df = total_raw_df.groupby(['pclass', 'survived_label']).size().reset_index(name='counts')
- 更新配色映射的内圈规则:
color_map = { # 内圈客舱等级配色 1: '#2D5F91', # 一等舱蓝色 2: '#8B25BE', # 二等舱粉色 3: '#F2C14E', # 三等舱黄色 # 外圈存活状态配色不变 'Deceased': '#97909A', 'Survived': '#2D9157' }
- 重构层级结构的labels和parents:
labels = ['', 1, 2, 3] + [f"{row['pclass']}-{row['survived_label']}" for _, row in grouped_df.iterrows()] parents = ['', '', '', ''] + [row['pclass'] for _, row in grouped_df.iterrows()] values = [ 0, grouped_df[grouped_df['pclass']==1]['counts'].sum(), grouped_df[grouped_df['pclass']==2]['counts'].sum(), grouped_df[grouped_df['pclass']==3]['counts'].sum(), ] + list(grouped_df['counts'])
核心逻辑说明
Plotly Graph Objects的Sunburst支持直接给每个节点绑定颜色,通过手动构建层级节点(根节点、内圈特征节点、外圈存活状态节点),再用配色映射精准匹配不同层级的颜色,彻底解决了Express版本无法分圈层独立配色的问题。
内容的提问来源于stack exchange,提问作者SilentCloud
相关产品推荐
相关产品推荐

