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

How to put annotations outside of plotly gantt chart?

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

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

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

end-result 应该是这样的: 标记垂直线大致适用于前三个事件,但随后注释脱离了为图形分配的 canvas(?)。我试图用黑色虚线框来表示这一点。

因此,不显示文本“被截断的文本”和“没有机会”。我怎样才能解决这个问题? 我读到注释并不是真正的图形 objects 但因此,图形的维度不会扩展到注释的坐标。但是我在 plotly.

中也没有发现“文本图 objects”

你应该可以通过shapes, annotations, and a correct adjustment of 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()