Построение нескольких столбцов на линейном графике с использованием Dash / Plotly

#python #matplotlib #plotly #plotly-dash

#python #matplotlib #plotly #plotly-dash

Вопрос:

У меня есть таблица, которая выглядит следующим образом…

 ticker,price1y,price2y,price3y,price5y,
aapl,12,23,47,69,
tsla,-9,24,54,190,
att,-10,23,34,35,
  

Я хотел бы построить их с помощью pandas plotly в dash, чтобы показать price1y, price2y … price5y вдоль оси x и % изменить ось y. мне нужно иметь возможность выбирать несколько значений для добавления в график с помощью функции обратного вызова dash.

в настоящее время я создаю график dash_core_components, однако мне не удалось построить график для этого.

 app.layout = html.Div([
        html.Div([
                     dcc.Graph(
                        id='bar-graph'

                        )
            ], className='twelve columns')
  

Спасибо,

Ответ №1:

Вы можете использовать сгруппированную столбчатую диаграмму из plotly:

Выполните импорт:

 import plotly.plotly as py
import plotly.graph_objs as go
  

Пример фрейма данных:

 data = {
    'ticker': ['aapl', 'tsla', 'att'],
    'price1y': [12 ,-9 ,-10],
    'price2y': [23 ,24 ,23],
    'price3y': [47 ,54 ,34],
    'price5y': [69 ,190 ,35]
}
df = pd.DataFrame(data).set_index('ticker')
  

Выглядит так:

         price1y price2y price3y price5y
ticker              
aapl      12    23        47    69
tsla      -9    24        54    190
att      -10    23        34    35
  

Затем вы можете выполнять итерации по столбцам и динамически создавать данные для сгруппированной столбчатой диаграммы:

 res = []
for col in df.columns:
    res.append(
        go.Bar(
            x=df.index.values.tolist(),
            y=df[col].values.tolist(),
            name=col
        )
    )

layout = go.Layout(
    barmode='group'
)

fig = go.Figure(data=res, layout=layout)
py.iplot(fig, filename='grouped-bar')
  

Это приведет к:

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

Чтобы получить это в Dash, вам нужно будет вернуть указанное выше из обратного вызова.