Python / Dash: несколько графиков в одном фрагменте рисунка - PullRequest
0 голосов
/ 28 апреля 2018

Мне нужно иметь несколько линейных графиков внутри одного из вспомогательных участков фигуры на графиках тире.

В приведенном ниже коде есть 3 субплота 'Price', 'MMA30' и 'Volume' на рисунке как 3 отдельных субплота.

Я хочу, чтобы 'Price' и 'MMA30' были в одном подзаговоре.

Код для воспроизведения:

import dash,requests,pandas as pd
from dash.dependencies import Output, Input
import dash_core_components as dcc
import dash_html_components as html
import plotly.tools as tls
from io import StringIO

app = dash.Dash(__name__)

app.layout = html.Div([
                html.Div(['Name : ', 
                          dcc.Input(id='input',value='ACC',type='text')
                          ]),       
             dcc.Graph(id='price_volume')
             ])


@app.callback(
        Output('price_volume', 'figure'),
        [Input(component_id='input', component_property = 'value')]
        )
def update_graph(in_data):

    p=requests.get('http://finance.google.com/finance/getprices?q='+in_data+'&x=NSE&i=61&p=1d&f=d,c,v').text
    a=pd.read_csv(StringIO(p),skiprows=range(7),names =['date','Close','Volume'])

    a['date']=pd.to_datetime(a.date.str[1:],unit='s').dt.tz_localize('UTC').dt.tz_convert('Asia/Kolkata')
    a['Date']=a.date.dt.date
    a['Time']=a.date.dt.time
    df = a[['Date','Time','Close','Volume']]

    df['MMA30']=df.Close.rolling(window=30).mean()

    fig = tls.make_subplots(rows=3, cols=1, shared_xaxes=True,vertical_spacing=0.009,horizontal_spacing=0.009)
    fig['layout']['margin'] = {'l': 30, 'r': 10, 'b': 50, 't': 25}

    fig.append_trace({'x':df.Time,'y':df.Close,'type':'scatter','name':'Price'},1,1)
    fig.append_trace({'x':df.Time,'y':df.MMA30,'type':'scatter','name':'MMA30'},2,1)
    fig.append_trace({'x':df.Time,'y':df.Volume,'type':'bar','name':'Volume'},3,1)
    fig['layout'].update(title='1 Minute plot of '+in_data)  
    return fig
if __name__ == '__main__':
    app.run_server(debug=True)

Я попытался объединить графики «Цена» и «MMA30» в один субплот, изменив количество субплотов на 2 строки и 1 столбец в строке tls.make_subplot

и изменил fig.append_trace на

fig.append_trace([{'x':df.Time,'y':df.Close,'type':'scatter','name':'Price'},
                  {'x':df.Time,'y':df.MMA30,'type':'scatter','name':'MMA30'}],1, 1)
fig.append_trace({'x':df.Time,'y':df.Volume,'type':'bar','name':'Volume'}, 2, 1)

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

Любой способ получения многострочных графиков внутри одного из вспомогательных участков в модуле Dash.

Спасибо.

1 Ответ

0 голосов
/ 29 июня 2018

Вы можете установить это, указав правильный аргумент fig.append_trace().

В следующем примере я установил строки в 2 и изменил вызовы append_trace:

fig = tls.make_subplots(rows=2, cols=1, shared_xaxes=True,vertical_spacing=0.009,horizontal_spacing=0.009)
fig['layout']['margin'] = {'l': 30, 'r': 10, 'b': 50, 't': 25}

fig.append_trace({'x':df.Time,'y':df.Close,'type':'scatter','name':'Price'},1,1)
fig.append_trace({'x':df.Time,'y':df.MMA30,'type':'scatter','name':'MMA30'},1,1)
fig.append_trace({'x':df.Time,'y':df.Volume,'type':'bar','name':'Volume'},2,1)

Результатом является следующий график: enter image description here

...