#python #plotly #plotly-python
Вопрос:
Я не знаю, описывает ли название мою проблему, но это мое лучшее предположение.
создать сюжет ганна в plotly достаточно просто (https://plotly.com/python/gantt/).
Кроме того, я хочу указать на некоторые критические события. Поскольку они не относятся к категориям, я не хочу, чтобы они относились к определенной категории по оси y. Поэтому я хочу перейти к вертикальным линиям. Это все еще достаточно просто ( add_vline
). Но эти строки также должны быть помечены именем события, события обычно имеют очень длинные имена. Это можно сделать, обозначив вертикальные линии. Поскольку названия событий очень длинные, я подумал, что их смещение в направлении y было бы хорошей идеей.
Конечный результат должен выглядеть так: маркировка вертикальных линий хорошо работает примерно для первых трех событий, но затем аннотации удаляются с холста (?), выделенного для графика. Я попытался указать на это черной пунктирной рамкой.
Следовательно, тексты «текст, который отсекается» и «нет шансов» не отображаются. Как я могу это исправить? Я читал, что аннотации на самом деле не являются объектами графика, но, как таковые, размеры графика не расширяются до координат аннотаций. Но я также не нашел «объектов текстового графика» в plotly.
Комментарии:
1. Вы, по-видимому, предприняли здесь серьезную попытку, поэтому, пожалуйста, предоставьте код, который вы собрали до сих пор.
2. @vestland С радостью!! Я предоставлю MWE в понедельник 🙂
Ответ №1:
Вы должны быть в состоянии получить то, что хотите , с помощью комбинации shapes
annotations
, и правильной настройки margins
. Приведенная ниже настройка делает именно это и аннотирует фигуры со все более отрицательным смещением к нулевой линии с помощью y = -0.2-(i/10)
и yref = 'paper'
в fig.add_annotation()
. В нынешнем виде этот подход не очень динамичен в отношении количества аннотированных строк, но мы можем взглянуть на это поближе, если эта цифра действительно отражает суть того, что вы ищете:
Полный код:
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()
Комментарии:
1. Большое спасибо 🙂 Я создал временную шкалу точно так же, как и вы. Для событий я создал вертикальные линии следующим образом: « yshift_delta = 10 для события в событиях: аннотация = plotly.graph_objects. расположение. Аннотация(текст=событие.текст, ссылка=»x», ссылка=»бумага», yshift=yshift) рис.add_vline( x=событие.x, аннотация_позиция=»внизу», аннотация=аннотация ) yshift -= yshift_delta « Но ваш путь выглядит так же прекрасно 🙂 Призыв
update_layout
с правильными полями-вот что сделало свое дело. Я просто пошел сb=yshift_delta*len(events)
… Надеюсь, этого хватит!