You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:20:37