如何将注释放在情节甘特图之外?
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】:你应该可以通过shapes
、annotations
的组合以及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)
- 我希望可以!以上是关于如何将注释放在情节甘特图之外?的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB | 如何使用MATLAB绘制甘特图(gantt chart)