下拉列表更改时,破折号散点图未更新
Dash scatter plot is not updating when the dropdown change
我正在尝试使用 Plotly 编写散点图并通过 Dash 回调使其具有交互性,问题是当我更改下拉列表时我的图表没有更新。数据结构如下:
periodo Direccion fecha_rep revisados errores
202002 Dir5 29/02/2020 16793 3
202001 Dir5 2020 年 1 月 31 日 18933 1
202101 Dir5 2021/01/31 6246 132
202001 Dir4 17/01/2020 13 1
#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)
我知道这并不总是有效,但对于以后的问题,请尝试将您的问题重构为可重现的示例。意思是我们每个人都可以复制的一段代码。这让我们更容易帮助您,因为我们无法 运行 您的代码,因为缺少 .xslx 文件。
也就是说,我认为主要有两个问题。正如@coralvanda 已经提到的,您的 return
语句在 for 循环内很奇怪。我假设你应该把它拉出来,除非你打算在第一次迭代后停止循环。其次,更新绘图涉及图形对象。看看 go.Figure()。首先添加图形对象,然后添加所需的轨迹。固定代码可能如下所示:
#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)
我正在尝试使用 Plotly 编写散点图并通过 Dash 回调使其具有交互性,问题是当我更改下拉列表时我的图表没有更新。数据结构如下:
periodo Direccion fecha_rep revisados errores 202002 Dir5 29/02/2020 16793 3 202001 Dir5 2020 年 1 月 31 日 18933 1 202101 Dir5 2021/01/31 6246 132 202001 Dir4 17/01/2020 13 1
#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)
我知道这并不总是有效,但对于以后的问题,请尝试将您的问题重构为可重现的示例。意思是我们每个人都可以复制的一段代码。这让我们更容易帮助您,因为我们无法 运行 您的代码,因为缺少 .xslx 文件。
也就是说,我认为主要有两个问题。正如@coralvanda 已经提到的,您的 return
语句在 for 循环内很奇怪。我假设你应该把它拉出来,除非你打算在第一次迭代后停止循环。其次,更新绘图涉及图形对象。看看 go.Figure()。首先添加图形对象,然后添加所需的轨迹。固定代码可能如下所示:
#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)