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

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处:

  1. 调整分组逻辑:
grouped_df = total_raw_df.groupby(['pclass', 'survived_label']).size().reset_index(name='counts')
  1. 更新配色映射的内圈规则:
color_map = {
    # 内圈客舱等级配色
    1: '#2D5F91',    # 一等舱蓝色
    2: '#8B25BE',    # 二等舱粉色
    3: '#F2C14E',    # 三等舱黄色
    # 外圈存活状态配色不变
    'Deceased': '#97909A',
    'Survived': '#2D9157'
}
  1. 重构层级结构的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:50:23