Dash Plotly图表更新回调报TypeError: int类型对象无len()方法
错误触发原因
报错TypeError: object of type 'int' has no len()的直接触发点是回调函数首行的if len(selected_std_dev) == 0:判断逻辑。dcc.RadioItems是单选组件,选中后返回的是单个标量值(你配置的可选值是1.0、2.0、3.0三个浮点数,默认值为2.0),浮点数、整数这类数值类型没有长度属性,对其调用len()方法会直接抛出类型错误。页面初始加载时回调就会接收到默认值2.0,所以首屏就会触发报错,空图表就是回调执行失败导致的。
代码中存在的其他问题
除了直接触发报错的len判断错误,你的代码还有两处会导致运行失败的问题:
- 无效的阈值赋值逻辑:
max_deviations = [(RadioItems(value) == selected_std_dev)]是完全错误的写法,你不需要实例化RadioItems组件,这里要的阈值就是回调传入的selected_std_dev参数本身,这行代码生成的是装了布尔值的单元素列表,后续做数值运算时会触发类型错误。 - 回调无合法返回值:你贴出的代码只做了数据过滤,最终没有构造符合Plotly规范的figure对象返回,就算前面的逻辑跑通,图表也无法正常渲染。
修复方案
- 移除错误的
len()判断,单选组件的返回值是单个数值,只需要判断是否为None即可,不需要判断长度。 - 删除无效的RadioItems实例化代码,直接使用传入的
selected_std_dev作为标准差过滤阈值。 - 补全Plotly散点图的构造逻辑,在回调末尾返回合法的figure对象。
修复后的可运行参考代码:
import dash from dash import dcc, html, Input, Output import plotly.express as px import pandas as pd import numpy as np # 替换为你自己的数据源 # df = pd.read_csv("your_dataset.csv") app = dash.Dash(__name__) app.layout = html.Div([ html.Div(id='radio_output'), dcc.RadioItems( id='radio_dropdown', options=[{'label': f'{i}倍标准差', 'value': i} for i in [1.0, 2.0, 3.0]], value=2.0 ), html.Div([ dcc.Graph(id="the_graph") ]) ]) @app.callback( Output("the_graph", "figure"), Input("radio_dropdown", 'value') ) def update_graph(selected_std_dev): if selected_std_dev is None: return dash.no_update # 计算阈值过滤离群点 dff = df.copy() y_vals = dff.CHANGE mean_val = np.mean(y_vals) std_val = np.std(y_vals) keep_mask = abs(y_vals - mean_val) < selected_std_dev * std_val dff_filtered = dff[keep_mask] # 构造散点图返回 fig = px.scatter( dff_filtered, x='TIME', y='CHANGE', title=f'{selected_std_dev}倍标准差过滤后数据分布' ) return fig if __name__ == '__main__': app.run_server(debug=True)
内容的提问来源于stack exchange,提问作者Colin Clark
相关产品推荐
相关产品推荐

