Создать график da sh с несколькими выпадающими меню - PullRequest
0 голосов
/ 20 января 2020

У меня есть следующий CSV-файл с 4 различными серверами и двумя переменными: загрузка процессора и использование памяти.

Server,Time_floor,variable,Value
A,0,CPU Usage,0.4544871794871793
A,0,Memory Usage,0.49389743589743573
A,1,CPU Usage,0.4865365853658536
A,1,Memory Usage,0.4246829268292683
A,2,CPU Usage,0.5371627906976744
A,2,Memory Usage,0.43420930232558136
A,3,CPU Usage,0.5200689655172416
A,3,Memory Usage,0.4970344827586206
B,0,CPU Usage,0.5252307692307693
B,0,Memory Usage,0.4178461538461538
B,1,CPU Usage,0.4401428571428571
B,1,Memory Usage,0.41678571428571426
B,2,CPU Usage,0.5404285714285715
B,2,Memory Usage,0.3617857142857143
B,3,CPU Usage,0.5288999999999999
B,3,Memory Usage,0.5067999999999999

Я хотел бы иметь приложение da sh с выпадающим меню, которое для каждого сервера позволяет мне выбрать, какую переменную я хочу построить. График будет иметь time_floor в качестве оси x и значение переменной на его оси y.

У меня есть скрипт python, который приводит к следующему приложению da sh, где раскрывающееся меню переменной зависит от выпадающий список сервера:

Dash ouput Код следующий:

import dash
import pandas as pd
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

df = pd.read_csv('Manual_Log_Filtered.csv')
print(df.columns)

servers = df['Server'].unique()
print(servers)

metrics = df['variable'].unique()
print(metrics)

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
    dcc.RadioItems(
        id='servers-radio',
        options=[{'label': k, 'value': k} for k in servers],
        value='A'
    ),

    html.Hr(),

    dcc.RadioItems(id='metrics-radio'),

    html.Hr(),

    html.Div(id='display-selected-values'),
    dcc.Graph(id='indicator-graphic')
])


@app.callback(
    Output('metrics-radio', 'options'),
    [Input('servers-radio', 'value')])
def set_metrics_options(selected_country):
    return [{'label': i, 'value': i} for i in metrics]


@app.callback(
    Output('metrics-radio', 'value'),
    [Input('metrics-radio', 'options')])
def set_metrics_value(available_options):
    print(available_options[0]['value'])
    return available_options[0]['value']

@app.callback(
    Output('indicator-graphic', 'figure'),
    [Input('metrics-radio',  'value')])
def update_graph(metrics,
                 year_value):
    dff = df[df['Time_floor'] == year_value]
    print(dff)

    return {
        'data': [dict(
            x=dff[dff['Time_floor'] == year_value],
            y=dff[dff['variable'] == metrics["Value"]],
            mode='markers',
            marker={
                'size': 15,
                'opacity': 0.5,
                'line': {'width': 0.5, 'color': 'white'}
            }
        )],
        'layout': dict(
            xaxis={
                'title': year_value
            },
            yaxis={
                'title': metrics
            },
            margin={'l': 40, 'b': 40, 't': 10, 'r': 0},
            hovermode='closest'
        )
    }



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

То, что я хотел бы видеть в выводе графика, выглядит примерно так (игнорировать красные точки): Expected ouput

Любая помощь будет принята с благодарностью.

Спасибо!

1 Ответ

0 голосов
/ 26 января 2020

Вы неверно обращаетесь к своим данным.
Используя pandas, вы получаете доступ к данным следующим образом:

x=dff['Time_floor']
y=dff[dff['variable'] == metrics]["Value"]

Кроме того, если вы фильтруете переменную Time_floor вы просто получите одно значение.
Чтобы разрешить временную диаграмму, было бы лучше иметь несколько значений.

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

mode='lines+markers'

Вам также следует взглянуть на функцию update_graph.
Похоже, переменная year_value отсутствует.

...