问题描述
我是 plotly 的新手,我正在使用 px.timeline 创建甘特图。我的数据集中有 3 类数据,具有开始和结束时间的普通任务,以及开始和结束时间相同的两种类型的任务。我希望正常任务是一个矩形(这就是它的绘制方式),而其他两个任务有一个沙漏标记和一个三角形标记,而不是一条非常细的线?
这是我的数据的样子:
data = [dict(Task=’’,start=’’,end=’’,shape=’<rect,hour,tri>’)]
样本数据:
df = [dict(Task="Job A",Start='2009-01-01',Finish='2009-01-01',shape='hourglass'),dict(Task="Job B",Start='2009-03-05',Finish='2009-04-15',shape='rectangle'),dict(Task="Job C",Start='2009-05-30',Finish='2009-05-30',shape='triangle')]
代码:
fig = px.timeline(data,x_start="Start",x_end="Finish",y="Task")
fig.update_yaxes(autorange="reversed",ticklabelposition="outside left")
fig.update_layout(showlegend=False,height=2000,width=1255,margin_pad=10)
fig.show()
示例:
有什么办法可以做到这一点吗?
谢谢!
解决方法
经过几个小时的搜索,我解决了这个问题。
将数据分成三份,每份对应 3 种不同的形状,然后绘制并合并。
创建 3 个单独的图:
rect = px.timeline(rect,x_start="Start",x_end="Finish",y="Task",color="color")
dia = px.scatter(dia,x="Start",color="color",symbol_sequence=['diamond'])
coll = px.scatter(coll,symbol_sequence=['hourglass'])
如果需要,更新单个图的轨迹:
rect.update_traces(marker=dict(line=dict(width=1,color='black')))
dia.update_traces(marker=dict(size=12,line=dict(width=2)))
coll.update_traces(marker=dict(size=12,line=dict(width=2)))
设置时间线图的轴:
rect.update_xaxes(tickformat="%H:%M:%S.%L",tickmode='linear',dtick='120000')
rect.update_yaxes(autorange='reversed')
rect.update_layout(title=title,showlegend=False,height=2800,width=2000)
覆盖所有图:
new_fig = go.Figure(data=rect.data + dia.data + coll.data,layout=rect.layout)
new_fig.show()