Как поместить аннотации за пределы диаграммы графически Ганта?

#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) … Надеюсь, этого хватит!