我正在尝试使用破折号+绘图来创建水平时间线图。 多个参与者在某些时段正在处理共享资源。 我想用单杠来形象化每个演员的工作过程。 但在每个水平条上的悬停中,我想看到该演员在这个时间段正在处理的资源。
例如:
actor1 从 08:00:00 到 10:30:00 处理资源1 actor2 从 10:00:00 到 10:40:00 处理资源1 actor1 从 10:31:00 到 11:00:00 处理资源2 actor3 从 09:15:00 到 10:15:00 处理资源3
我在以下数据样本中表示它:
data_sample = {
'Actor': ['actor1', 'actor2', 'actor1', 'actor3'],
'Start Time': ['08:00:00', '10:00:00', '10:31:00', '09:15:00'],
'End Time': ['10:30:00', '10:40:00', '11:00:00', '10:15:00'],
'Resource': ['resource1', 'resource1', 'resource2', 'resource3']
}
df = pd.DataFrame(data_sample)
df['Start Time'] = pd.to_datetime(df['Start Time'])
df['End Time'] = pd.to_datetime(df['End Time'])
并尝试以以下方式可视化:
fig = px.timeline(df, x_start='Start Time', x_end='End Time', y='Actor', color='Actor')
fig.update_traces(hovertemplate='Resource: %{customdata}<br>' +
'Start Time: %{base}<br>' +
'End Time: %{x}<br>',
customdata=df['Resource'])
app.layout = html.Div([dcc.Graph(figure=fig)])
我可以看到一幅非常美丽的图画。我无意中注意到的唯一问题是错误的悬停,并且可以弄清楚如何处理它。例如,该图显示 actor3 正在处理资源 1,但不在资源 3 上。 看起来 update_traces 中的自定义数据从每个参与者的一开始就开始了。 但我需要它来匹配“Actor”框架的适当索引。
我该如何处理?我可以准备其他格式的数据吗?或者使用其他类型的图表?
这可以通过直接在快速时间轴中设置自定义数据来完成。
import plotly.express as px
fig = px.timeline(df,
x_start='Start Time',
x_end='End Time',
y='Actor',
color='Actor',
custom_data='Resource')
fig.update_traces(hovertemplate='Resource: %{customdata}<br>' +
'Start Time: %{base}<br>' +
'End Time: %{x}<br>',
#customdata=[[x] for x in df['Resource']]
)
fig.show()