Как сделать анимацию с Candlestick из plotly (Python) - PullRequest
2 голосов
/ 26 мая 2020

Уважаемый,

Могу из сюжета делать графики подсвечником. Однако внутри al oop, как сделать так, чтобы эти фигуры не располагались одна под другой, а были все в одной фигуре? Создание эффекта анимации. См. Пример, в котором я строю свечи с окном на 5 дней вперед, последовательно проходя через весь DataFrame.

import plotly.graph_objects as go
import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')

#df
#i         Date   AAPL.Open   AAPL.High    AAPL.Low  AAPL.Close  AAPL.Volume  \
#0    2015-02-17  127.489998  128.880005  126.919998  127.830002     63152400   
#1    2015-02-18  127.629997  128.779999  127.449997  128.720001     44891700  
#....

for index, row in df.iterrows():

    FiveDaysBlock = df.iloc[index:(index+5),]

    fig = go.Figure(data=[go.Candlestick(
    x=FiveDaysBlock['Date'],
    open=FiveDaysBlock['AAPL.Open'], high=FiveDaysBlock['AAPL.High'],
    low=FiveDaysBlock['AAPL.Low'], close=FiveDaysBlock['AAPL.Close']
    )])
    fig.update_layout(xaxis_rangeslider_visible=False)
    fig.update_layout(autosize=False,width=700, height=250, margin=dict( l=1,r=1,b=20,  t=20, pad=2 ) )
    fig.update_xaxes(rangebreaks=[dict(bounds=["sat", "mon"])])
    fig.show()

Посмотрите, как рисунок создается под другим

Спасибо,

1 Ответ

0 голосов
/ 26 мая 2020

К сожалению, исходя из следующего [ответа] [1], кажется, что автоматическое масштабирование оси x и оси y отключено с помощью объекта go .Candlestick (), поэтому оси не масштабируются должным образом, поскольку анимация прогрессирует.

import plotly.graph_objects as go
import datetime as dt
import pandas as pd
from ipywidgets import widgets
from IPython.display import display

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')

#df
#i         Date   AAPL.Open   AAPL.High    AAPL.Low  AAPL.Close  AAPL.Volume  \
#0    2015-02-17  127.489998  128.880005  126.919998  127.830002     63152400   
#1    2015-02-18  127.629997  128.779999  127.449997  128.720001     44891700  
#....

# it might be useful to convert the Dates to datetime objects
df['Date'] = pd.to_datetime(df['Date'])

candlestick_data = []
for index, row in df.iterrows():
    FiveDaysBlock = df.iloc[index:(index+5),]
    candlestick_data.append(go.Candlestick(x=FiveDaysBlock['Date'],
        open=FiveDaysBlock['AAPL.Open'], high=FiveDaysBlock['AAPL.High'],
        low=FiveDaysBlock['AAPL.Low'], close=FiveDaysBlock['AAPL.Close'])
    )

def update_fig(i):
    fig = go.Figure(data=candlestick_data[i])

    fig.update_layout(xaxis_rangeslider_visible=False)
    fig.update_layout(transition_duration=2000)
    fig.update_layout(autosize=True,width=700, height=250, margin=dict(l=1,r=1,b=20,t=20,pad=2))

# this doesn't quite work but it's close
interact(update_fig, i=100)
fig.show()
...