Фрейм данных выглядит следующим образом, где подпроект представляет собой уникальный код:
project start end phase decision subproject
1 02-2017 03-2018 Phase_1 09-2023 a1
1 08-2017 07-2019 Phase_1,2 09-2023 a2
1 02-2018 11-2021 Phase_2 09-2023 a3
1 04-2021 02-2023 Phase_3 06-2022 a4
2 01-2019 02-2022 Phase_1 06-2022 b1
2 06-2019 07-2022 Phase_2 06-2022 b2
2 01-2021 03-2023 Phase_2,3 06-2022 b3
2 03-2022 02-2021 Phase_3 06-2022 b4
3 11-2017 02-2019 Phase_1 06-2022 c1
3 01-2018 06-2019 Phase_2 06-2022 c2
3 02-2018 07-2020 Phase_2 06-2022 c3
3 02-2019 06-2021 Phase_2,3 03-2023 c4
4 10-2019 10-2019 Phase_2 03-2023 d1
4 06-2019 08-2020 Phase_3 03-2023 d2
4 02-2020 02-2021 Phase_3 03-2023 d3
Я пытаюсь создать раскраску путем итерации по каждому столбцу.
Моя главная цель — чтобы все столбцы в проекте были объединены в группы и не накладывались друг на друга, поэтому я использую код подпроекта. , но мне нужна другая легенда и цвет в зависимости от столбца фазы.

Мой (неудачный) код:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import plotly.express as px
n_colors = 20 # Number of colors in each gradient
blue_orange_cmap = mcolors.LinearSegmentedColormap.from_list("blue_orange", ["blue", "orange"])
orange_green_cmap = mcolors.LinearSegmentedColormap.from_list("orange_green", ["orange", "green"])
blue_orange_colors = [blue_orange_cmap(i/n_colors) for i in range(n_colors)]
orange_green_colors = [orange_green_cmap(i/n_colors) for i in range(n_colors)]
colors = {'Phase_1' : 'blue',
'Phase_2' : 'orange',
'Phase_3' : 'green',
'Phase_1,2' : blue_orange_colors,
'Phase_2,3' : orange_green_colors}
for dat in fig.data:
try:
ix = example_df.index[example_df['subproject']==dat.name]
phase = example_df.loc[ix, 'phase'].values[0]
color = colors[phase]
dat.marker.color = color
dat.name = phase
except:
pass
fig = px.timeline(example_df, x_start='start', x_end='end', y='project', color = 'subproject')
fig.update_layout(xaxis_title='timeline', yaxis_title='projects', showlegend=True, barmode='group', title = "Example", width=1000, height=500)
fig.update_layout(legend=dict(title_text='', traceorder='reversed', itemsizing='constant'))
fig.show()
Подробнее здесь: https://stackoverflow.com/questions/791 ... sed-python
Мобильная версия