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)
我遇到的问题是(a)由于我无法弄清楚的原因,该链接不可点击;(b) 我无法点击替代文本中的链接,因为一旦我移动鼠标,它就会消失;(c) 我正在创建的甘特图上的条形将比这些小得多,因此为了有效,链接实际上应该与单击条形本身相关联。
非常感谢任何提示。
编辑:这是完成的甘特图的示例:
我想嵌入每天数据的链接;如您所见,条形非常小。
使用注释功能添加超链接。评论中添加的一项要求是,时间线上的任务太多,链接被隐藏,需要一种解决方法。如果超链接字符串太长,它会被任务覆盖,所以我们将其更改为“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)
| 归档时间: |
|
| 查看次数: |
740 次 |
| 最近记录: |