Dash集成ID选择与时间区间滑块绘图报错求助
问题解决步骤
1. 定位核心错误原因
- 函数名调用错误:回调中使用的
choose_patient未定义,实际你定义的ID筛选函数是choose_id,这导致df被赋值为错误类型(int),触发TypeError: 'int' object is not subscriptable。 - 回调输出不匹配:定义了两个输出目标,但原函数仅返回一个值,会引发回调逻辑错误。
- Dropdown无初始值:页面加载时
value为None,导致ID筛选返回空DataFrame,后续操作出错。
2. 修正方案与完整代码
import pandas as pd import numpy as np import random from dash import Dash, html, dcc, Input, Output import plotly.express as px # 生成数据集 df = pd.DataFrame({'DATE_TIME':pd.date_range('2022-11-01', '2022-11-05 23:00:00',freq='h'), 'SBP':[random.uniform(110, 160) for n in range(120)], 'DBP':[random.uniform(60, 100) for n in range(120)], 'ID':[random.randrange(1, 100) for n in range(120)], 'TIMEINTERVAL':[random.randrange(1, 200) for n in range(120)]}) df['VISIT'] = df['DATE_TIME'].dt.day df['MODE'] = np.select([df['VISIT']==1, df['VISIT'].isin([2,3])], ['CKD', 'Dialysis'], 'Late TPL') # ID筛选函数 def choose_id(dataframe_name, id_number): return dataframe_name[dataframe_name['ID']==id_number] # 初始化Dash应用 app = Dash(__name__) app.layout = html.Div([ html.H4('Interactive Scatter Plot with ABPM dataset'), dcc.Graph(id="scatter-plot"), html.P("Select Patient ID:"), # 设置Dropdown初始值为第一个ID,避免加载时value为None dcc.Dropdown(df.ID.unique(), id='pandas-dropdown-1', value=df.ID.unique()[0]), html.P("Filter by time interval:"), dcc.RangeSlider( id='range-slider', min=0, max=600, step=10, marks={0: '0', 50: '50', 100: '100', 150: '150', 200: '200', 250: '250', 300: '300', 350: '350', 400: '400', 450: '450', 500: '500', 550: '550', 600: '600'}, value=[0, 600] ), html.Div(id='dd-output-container') ]) @app.callback( Output("dd-output-container", "children"), Output("scatter-plot", "figure"), Input("pandas-dropdown-1", "value"), Input("range-slider", "value")) def update_scatter_plot(selected_id, slider_range): # 调用正确的ID筛选函数 patient_df = choose_id(df, selected_id) low, high = slider_range # 筛选时间间隔范围内的数据 mask = (patient_df['TIMEINTERVAL'] > low) & (patient_df['TIMEINTERVAL'] < high) filtered_df = patient_df[mask] # 处理空数据情况,避免绘图报错 if filtered_df.empty: return f"Selected ID: {selected_id} | No data in selected time interval", px.scatter() # 绘制散点图 fig = px.scatter( filtered_df, x="DATE_TIME", y=["SBP","DBP"], hover_data=['TIMEINTERVAL'], facet_col='VISIT', facet_col_wrap=2, symbol='MODE' ) fig.update_xaxes(matches=None, showticklabels=True) # 返回两个输出值,匹配回调定义的Output数量 return f"Selected ID: {selected_id}", fig if __name__ == '__main__': app.run_server(debug=True)
内容的提问来源于stack exchange,提问作者dspractician
相关产品推荐
相关产品推荐

