我有一组这样的数据,是从数据库中提供的:
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],
...
我希望构建一个带有白孔的旭日形,其中 1 级环(上面的
xdata[n][0]
)颜色是从适当大的调色板中选取的,但 2 级段(“Met”、“Planned”等)始终是每个值都相同,例如Met
为所有 Met
呈现浅蓝色。
我正在接近
level2_colors = {
"Met": "blue",
"Compensates": "purple",
"Planned": "#AACC96",
"To Do": "orange"
}
df = pd.DataFrame(xdata, columns=['Area', 'Status', 'Value'])
fig = px.sunburst(df.assign(hole=" "),
path=['hole','Area', 'Status'],
values='Value',
color_discrete_map=level2_colors
)
但是这种方法会将所有 1 级段和孔变成相同的颜色。尝试保留白洞并随机化第 1 级片段会破坏第 2 级的着色一致性。此外,我希望所有标签都是径向定向的。我还没有结婚
express
并且很高兴使用较低级别的 plotly
SDK。建议?这是情节 v5.16.1.
color_discrete_map
用于 2 级分段(状态),您需要设置 color='Status'
中的键应该是由 表示的列中的值color_discrete_map
。color
现在所有其他扇区(非 level2,包括根)将具有相同的颜色,这是我们不希望的。不过,我们可以使用颜色图中的特殊键
"(?)"
来覆盖该颜色(没有多大帮助,因为它会影响所有剩余的扇区,但我们仍然可以使用它来设置根颜色,因为我们知道我们将要覆盖1 级段)。
对于1级(区域)颜色,我们可以从
px.colors
中选择一个适当大的调色板,然后手动进行分配(一旦创建fig
):
level2_colors = {
"(?)": "white", # assign "white" to all remaining sectors, including root
"Met": "blue",
"Compensates": "purple",
"Planned": "#AACC96",
"To Do": "orange",
}
df = pd.DataFrame(xdata, columns=['Area', 'Status', 'Value'])
fig = px.sunburst(df.assign(hole=" "),
path=['hole','Area', 'Status'],
values='Value',
color='Status',
color_discrete_map=level2_colors,
)
# Each sector id has its own color
colors = list(fig.data[0]['marker']['colors'])
ids = fig.data[0]['ids']
# print(list(zip(ids, colors)))
areas = df['Area'].unique()
palette = px.colors.qualitative.T10.copy()
# Reset color for each area
for i, id in enumerate(fig.data[0]['ids']):
if id.split('/')[-1] in areas:
colors[i] = palette.pop(0)
fig.data[0]['marker']['colors'] = colors
对于所有径向标签,只需添加:
fig.update_traces(insidetextorientation='radial')