Plotly Da sh Несколько Yaxis сложены в панели - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь разработать интерактивную панель управления с помощью Plotly / Da sh. Основные функции:

  • (1) - представление нескольких диаграмм,
  • (2) с одной и той же осью x (таймсерии),
  • (3) где как базовые данные, так и указанные c трассировки / линии могут быть интерактивно скорректированы с помощью обратных вызовов.

Функциональность (3) в порядке и не проблема, поэтому я не буду включать ее дальше в свое описание. Однако (1) и (2) я не могу приступить к работе.

Подводя итог тому, что я сделал до сих пор для (1) и (2):
i. Создайте трассы, которые относятся к тому графику, на котором должна быть трассировка (например, trace_01 & yaxis = 'y', trace_02 & yaxis = 'y2', et c);
ii. Укажите yaxis, yaxis2, yaxis3, et c.
iii. Сгенерируйте остальную часть приложения da sh стандартным образом (т.е. go .Figure (data = data, layout = layout), da sh .Da sh (), et c.).

Проблема в том, что я не могу получить более одного набора графиков на двух (или более) графиках (то есть по оси Y) с одинаковой осью x. Я не могу заставить это работать.

КОД ОСНОВНОЙ ПРОБЛЕМЫ:

# Set Traces/Data
t0101 = go.Scatter(x=df_fx.date, y=df_fx['close'],mode='lines',name='close',yaxis='y')
t0201 = go.Scatter(x=df_fx.date, y=df_fx['adx'],mode='lines',name='adx',yaxis='y2')
data = [t0101,t0201]

# Specify Layout
layout= go.Layout(
    xaxis= dict(side= 'bottom', anchor= 'y2'),
    yaxis= dict(side= 'right'),
    yaxis2= dict(side='left'),)

# Call Figure
fig = go.Figure(data=data, layout=layout)

# Create App
app = dash.Dash()
app.layout = html.Div([dcc.Graph(id='chart', figure=fig)])

Этот код генерирует следующий вывод: вывод из кода

Что я на самом деле нужно получить вывод панели инструментов, такой как: требуемый вывод

Важно, чтобы решение могло поддерживать Функциональность (3), например, изменить базовые данные (используются те же данные для всех диаграмм / ось Y) или переключаться между различными кривыми, которые находятся на диаграмме.

Обратите внимание, что код для функциональности (3) исключен из приведенного выше кода. Основная проблема в том, что я не могу заставить работать Functionality (1) и (2).

Я тщательно просмотрел всю документацию и все вопросы по стеку. Большинство из них относятся к нескольким осям y, но с overlay = 'y' мне не нужно это решение.

Прошу прощения, если на этот вопрос уже был дан ответ или задокументирован где-то еще, но я не могу найти, почему моя реализация не выводит требуемые диаграммы с несколькими осями.

Любые советы, хаки, ошибки действительно оценен. Это действительно мое последнее средство после того, как я потратил на эту проблему слишком много часов / ночей.

Приложение 1: Пример исходных данных
Приложение 2: Ссылка на данные (csv)
Приложение 3: Ссылка на данные (xlsx )
Приложение 4: Полный код:

import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
import pandas as pd
import datetime as dt

### Input Data_____________________________________________

# Extract
p_fx = 'AUD_NZD'
p_dir = "C:/Users/Gebruiker/Gen_Inds_"
p_file = p_dir + p_fx + ".csv"
df_0 = pd.read_csv(p_file,skiprows=1)
df_1 = pd.DataFrame(df_0.loc[df_0['AUD_NZD']=='AUD_NZD',['AUD_NZD','datetime','open','high','low','close','sma','sma.1','hma','hma.1','kama','kama.1','adx','aroonup', 'aroondown']])

# Prepare
df_1 = df_1.rename(columns={'AUD_NZD': "Pair",
                           "sma":"sma_s","sma.1":"sma_f",
                           "hma":"hma_s","hma.1":"hma_f",
                           "kama":"kama_s","kama.1":"kama_f",
                           })
df_1['datetime'] = df_1['datetime'].str.rstrip('.999989')
df_2 = df_1.astype({'datetime':'datetime64[ns]'})
df_2['date'] = pd.to_datetime(df_2['datetime'].dt.date, format='%Y-%m-%d')

# Input data
df_fx = pd.DataFrame(df_2[['date','Pair','open','high','low','close','sma_s','sma_f','hma_s','hma_f','kama_s','kama_f','adx','aroonup', 'aroondown']])
print(df_fx.Pair.value_counts())

### Figure_____________________________________________
# Data
t0101 = go.Scatter(x=df_fx.date, y=df_fx['close'],mode='lines',name='close',yaxis='y')
t0201 = go.Scatter(x=df_fx.date, y=df_fx['adx'],mode='lines',name='adx',yaxis='y2')
data = [t0101,t0201]

# Layout
layout= go.Layout(
    xaxis= dict(side= 'bottom', anchor= 'y2'),
    yaxis= dict(side= 'right'),
    yaxis2= dict(side='left'),
)

# Figure
fig = go.Figure(data=data, layout=layout)

### App_____________________________________________
app = dash.Dash()
app.layout = html.Div([
    dcc.Graph(id='chart', figure=fig)
])

### End_____________________________________________
if __name__ == '__main__':
    app.run_server()


Приложение 4: Частичное решение (составные диаграммы реализованы в обратном вызове для Требования № 3)

    # add the relevant sub-charts / traces to the fig. 
    fig = psp.make_subplots(rows=2, cols=1)
    fig.append_trace(go.Scatter(x=df_fx.date, y=df_fx.close ,mode='lines',name='close'), 
                     row=1, col=1)
    fig.append_trace(go.Scatter(x=df_fx.date, y=df_fx.sma_s ,mode='lines',name='sma_s'), 
                     row=1, col=1)    
    fig.append_trace(go.Scatter(x=df_fx.date, y=df_fx.adx ,mode='lines',name='adx'),
                     row=2, col=1)

    fig.update_layout(height=600, title_text="Close and ADX")

Приложение 5: Вывод решения

1 Ответ

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

Функция, которую вам нужно использовать, - это подсюжеты. Вот ваша цифра (со случайно сгенерированными данными, созданными до того, как вы добавили файлы CSV в вопрос).

# some fake data (use your CSV instead)
dates = pd.date_range(start = "2020-01-01", end = "2020-06-01", freq="1D")
close = np.random.uniform(90, 110, len(dates))
adx = np.random.uniform(190, 210, len(dates))

# important part - use sub-plots. 
fig = make_subplots(rows=2, cols=1)

# add the relevant sub-charts / traces to the fig. 
fig.append_trace(go.Scatter(x=dates, y=close ,mode='lines',name='close'), 
                 row=1, col=1)
fig.append_trace(go.Scatter(x=dates, y=adx ,mode='lines',name='adx'),
                 row=2, col=1)

fig.update_layout(height=600, title_text="Close and ADX")

Результат:

enter image description here

...