plotly 表达旭日段颜色控制

问题描述 投票:0回答:1

我有一组这样的数据,是从数据库中提供的:

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.

python plotly plotly-python
1个回答
0
投票

为了将

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')
© www.soinside.com 2019 - 2024. All rights reserved.