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
相关产品推荐
相关产品推荐

