Добавление текста аннотации приводит к целочисленному сообщению об ошибке

#python #plotly #plotly-dash

Вопрос:

Когда я добавляю v-образную линию на свой график, она работает идеально:

 fig.add_vline(
        x=pd.to_datetime('1970-01-01 00:00:00'),
        line_dash='dot',
        row=0)
 

[![введите описание изображения здесь][1]][1]

Когда я пытаюсь добавить текст аннотации рядом с vline, я получаю сообщение об ошибке

 fig.add_vline(
    x=pd.to_datetime('1970-01-01 00:00:00'),
    line_dash='dot',
    annotation_text='15',
    row=0)
 

Ошибка типа: Сложение/вычитание целых чисел и целых массивов с
Метка времени больше не поддерживается. Вместо сложения/вычитания n
используйте n * obj.freq

Комментарии:

1. Похоже, в том, как вы пытаетесь добавить эту аннотацию, нет ничего плохого. Это единственная строка, которую вы изменили, когда получили эту ошибку?

2. @coralvanda Да, я думаю, что проблема была сообщена как ошибка github.com/plotly/plotly.py/issues/3065 . вы знаете какой-либо другой обходной путь

Ответ №1:

  • в качестве обходного пути выполните один звонок add_vline() и один звонок add_annotation()
  • установите параметры add_annotation() таким образом, чтобы аннотация находилась в верхней части строки
 import pandas as pd
import plotly.express as px

ROWS = 20
df = pd.DataFrame({"ColA":pd.date_range("1-jan-1970", freq="4H", periods=ROWS), "ColB":np.random.uniform(1,30, ROWS)})

fig = px.line(df, x="ColA", y="ColB")
fig.update_xaxes(title_font=dict(size=12), tickformat='%X')

for time in df["ColA"].values:
    time = pd.Timestamp(time).to_pydatetime()
    fig.add_vline(x=time)
    fig.add_annotation(x=time, y=1, yref="paper", text="15")

fig
 

введите описание изображения здесь

под-участки

 import pandas as pd
import plotly.express as px

ROWS = 20
df = pd.DataFrame(
    {
        "ColA": pd.date_range("1-jan-1970", freq="4H", periods=ROWS),
        "ColB": np.random.uniform(1, 30, ROWS),
        "Facet": np.repeat(["plot 1", "plot 2"], ROWS // 2),
    }
)

fig = px.line(df, x="ColA", y="ColB", facet_row="Facet")
fig.update_xaxes(title_font=dict(size=12), tickformat="%X")

for time, y, facet in df[["ColA", "ColB", "Facet"]].values:
    time = pd.Timestamp(time).to_pydatetime()
    fig.add_vline(x=time, row=0 if facet == "plot 1" else 1)
    fig.add_annotation(x=time, y=y, text="15", row=0 if facet == "plot 1" else 1, col=0)

fig
 

введите описание изображения здесь

Комментарии:

1. как мне включить аспект, связанный с каждой аннотацией, вы можете увидеть «строку» в моем коде px.line

2. причина, по которой вопрос о наилучшей практике можно воспроизвести, заключается в этой причине. вы видите, что мой ответ можно воспроизвести. обновленный