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

Plotly旭日图层级颜色控制与标签径向设置技术问询

解决方案:带白色中心孔的旭日图(二级颜色统一+一级环自定义调色)

问题背景

从数据库获取的数据格式如下:

xdata = [
    ["ZT","Met",1],
    ["ZT","Compensates",0],
    ["ZT","Planned",0],
    ["ZT","To Do",0],

    ["ZT Basic","Met",6],
    ["ZT Basic","Compensates",6],
    ["ZT Basic","Planned",2],
    ["ZT Basic","To Do",1],

    # 更多数据...
]

需求点:

  • 生成带白色中心孔的旭日图
  • 一级环(对应Area字段)从大调色板选色
  • 二级分段(Met/Compensates/Planned/To Do)颜色全局统一
  • 所有标签采用径向排列

原Plotly Express方案无法同时满足白色中心孔、一级环自定义调色、二级分段颜色统一的要求,改用Plotly Graph Objects(低级SDK)可实现精细控制。


完整实现代码

import pandas as pd
import plotly.graph_objects as go
import plotly.express as px

# 原始数据
xdata = [
    ["ZT","Met",1],
    ["ZT","Compensates",0],
    ["ZT","Planned",0],
    ["ZT","To Do",0],
    ["ZT Basic","Met",6],
    ["ZT Basic","Compensates",6],
    ["ZT Basic","Planned",2],
    ["ZT Basic","To Do",1],
    # 可添加更多数据
]

# 二级状态全局颜色映射
level2_colors = {
    "Met": "#636EFA",    # 浅蓝色
    "Compensates": "#AB63FA", # 紫色
    "Planned": "#AACC96",     # 浅绿
    "To Do": "#FF97FF"        # 橙色
}

# 转为DataFrame
df = pd.DataFrame(xdata, columns=['Area', 'Status', 'Value'])

# 给一级Area分配调色板颜色(用D3调色板,支持多类别)
unique_areas = df['Area'].unique()
palette = px.colors.qualitative.D3  # 10种颜色,若类别更多可换Alphabet(26种)
level1_colors = {area: palette[i % len(palette)] for i, area in enumerate(unique_areas)}

# 合并所有颜色映射:中心孔+一级Area+二级Status
color_map = {" ": "white"}  # 中心孔固定白色
color_map.update(level1_colors)
color_map.update(level2_colors)

# 添加中心孔虚拟层级
df_with_hole = df.assign(Hole=" ")

# 构建旭日图Trace
fig = go.Figure(go.Sunburst(
    # 拼接所有层级的标签、父节点、数值
    labels=pd.concat([pd.Series([" "]), df_with_hole['Area'], df_with_hole['Status']]),
    parents=pd.concat([pd.Series([None]), df_with_hole['Hole'], df_with_hole['Area']]),
    values=pd.concat([pd.Series([0]), df_with_hole['Value'], df_with_hole['Value']]),
    # 按标签匹配颜色
    marker=dict(colors=[color_map[label] for label in pd.concat([pd.Series([" "]), df_with_hole['Area'], df_with_hole['Status']])]),
    textinfo="label+value",
    insidetextorientation="radial",  # 标签径向排列
    hole=0.4  # 中心孔大小,可按需调整
))

# 调整布局,去除多余边距
fig.update_layout(
    margin=dict(t=0, l=0, r=0, b=0),
    title="带白色中心孔的旭日图"
)

fig.show()

关键细节说明

  • 颜色精准控制:手动构建color_map分别指定中心孔、一级环、二级分段的颜色,避免层级间颜色冲突
  • 中心孔实现:添加虚拟的Hole层级并设置为白色,配合hole参数控制中心空白区域大小
  • 径向标签:通过insidetextorientation="radial"强制所有标签沿径向排列
  • 调色板适配:若一级环类别数量超过10种,可替换为px.colors.qualitative.Alphabet(26种颜色)或其他大尺寸调色板

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:35:24