Python - /当我更改 Multi = True/Dash Components 和 Plotly Graphs 时,图表和下拉菜单之间的连接丢失

Python - /Connections lost between graph and dropdown when i change Multi = True/Dash Components and Plotly Graphs

希望你一切都好!。我是 Python、dash 和 Plotly 的新手,我很难理解为什么我无法将下拉栏与其连接的图表同步。

当 Multi 默认时,图形网页工作正常,但是当我更改选项时它停止工作。

如果您能够更正代码并提供一些说明为什么我的代码不起作用,我们将不胜感激。

一些叙述:在我上传的 excel sheet 中有关于所有州的信息,但是我只对这个例子中的 5 个州感兴趣,因此字典包含 5 个州

dff = dff[dff["状态"] == option_selected]

此处的变量状态存在于excelsheet中,正在导入数据框中。

我也在使用 covidtracking.com

this data set

提前致谢!

import pandas as pd
import plotly.express as px  
import plotly.graph_objects as go
from dash import Dash, dcc, html, Input, Output  


app = Dash(__name__)

# -- Import and clean data (importing csv into pandas)

df = pd.read_csv("all-states-history.csv")

# ------------------------------------------------------------------------------
# App layout
app.layout = html.Div([

    html.H1("CV deaths by state", style={'text-align': 'center'}),

    dcc.Dropdown(id="slct_year",
                 options=[
                      {'label':'AZ','value': 'AZ'},
                      {'label':'CA','value': 'CA'},
                      {'label':'NY','value': 'NY'},
                      {'label':'FL','value': 'FL'},
                      {'label':'MA','value': 'MA'}],
                 multi=True,
                 #value=2015,
                 style={'width': "40%"}
                 ),

    html.Div(id='output_container', children=[]),
    html.Br(),

    dcc.Graph(id='my_map', figure={})

])


# ------------------------------------------------------------------------------
# Connect the Plotly graphs with Dash Components
@app.callback(
    [Output(component_id='output_container', component_property='children'),
     Output(component_id='my_map', component_property='figure')],
    [Input(component_id='slct_year', component_property='value')]
)
def update_graph(option_selected):
    print(option_selected)
    print(type(option_selected))

    container = "The state chosen by user was: {}".format(option_selected)

    dff = df.copy()
    dff = dff[dff["state"] == option_selected]


    # Plotly Express
    fig = px.choropleth(
        data_frame=dff,
        locationmode='USA-states',
        locations='state',
        scope="usa",
        color='state',
        hover_data=['state'],
        color_continuous_scale=px.colors.sequential.YlOrRd,
        
        template='plotly_dark'
    )


    return (container, fig)


# ------------------------------------------------------------------------------
if __name__ == '__main__':
    # For Development only, otherwise use gunicorn or uwsgi to launch, e.g.
    # gunicorn -b 0.0.0.0:8050 index:app.server
    app.run_server(
        port=8050,
        host='0.0.0.0'
    )

我认为您会 运行 遇到两个问题:第一个是一旦用户 select 来自下拉列表,option_selected 的类型将是 'list' 和根据元素是否在列表中切片 DataFrame 的语法是使用 .isin.

另一个问题是,当 dash 应用程序初始化时,option_selected 将是 NoneType,因为用户尚未从下拉菜单中 select。您可以包含一个条件来检查:

if option_selected is not None:
    dff = dff[dff["state"].isin(option_selected)]

然后是 dash 应用程序 运行s,您可以 select 5 个州。