簡體   English   中英

當下拉列表更改時,短划線分散 plot 不更新

[英]Dash scatter plot is not updating when the dropdown change

我嘗試使用 Plotly 編寫散點圖並通過 Dash 回調使其交互,問題是當我更改下拉列表時我的圖表沒有更新。 數據結構如下:

periodo Direccion fecha_rep revisados 錯誤 202002 Dir5 29/02/2020 16793 3 202001 Dir5 31/01/2020 18933 1 202101 Dir5 31/01/2021 6246 132 202001 Dir4 17/01/202

#Importar librerías
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objs as go
import pandas as pd

#Carga de datos
df_temp = pd.read_excel(r'D:\Python\Datos_maestros\periodo.xlsx')

app = dash.Dash()
fechas = []
for fecha in df_temp['periodo'].unique():
    fechas.append({'label': str(fecha), 'value': fecha})

#Definición del layout de la app a partir de componentes HTML y Core
app.layout = html.Div([
    dcc.Graph(id='graph_line'),
    dcc.Dropdown(id='selector_fecha', options = fechas, value = '') #Seleccionamos todo el rango de fechas de nuestro dataframe
])

# CREACIÓN DE GRÁFICOS E INTERACTIVIDAD
#Callback para actualizar gráfico en función del rango de fechas seleccionadas
@app.callback(Output('graph_linea', 'figure'),
              [Input('selector_fecha', 'value')])
def actualizar_graph(fecha):
    filtered_df = df_temp[df_temp['periodo'] == fecha]
    #Creación de 1 traza por cada ciudad de nuestro dataframe
    traces = []
    for nombre_area in filtered_df['Direccion'].unique():
        df_area = filtered_df[filtered_df['Direccion'] == nombre_area]
        traces.append(go.Scatter(
            x=df_area['revisados'],
            y=df_area['errores'],
            text=df_area['Direccion'],
            mode='markers',
            opacity=0.7,
            marker={'size': 15},
            name=nombre_area
        ))
    
        return { #Se retornan los objetos data y layout para ser enviados al Output con identificador graph_linea
            'data': traces,
            'layout': go.Layout(
                xaxis={'title': 'Fecha'},
                yaxis={'title': 'Errores'},
                hovermode='closest'
            )
        }


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

我知道這並不總是有效,但對於未來的問題,請嘗試將您的問題重構為可重現的示例。 意思是我們每個人都可以復制的一段代碼。 由於缺少 missing.xslx 文件,我們無法運行您的代碼,這使我們更容易為您提供幫助。

也就是說,我認為有兩個主要問題。 正如@coralvanda 已經提到的那樣,您的return語句在 for 循環內很奇怪。 我假設你應該把它拉出來,除非你打算在第一次迭代后停止循環。 其次,更新 plotly 圖涉及圖 object。 看看go.Figure() 首先添加圖形 object,然后添加所需的跡線。 固定代碼可能如下所示:

#Importar librerías
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objs as go
import pandas as pd

#Carga de datos
df_temp = pd.read_excel(r'D:\Python\Datos_maestros\periodo.xlsx')

app = dash.Dash()
fechas = []
for fecha in df_temp['periodo'].unique():
    fechas.append({'label': str(fecha), 'value': fecha})

#Definición del layout de la app a partir de componentes HTML y Core
app.layout = html.Div([
    dcc.Graph(id='graph_line'),
    dcc.Dropdown(id='selector_fecha', options = fechas, value = '') #Seleccionamos todo el rango de fechas de nuestro dataframe
])

# CREACIÓN DE GRÁFICOS E INTERACTIVIDAD
#Callback para actualizar gráfico en función del rango de fechas seleccionadas
@app.callback(Output('graph_linea', 'figure'),
              [Input('selector_fecha', 'value')])
def actualizar_graph(fecha):
    fig = go.Figure()
    
    filtered_df = df_temp[df_temp['periodo'] == fecha]
    #Creación de 1 traza por cada ciudad de nuestro dataframe
    traces = []
    for nombre_area in filtered_df['Direccion'].unique():
        df_area = filtered_df[filtered_df['Direccion'] == nombre_area]
        fig.add_trace(
            go.Scatter(
                x=df_area['revisados'],
                y=df_area['errores'],
                text=df_area['Direccion'],
                mode='markers',
                opacity=0.7,
                marker={'size': 15},
                name=nombre_area
            )
        )
    
    fig['layout'] = go.Layout(
        xaxis={'title': 'Fecha'},
        yaxis={'title': 'Errores'},
        hovermode='closest'
    )
    
    return fig


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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM