添加颜色时,绘图时间轴条消失

Bars of plotly timeline disappear when adding color

我正在尝试使用 plotly express timeline 可视化一系列视频中的不同阶段。我想为每个视频创建一个条形图,并对每个视频的阶段进行不同的着色。即同相位,同颜色。

这是数据框的一些行:

                            Task   Start  Finish Resource  delta
vid_idx                                                         
Video_002_007_1  Video_002_007_1       0      91        0     91
Video_002_007_1  Video_002_007_1      92     371        1    279
Video_002_007_1  Video_002_007_1     372     630       12    258
Video_002_007_1  Video_002_007_1     631   12352        1  11721
Video_002_007_1  Video_002_007_1   12353   60336        2  47983
Video_002_007_1  Video_002_007_1   60337   67641       3a   7304
Video_002_007_1  Video_002_007_1   67642   69134        2   1492
Video_002_007_1  Video_002_007_1   69135   69396       3b    261
Video_002_007_1  Video_002_007_1   69397   73963       3a   4566
Video_002_007_1  Video_002_007_1   73964   76800       3b   2836
Video_002_007_1  Video_002_007_1   76801   95566        4  18765
Video_002_007_1  Video_002_007_1   95567   97920        5   2353
Video_002_007_1  Video_002_007_1   97921   98119       12    198
Video_002_007_1  Video_002_007_1   98120   99171        5   1051
Video_002_007_1  Video_002_007_1   99172   99260       12     88
Video_002_007_1  Video_002_007_1   99261  102295        5   3034
Video_002_007_1  Video_002_007_1  102296  102378       12     82
Video_002_007_1  Video_002_007_1  102379  103045        5    666
Video_002_007_1  Video_002_007_1  103046  111433        6   8387
Video_002_007_1  Video_002_007_1  111434  111469        8     35

'delta' 列是 'Finish'-'Start' 的结果。除了以下代码行之外,还需要将 x 轴从日期切换为帧。 (至少据我所知)

fig_gantt.layout.xaxis.type='linear'
fig_gantt.data[0].x = df.delta.tolist()
fig_gantt.update_layout(xaxis=dict(tickmode='linear',tick0=0,dtick=50000))

我正在使用

创建px.timeline
fig_gantt = px.timeline(df,
                    x_start='Start', 
                    x_end='Finish',
                    y='Task',
                    width=1000,
                    height=500)
fig_gantt.update_yaxes(autorange="reversed")
fig_gantt.layout.xaxis.type='linear'
fig_gantt.data[0].x = df.delta.tolist()
fig_gantt.update_layout(xaxis=dict(tickmode='linear',tick0=0,dtick=50000))
fig_gantt.show()

这会产生以下甘特图:Gantt chart single color

当我尝试使用字典和 'Resource' 列添加多种颜色时,我最终得到了一个彩色图例,但根本没有条形。

词典:

colors = {'0':'rgb(0,0,255)',
      '1':'rgb(0,255,0)',
      '2':'rgb(255,0,0)',
      '2b':'rgb(255,64,127)',
      '3a':'rgb(0,255,255)',
      '3b':'rgb(255,255,0)',
      '4':'rgb(127,127,127)',
      '5':'rgb(0,0,127)',
      '6':'rgb(0,127,0)',
      '7':'rgb(127,0,0)',
      '8':'rgb(0,127,127)',
      '10a':'rgb(127,127,0)',
      '10b':'rgb(64,127,255)',
      '10c':'rgb(255,127,64)',
      '12':'rgb(127,64,255)'}

我在图表中添加颜色的尝试:

for i in lst:
fig_gantt = ff.create_gantt(df_timeline.loc[list_vids[i:i+1]],
                            colors=colors,
                            index_col='Resource', 
                            group_tasks=True,
                            title='Phase lengths',
                            show_colorbar=True,
                            showgrid_x=True,
                            height=200)
fig_gantt.update_yaxes(autorange="reversed")
fig_gantt.update_xaxes(type='linear')
fig_gantt.update_layout(xaxis=dict(tickmode='linear',tick0=0,dtick=4000))
fig_gantt.show()

gantt with colorful legend but without bars

所以我为每个视频设置了一个栏 ('Task')。每个条包含具有相应范围 ('Start' & 'Finish') 的阶段 ('Resource'),但我在添加颜色以使其更具可读性时失败了。 是否有解决这个问题的简单方法,我只是想念这个问题,还是更复杂?

非常感谢您的帮助!

这个答案最初提供了解决方案,对我来说非常有用

只需更改此行:

fig_gantt.data[0].x = df.delta.tolist()

喜欢下面的代码(可能需要一些调整,因为您使用的是自定义颜色编码,但希望您能弄明白)

for d in fig_gantt.data:
    filt = df['Resource'] == d.name
    d.x = df[filt]['delta'].tolist()