我有一组这样的数据,它是从数据库中获得的:

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]以上)的 colored颜色 是从合适的大调色板中挑选出来的,但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分段和洞变为相同的 colored颜色 .试图保持白洞和随机化的1级片段打破了2级的 colored颜色 一致性.此外,我希望所有的标签都是径向的.我还没有嫁到express岁,并且很高兴使用较低级别的plotly SDK.建议?这是v5.16.1.

推荐答案

为了将color_discrete_map用于级别2分段(状态),您需要设置color='Status'

color_discrete_map中的键应该是由表示的列中的值 color.

现在所有其他地段(非级别2,包括根)将具有相同的 colored颜色 ,这是我们不想要的.不过,我们可以使用 colored颜色 贴图中的特殊键"(?)"覆盖该 colored颜色 (不会有太大帮助,因为它将影响所有剩余的地段,但我们仍然可以使用它来设置根 colored颜色 ,因为我们知道我们即将覆盖Level 1分段).

对于级别1(区域) colored颜色 ,我们可以从px.colors中 Select 一个适当大的调色板(请参见Discrete 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')

在使用 colored颜色 映射表"(?)"中的特殊键时,我发现了一个技巧,可以根据加载的template自动从默认调色板向其余地段分配不同的 colored颜色 (奇怪的是,设置要映射到这些地段的 colored颜色 数组并不起作用,它的行为与设置空数组或空字符串相同,无论如何它是通过从模板中挑选 colored颜色 来完成这项工作的):

level2_colors = {
    # "(?)": "white",               # assigns "white" to all remaining sectors
    # "(?)": ["white", 'red', ...], # doesn't do what we'd expect (same as below) 
    "(?)": "",                      # assigns distinct colors from template
    "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,
                  template='seaborn'
                  )

Python相关问答推荐

提取两行之间的标题的常规表达

DataFrame groupby函数从列返回数组而不是值

为什么tkinter框架没有被隐藏?

Python中的嵌套Ruby哈希

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

如何使用它?

ThreadPoolExecutor和单个线程的超时

删除marplotlib条形图上的底边

如何指定列数据类型

在Python中调用变量(特别是Tkinter)

为什么'if x is None:pass'比'x is None'单独使用更快?

不允许 Select 北极滚动?

使用polars. pivot()旋转一个框架(类似于R中的pivot_longer)

需要帮助使用Python中的Google的People API更新联系人的多个字段'

SpaCy:Regex模式在基于规则的匹配器中不起作用

如何在SQLAlchemy + Alembic中定义一个"Index()",在基表中的列上

我怎么才能用拉夫分拣呢?

在聚合中使用python-polars时如何计算模式

无法使用请求模块从网页上抓取一些产品的名称

生产者/消费者-Queue.get by list