如何将注释放在 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()
我不知道标题是否描述了我的问题,但这是我最好的猜测。
在 plotly 中创建甘特图非常简单 (https://plotly.com/python/gantt/)。
另外,我想指出某些关键事件。由于这些是 non-specific 类别,
我不希望他们引用 y-axis 上的某个类别。所以我想用垂直线。这仍然很容易 (add_vline
)。但是这些行还需要标上事件名称,事件的名称通常很长。这可以通过注释垂直线来完成。由于事件名称很长,我认为在 y-direction 中偏移它们是个好主意。
end-result 应该是这样的:
因此,不显示文本“被截断的文本”和“没有机会”。我怎样才能解决这个问题? 我读到注释并不是真正的图形 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()