Почему моя фигура plotly-da sh не отображает график с выбором из нескольких раскрывающихся списков? - PullRequest
0 голосов
/ 26 мая 2020

Я строю простую python приборную панель, используя da sh и плотно. Я также новичок в python (что, вероятно, очевидно!), И я рад любым / всем исправлениям. Я хотел бы построить временной ряд данных из заранее определенного файла CSV. Я добавил раскрывающееся поле выбора, с помощью которого я хотел бы отображать несколько разных столбцов.

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

"TOA5","HE605_RV50_GAF","CR6","7225","CR6.Std.07","CPU:BiSP5_GAF_v2d.CR6","51755","SensorStats"
"TIMESTAMP","RECORD","BattV_Min","BattV_Avg","PTemp_C_Avg","SensorRel_Min(1)","SensorRel_Min(2)","SensorRel_Min(3)","SensorRel_Min(4)","SensorRel_Min(5)","SensorRel_Max(1)","SensorRel_Max(2)","SensorRel_Max(3)","SensorRel_Max(4)","SensorRel_Max(5)"
"TS","RN","Volts","Volts","Deg C","","","","","","","","","",""
"","","Min","Avg","Avg","Min","Min","Min","Min","Min","Max","Max","Max","Max","Max"
"2019-09-30 11:15:00",0,12.68219,12.74209,"NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN"
"2019-09-30 11:30:00",1,12.68466,12.73777,31.26331,-2.498894,-2.38887,-8.497528,-2.963989,-20.42339,41.51585,28.41309,88.98283,27.27819,17.98986
"2019-09-30 11:45:00",2,12.69364,12.74584,31.43891,-3.490456,-2.856804,-8.770081,-3.879868,-22.69171,42.27676,30.53723,89.47752,34.25191,23.92586
"2019-09-30 12:00:00",3,12.69078,12.74522,31.38461,-3.290047,-2.973389,-8.69928,-3.295074,-21.88254,42.72508,29.91062,83.36012,27.9931,22.6571
"2019-09-30 12:15:00",4,12.6914,12.74376,31.2449,-2.899231,-2.392128,-10.01413,-2.996033,-23.22171,42.97162,29.20943,106.1204,35.93995,41.74426

Мой python (3.7) код для этого :

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

import pandas as pd
import plotly.graph_objects as go

# Load external stylesheets
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

# Load external datasets
df = pd.read_csv('../SampleData/test_data.dat', skiprows=3, na_values='NAN')
df.columns=["TIMESTAMP","RECORD","BattV_Min","BattV_Avg","PTemp_C_Avg","SensorRel_Min(1)","SensorRel_Min(2)","SensorRel_Min(3)","SensorRel_Min(4)","SensorRel_Min(5)","SensorRel_Max(1)","SensorRel_Max(2)","SensorRel_Max(3)","SensorRel_Max(4)","SensorRel_Max(5)"]

# define dropdown options
opts=[{'label': k, 'value': k} for k in list(df.columns.values)[1:]]


# create plotly figures
fig2=go.Figure()

# Create a Dash layout
app.layout = html.Div(children=[
    html.H1(children='Testing dashboard v01'),

    html.Div(children='''
        Select variable to plot below.
    '''),

    html.Div(children='''
        Select variables to add to plot below.
    '''),

    dcc.Dropdown(
        id='multiVariableDropdown',
        options=opts,
        value='RECORD',
        multi=True
    ),

    dcc.Graph(
        id='plot2'
    )  
])

# Add callback functions
## For plot 2
@app.callback(Output('plot2', 'figure'),
             [Input('multiVariableDropdown', 'value')])
def update_graph(selectedVariable2):
    trace_finalPlot2 = go.Scatter(
                            x=df['TIMESTAMP'], 
                            y=df[selectedVariable2], 
                            name=str(selectedVariable2))
    fig2 = go.Figure(data=trace_finalPlot2)
    return fig2


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

Первоначальный рендеринг графика выглядит хорошо, так как он появляется после запуска python3 app.py:

Initial plot

Но как только я добавляю еще один столбец для построения из раскрывающегося списка с множественным выбором, исходные данные исчезают, и отображается только одна точка:

After adding another column of data

К сожалению, он не возвращает никаких данных об ошибках, поэтому у меня проблемы с отладкой. Любые подсказки / подсказки приветствуются.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Проблема в том, что раскрывающийся список возвращает список из нескольких переменных (как вы установили multi=True), в то время как ваш обратный вызов предназначен для построения только одной переменной.

Чтобы построить несколько переменных, вам необходимо пройти по выбранному списку переменных (то есть через selectedVariable2 в вашем коде) и добавить соответствующие следы к рисунку.

Вы также должны убедиться, что раскрывающийся список инициализирован списком, а не строкой (т.е. вы должны заменить value="RECORD" на value=["RECORD"].

Я привел пример ниже.

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

# Load external stylesheets
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

# Create a sample dataset
df = pd.DataFrame({"TIMESTAMP": ["2019-09-30 11:15:00", "2019-09-30 11:30:00", "2019-09-30 11:45:00", "2019-09-30 12:00:00", "2019-09-30 12:15:00"],
                   "RECORD": [0, 1, 2, 3, 4],
                   "SensorRel_Min(2)": [12.68219, 12.68466, 12.69364, 12.69078, 12.6914],
                   "SensorRel_Min(3)": [14.74209, 13.73777, 10.74584, 9.74522, 16.74376]})

# Define dropdown options
opts = [{'label': k, 'value': k} for k in list(df.columns.values)[1:]]

# Create a Dash layout
app.layout = html.Div(children=[

    html.H1(children='Testing dashboard v01'),

    html.Div(children='''
        Select variable to plot below.
    '''),

    html.Div(children='''
        Select variables to add to plot below.
    '''),

    dcc.Dropdown(
        id='multiVariableDropdown',
        options=opts,
        value=['RECORD'],
        multi=True
    ),

    dcc.Graph(
        id='plot2'
    )

])

# Add callback functions
## For plot 2
@app.callback(Output('plot2', 'figure'),
             [Input('multiVariableDropdown', 'value')])
def update_graph(selectedVariable2):

    traces = []

    for var in selectedVariable2:

        traces.append(go.Scatter(x=df['TIMESTAMP'],
                                 y=df[var],
                                 name=var))

    fig2 = go.Figure(data=traces)

    return fig2

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

enter image description here

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

Попробуйте отладить его, используя print () . Примерно так, как показано ниже, таким образом, вы можете видеть, что отправляется компоненту вывода каждый раз, когда вы добавляете / удаляете что-то из раскрывающегося списка. Надеюсь, это поможет!

def update_graph(selectedVariable2):
    trace_finalPlot2 = go.Scatter(
                            x=df['TIMESTAMP'],
                            y=df[selectedVariable2],
                            name=str(selectedVariable2))
    fig2 = go.Figure(data=trace_finalPlot2)
    print(df[selectedVariable2])
    return fig2
...