如何将注释放在情节甘特图之外?

Posted

技术标签:

【中文标题】如何将注释放在情节甘特图之外?【英文标题】:How to put annotations outside of plotly gantt chart? 【发布时间】:2021-12-09 21:07:56 【问题描述】:

我不知道标题是否描述了我的问题,但这是我的最佳猜测。

在 plotly 中创建甘特图非常简单 (https://plotly.com/python/gantt/)。

此外,我想指出某些关键事件。由于这些不是特定于类别的, 我不希望他们引用 y 轴上的某个类别。所以我想用垂直线。这仍然很容易(add_vline)。但是这些行也需要标上事件名称,事件通常有很长的名称。这可以通过注释垂直线来完成。由于事件名称很长,我认为在 y 方向上偏移它们会是个好主意。

最终结果应如下所示: 标记垂直线大致适用于前三个事件,但随后注释会脱离为图形分配的画布(?)。我试图用黑色虚线框表示这一点。

因此,不会显示“文本被切断”和“没有机会”的文本。我怎样才能解决这个问题? 我读到注释并不是真正的图形对象,但因此,图形的尺寸不会扩展到注释的坐标。但我在 plotly 中也没有发现“文本图形对象”。

【问题讨论】:

您似乎在这方面做了认真的尝试,所以请提供您迄今为止编写的代码。 @vestland 很高兴!!我会在星期一提供 MWE :) 【参考方案1】:

你应该可以通过shapesannotations的组合以及margins的正确调整得到你想要的。下面的设置就是这样做的,并使用fig.add_annotation() 中的y = -0.2-(i/10)yref = 'paper' 对具有越来越负偏移的形状进行注释。就目前的情况而言,这种方法在注释行的数量方面并不是非常动态的,但我们可以仔细研究一下,如果这个数字确实代表了你的本质寻找:

完整代码:

import plotly.express as px
import pandas as pd

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

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task")
fig.update_yaxes(autorange="reversed")

events = ['date':'2009-02-01', 'annotation': 'some important information', 'color':'red',
          'date':'2009-04-01', 'annotation': 'some very important stuff', 'color':'green']

for i, e in enumerate(events):
    fig.add_shape(type = 'line', x0 = e['date'], x1 = e['date'], y0 = 0, y1 = 1, yref = 'paper',
                  line = dict(color = e['color']))
    fig.add_annotation(x = e['date'], y = -0.2-(i/10), text = e['annotation'],
                      yref = 'paper', showarrow = False,
                      font=dict(color=e['color'],size=12))

fig.update_layout(margin=dict(l=25,
                                r=25,
                                b=100,
                                t=25,
                                pad=4),
                  paper_bgcolor="LightSteelBlue")
    
fig.show()

【讨论】:

非常感谢 :) 我和你一样创建了时间线。对于事件,我创建了这样的垂直线:``` yshift_delta = 10 for event in events: annotation = plotly.graph_objects.layout.Annotation(text=event.text, xref="x", yref="paper" , yshift=yshift) fig.add_vline( x=event.x, annotation_position="bottom", annotation=annotation ) yshift -= yshift_delta ``` 但是你的方式看起来一样好:) 用正确的方法调用update_layout利润是诀窍。我刚刚选择了b=yshift_delta*len(events) - 我希望可以!

以上是关于如何将注释放在情节甘特图之外?的主要内容,如果未能解决你的问题,请参考以下文章

jfreechart:甘特图任务标签字体大小

甘特图日期坐标怎么改

将 y 轴网格线添加到 D3 甘特图

MATLAB | 如何使用MATLAB绘制甘特图(gantt chart)

MATLAB | 如何使用MATLAB绘制甘特图(gantt chart)

如何绘制项目管理甘特图