在plotlyexpress中添加甘特图的超链接?

Iot*_*ron 2 python gantt-chart plotly

我使用甘特图来显示几年来分布式网络中大量传感器的记录数据。(网络中的一些节点间歇性地打开或关闭,因此这是一目了然地显示整个数据集的有效方法。)我使用plotlyexpress从文件名列表生成甘特图,因此每个甘特条对应到给定日期的图表的 .PNG 文件,我可以轻松地将结果导出为交互式 .html 文档。

我想为甘特图上的每个条形添加一个可点击的链接,以便单击给定的条形将打开相关日期的绘图。这将使探索数据变得更加容易。我可以生成链接,但无法从甘特图中打开它们。

这是我第一次通过 MWE:

# WIP: Can I set up the Gantt chart so that clicking on an entry takes you to that graph?
import plotly.express as px
import pandas as pd

string1 = "<a href=https://www.nytimes.com/> link </a>"

df = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28', Filename = string1), 
    dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15', Filename = string1),
    dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30', Filename = string1)
])

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", text="Filename") # textposition argument not possible
fig.update_traces(textposition='outside')
fig.show()
fig.write_html("test_gantt.html", include_plotlyjs="cdn")
Run Code Online (Sandbox Code Playgroud)

输出如下所示: 带有 3 个概念条的甘特图,每个条的右侧都有一个蓝色“链接”。 上面代码片段的输出。

我遇到的问题是(a)由于我无法弄清楚的原因,该链接不可点击;(b) 我无法点击替代文本中的链接,因为一旦我移动鼠标,它就会消失;(c) 我正在创建的甘特图上的条形将比这些小得多,因此为了有效,链接实际上应该与单击条形本身相关联。

非常感谢任何提示。

编辑:这是完成的甘特图的示例:

带有更多小条形的甘特图。

我想嵌入每天数据的链接;如您所见,条形非常小。

r-b*_*ers 5

使用注释功能添加超链接。评论中添加的一项要求是,时间线上的任务太多,链接被隐藏,需要一种解决方法。如果超链接字符串太长,它会被任务覆盖,所以我们将其更改为“o”。我们还计算了该期间的中心日期,以便将其从开始日期和结束日期居中。由于四舍五入的原因,它并未集中于所有任务。四舍五入也是如此。另外,超链接颜色默认为蓝色,因此您需要使用不包含深蓝色的配色方案。

import plotly.express as px
import pandas as pd
import math

string1 = f"""<a href="https://www.nytimes.com/", target="_black">o</a>"""

df = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-01-04', Filename=string1),
    dict(Task="Job A", Start='2009-01-06', Finish='2009-01-09', Filename=string1),
    dict(Task="Job A", Start='2009-01-10', Finish='2009-01-15', Filename=string1),
    dict(Task="Job A", Start='2009-01-16', Finish='2009-01-19', Filename=string1),
    dict(Task="Job A", Start='2009-01-21', Finish='2009-01-25', Filename=string1),
    dict(Task="Job A", Start='2009-01-28', Finish='2009-01-31', Filename=string1),
    dict(Task="Job A", Start='2009-02-01', Finish='2009-02-08', Filename=string1),
    dict(Task="Job A", Start='2009-02-11', Finish='2009-02-15', Filename=string1),
    dict(Task="Job A", Start='2009-02-17', Finish='2009-02-20', Filename=string1),
    dict(Task="Job A", Start='2009-02-22', Finish='2009-02-24', Filename=string1),
    dict(Task="Job A", Start='2009-02-25', Finish='2009-02-28', Filename=string1),
    dict(Task="Job B", Start='2009-03-05', Finish='2009-03-15', Filename=string1),
    dict(Task="Job C", Start='2009-02-20', Finish='2009-04-30', Filename=string1)
])

fig = px.timeline(df, 
                  x_start="Start",
                  x_end="Finish",
                  y="Task",
                  color="Task",
                  color_discrete_sequence=px.colors.qualitative.Pastel)

for idx, row in df.iterrows():
    periods = pd.date_range(row["Start"],row["Finish"], freq='1D')
    center_pos = math.floor(len(periods) / 2)
    x_dates = periods[center_pos]
    fig.add_annotation(
        {
            "x": x_dates,#row["Finish"],
            "y": row["Task"],
            "text": row["Filename"],
            "align": "center",
            "showarrow":False,
        }
    )

fig.show()
fig.write_html("test_gantt.html", include_plotlyjs="cdn")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述