Постройте горизонтальные линии в сюжете

Я пытаюсь наложить горизонтальные линии на график свечей, используя plotly. Однако, когда я не могу заставить горизонтальные линии начинаться с их координаты «x», которая находится в df['date'][level[0]]. Вместо этого горизонтальные линии начинаются с x=0.

Ниже приведено то, что мне удалось собрать воедино, что, как мне кажется, не очень приятно для опытного глаза.

Однако любые указатели на помощь будут высоко оценены:

import plotly.graph_objects as go
from plotly.offline import plot
import datetime as dt
from pandas import DataFrame
import numpy as np
import pandas as pd



hovertext=[]
for i in range(len(df['bidopen'])):
    hovertext.append('Datetime: '+str(df['date'][i])+'<br>Open: '+str(df['bidopen'][i])+'<br>Close: '+str(df['bidclose'][i]))


fig = go.Figure(data=go.Candlestick(x=df['date'],
                open=df['bidopen'],
                high=df['bidhigh'],
                low=df['bidlow'],
                close=df['bidclose'],
                text=hovertext,
                hoverinfo='text'))

for level in levels:
    fig.add_hline(level[1], df['date'][level[0]], exclude_empty_subplots=True)


plot(fig)

Вот снимок экрана того, что в настоящее время производит мой сюжетный код (текущий вывод):

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

Ниже показано, чего я пытаюсь добиться в отношении горизонтальных линий (желаемый результат):

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

.. этот второй снимок экрана представляет то, что я смог создать с помощью matplotlib


person windwalker    schedule 21.11.2020    source источник
comment
В документах для add_hline прямо указано, что он будет бесконечно расширяться в x-измерении (plotly.com/python-api-reference/generated/), поэтому я думаю, что вы не можете использовать эту функцию. Я думаю, вам придется либо нарисовать их как новый точечный график, либо использовать add_shape(type="line", ...). Соответствующие документы/примеры здесь: plotly.com/python/shapes   -  person alkasm    schedule 22.11.2020
comment
@alkasm Да, add_shape кажется наиболее подходящей функцией. Большое спасибо   -  person windwalker    schedule 22.11.2020


Ответы (2)


Поскольку hline() расширяет графики до бесконечности с обеих сторон, вы можете использовать метод add_shape().

Учитывая кадр данных, например:

df = pd.DataFrame(data = {'levels':np.random.random(10)*10, 
                          'dates':pd.date_range(start = '2020-11-01', periods = 10)})
df

    levels  dates
0   9.149079    2020-11-01
1   0.294123    2020-11-02
2   5.401443    2020-11-03
3   4.043063    2020-11-04
4   8.878100    2020-11-05
5   5.275614    2020-11-06
6   4.425696    2020-11-07
7   8.228720    2020-11-08
8   7.632410    2020-11-09
9   7.045191    2020-11-10

и фигура, уже имеющая даты, которые вы хотите использовать в качестве индексов:

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

Вы можете сделать что-то вроде:

for row in df.iterrows():
    fig.add_shape(type="line", x0= row[1]['dates'], 
                            y0 = row[1]['levels'],
                            x1 = df.dates.max(),
                            y1 = row[1]['levels'], fillcolor = 'yellow')
fig

Что приводит к:

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

person Hamza    schedule 22.11.2020
comment
ваш пример add_shape с настройкой прицела сделал это. Мои уровни фактически были созданы как кортежи с индексом строки, а не с фактической датой. То, что я сделал на основе вашего примера, теперь можно увидеть в ответе... - person windwalker; 22.11.2020

Используя пример из @Hamza, см. решение ниже:

df1 = pd.DataFrame(levels, columns = ['dates', 'levels'])

df1.set_index('dates', inplace=True)

for i in df1:
      df1['dates'] = df.date[df.index.isin(df1.index)]

hovertext=[]
for i in range(len(df['bidopen'])):
    hovertext.append('Datetime: '+str(df['date'][i])+'<br>Open: '+str(df['bidopen'][i])+'<br>Close: '+str(df['bidclose'][i]))


fig = go.Figure(data=go.Candlestick(x=df['date'],
                open=df['bidopen'],
                high=df['bidhigh'],
                low=df['bidlow'],
                close=df['bidclose'],
                text=hovertext,
                hoverinfo='text'))

for row in df1.iterrows():
    fig.add_shape(type="line", x0= row[1]['dates'], 
                            y0 = row[1]['levels'],
                            x1 = df.date.max(),
                            y1 = row[1]['levels'], fillcolor = 'yellow')

plot(fig)
person windwalker    schedule 22.11.2020