我正在try 使用DASH+PLATLY来创建一个水平时间线图表. 几个参与者在某些时间段使用共享资源. 我想用单杠形象地展示每个演员的工作过程. 但在每个水平条上悬停时,我希望看到这位演员在这个时间段正在处理的资源.

例如:

演员1从08:00:00到10:30:00处理资源1 演员2从10:00:00到10:40:00处理资源1 演员1在10:31:00至11:00:00处理资源2 演员3: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)])

我能看到一幅很漂亮的图画.我偶然注意到的唯一一个问题,并能弄清楚如何处理它,它徘徊在错误的.例如,图中显示Actor 3正在资源1上工作,但不在资源3上. 对于每个参与者,UPDATE_TRACE中的定制数据似乎都是从头开始的. 但我需要它与《演员》帧的适当索引相匹配.

wrong hover for actor3

我该怎么处理呢?也许我可以准备另一种格式的数据?或者使用另一种类型的图表?

推荐答案

这可以通过在快速时间线中直接设置定制数据来实现.

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()

enter image description here

Python相关问答推荐

将numpy数组存储在原始二进制文件中

更改matplotlib彩色条的字体并勾选标签?

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

什么相当于pytorch中的numpy累积ufunc

Python库:可选地支持numpy类型,而不依赖于numpy

实现自定义QWidgets作为QTimeEdit的弹出窗口

递归访问嵌套字典中的元素值

提取相关行的最快方法—pandas

使用特定值作为引用替换数据框行上的值

如何获取Python synsets列表的第一个内容?

干燥化与列姆化的比较

根据Pandas中带条件的两个列的值创建新列

使用SeleniumBase保存和加载Cookie时出现问题

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

一维不匹配两个数组上的广义ufunc

如何在Polars中创建条件增量列?

普洛特利express 发布的人口普查数据失败

Python:在cmd中添加参数时的语法

组颠倒大Pandas 数据帧

将鼠标悬停在海运`pairplot`的批注/高亮显示上