Plotly: Как провести вертикальные линии между датами на свечном графике?

Взгляните на третий пример здесь (в разделе Добавление пользовательского текста и Аннотации). Если вы увеличите диаграмму, вы увидите, что пример вставил вертикальную линию на дату '2007-12-01'. Если бы дата была торговым днем ​​(например, '2007-11-29'), можно было бы увидеть, как вертикальная линия проходит через свечу этого дня прямо посередине.

Пример Plotly. Добавление v-линии на дату.

Я хочу провести вертикальную линию между двумя датами (например, между 29 и 30 ноября — две свечи непосредственно перед v-линией в приведенном выше примере). Как я могу это сделать?


person Roy    schedule 06.07.2017    source источник


Ответы (1)


Если вы хотите найти дату или время между двумя датами, рассмотрите возможность построения свечных диаграмм по датам в виде временных меток pandas. Вы найдете пример под Simple Example with datetime Objects чуть ниже на той же странице, на которую вы ссылаетесь. Но не волнуйтесь, в этом ответе вы найдете полный фрагмент кода для аналогичного подхода.

Если ваши даты на самом деле отформатированы как метки дат панд, вы можете легко найти дату между двумя датами, используя pd.to_pydatetime и различные подходы, как описано здесь. И поскольку plotly уже интерпретирует вашу ось X как временную шкалу, она будет принимать даты, которые происходят между датами в вашем фрейме данных. Plotly будет обрабатывать временные метки не только дат, но и времени суток.

Итак, если ваши даты, о которых идет речь:

datetime.datetime(2020, 10, 11, 0, 0)

и:

datetime.datetime(2020, 10, 12, 0, 0)

тогда приведенный ниже подход даст вам:

datetime.datetime(2020, 10, 11, 12, 0)

который даст вам линию между двумя датами, как вы и просили.

Посмотри:

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

Полный фрагмент с данными и графическим кодом:

import pandas as pd
import plotly.graph_objects as go
from datetime import datetime

# data
open_data = [33.0, 33.3, 33.5, 33.0, 34.1]
high_data = [33.1, 33.3, 33.6, 33.2, 34.8]
low_data = [32.7, 32.7, 32.8, 32.6, 32.8]
close_data = [33.0, 32.9, 33.3, 33.1, 33.1]
dates = [datetime(year=2020, month=10, day=10),
         datetime(year=2020, month=10, day=11),
         datetime(year=2020, month=10, day=12),
         datetime(year=2020, month=10, day=13),
         datetime(year=2020, month=10, day=14)]


# data organized in a pandas dataframe
df=pd.DataFrame(dict(open=open_data,
                    high=high_data,
                    low=low_data,
                    close=close_data,
                    dates=dates))

# calculations using to_pydatetime() to get the date/time
# between your dates
a=df.dates.iloc[1].to_pydatetime()
b=df.dates.iloc[2].to_pydatetime()
linedate = a + (b - a)/2

# plotly figure setup
fig = go.Figure(data=[go.Candlestick(x=df.dates,
                       open=open_data, high=high_data,
                       low=low_data, close=close_data)])

# edit layouts
fig.update_layout(
    title='Dates are pandas timestamps',
    yaxis_title='AAPL Stock',
    shapes = [dict(
        x0=linedate, x1=linedate, y0=0, y1=1, xref='x', yref='paper',
        line_width=2)],
    annotations=[dict(x=linedate, y=0.8, xref='x', yref='paper',font=dict(
                        color="blue",size=14),
        showarrow=False, xanchor='left', text='Vertical line between two dates')]
)

fig.show()
person vestland    schedule 26.11.2019