python-3.x - 具有多个下拉输入不工作的 Plotly 破折号图

标签 python-3.x plotly-dash

我正在尝试创建一个具有多个交互式下拉用户输入变量的时间序列 Dash 折线图。理想情况下,我希望每个下拉输入都允许进行多项选择。

虽然我能够成功创建下拉菜单,但图表并没有像我想要的那样更新。当我允许下拉列表有多个选择时,我收到一个错误,指出数组长度不同。当我将下拉列表限制为一个选择时,我收到一个错误 [‘Vendor_Name’] 不在索引中。所以这可能是两个不同的问题。

不起作用的图表:



导入 DF 的 Excel 数据片段


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_objs as go 
df = pd.read_csv("Data.csv", sep = "\t")
df['YearMonth'] = pd.to_datetime(df['YearMonth'], format = '%Y-%m')
cols = ['Product_1', 'Product_2', 'Product_3']
vendor = df['Vendor'].unique()

app = dash.Dash('Data')

app.layout = html.Div([
    html.Div([
        html.Div([

            html.Label('Product'),
            dcc.Dropdown(
                 id = 'product',
                 options = [{
                         'label' : i, 
                         'value' : i
                 } for i in cols],
                multi = True,
                value = 'Product_1'

                 ),
                ]),

        html.Div([

            html.Label('Vendor'),
            dcc.Dropdown(
             id = 'vendor',
             options = [{
                     'label' : i, 
                     'value' : i
             } for i in vendor],
            multi = True,
             value = 'ABC')
             ,
        ]),
            ]),

    dcc.Graph(id = 'feature-graphic')
    ])


@app.callback(Output('feature-graphic', 'figure'),
    [Input('product', 'value'),
     Input('vendor', 'value')])


def update_graph(input_vendor, input_column):


    df_filtered = df[df['Vendor'] == input_vendor]

##also tried setting an index because of the error I was getting. Not sure if necessary
    df_filtered = df_filtered.set_index(['Vendor']) 

    traces = []

    df_by_col = df_filtered[[input_column, 'YearMonth']]

    traces.append({

        'x' :pd.Series(df_by_col['YearMonth']),
        'y' : df_by_col[input_column],
        'mode' : 'lines',
        'type' : 'scatter',
        'name' :'XYZ'}
        )

    fig = {
                    'data': traces,
                    'layout': {'title': 'Title of Chart'}
                    }
    return fig


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

提前感谢您的帮助!仍然是 Python 的新手,但对 Dash 的功能感到非常兴奋。我已经能够使用单个输入创建其他图形,并且已经阅读了文档。

最佳答案

这是我遵循的方法:(用我的方法编辑谷歌中可用的常见示例):

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

app = dash.Dash(__name__)

all_options = {
    'America': ['New York City', 'San Francisco', 'Cincinnati'],
    'Canada': [u'Montréal', 'Toronto', 'Ottawa']
}
app.layout = html.Div([
    dcc.Dropdown(
        id='countries-dropdown',
        options=[{'label': k, 'value': k} for k in all_options.keys()],
        value='America',  #default value to show
        multi=True,
        searchable=False
    ),

    dcc.Dropdown(id='cities-dropdown', multi=True, searchable=False, placeholder="Select a city"),

    html.Div(id='display-selected-values')
])

@app.callback(
    dash.dependencies.Output('cities-dropdown', 'options'),
    [dash.dependencies.Input('countries-dropdown', 'value')])
def set_cities_options(selected_country):
    if type(selected_country) == 'str':
        return [{'label': i, 'value': i} for i in all_options[selected_country]]
    else:
        return [{'label': i, 'value': i} for country in selected_country for i in all_options[country]]

if __name__ == '__main__':
    app.run_server(debug=True)
解决方法是:当父下拉列表中存在单个输入时,该值采用字符串格式。但是对于多个值,它采用列表格式。
即使您单击交叉选项以删除任何选定的选项,此代码也可以完美运行并自动更新。
注:我使用了 'placeholder' 属性而不是为它定义默认值,因为在这种情况下它没有意义。但是您也可以以类似的方式动态更新该值。

关于python-3.x - 具有多个下拉输入不工作的 Plotly 破折号图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53877525/

相关文章:

python - Python/Django 中多抽象模型继承中的字段菱形模式

python - 如何让 'print()' 、 'os.system()' 和 'subprocess.run()' 输出显示在控制台和日志文件中?

python-3.x - 如何使用 Flask-Login 保护 Flask-App 中的 Dash-Apps?

python - 如何从行中获取数据到元组中

python-3.x - Keras 中的值错误 : How could I get the model fitted?

python - Selenium Python Firefox webdriver : can't modify profile

python - Plotly Dash Table 仅在一侧应用边框半径

cytoscape.js - 用户移动节点后,如何在 Dash/Cytoscape 中找到节点的位置?

python-3.x - Python 破折号 : Hide a component with one event and make it visible with another created through a callback

plotly - 在 Plotly/Dash 下拉列表中添加 'Select All' 选项