循环遍历列表创建Plotly折线图报ValueError问题排查
问题根因
这个报错是px.line()入参规则不匹配导致的:
当你给Plotly Express的绘图函数传入第一个参数为pandas数据对象(你的代码里是分组聚合得到的df_avg Series)时,x和y参数默认只接受对应数据的列名字符串,不接受直接传入完整的Series/数组对象。你当前代码同时传入了df_avg作为数据源,又直接把df_avg.index.to_timestamp()、df_avg两个完整序列作为x、y传入,Plotly会将其识别为多列引用列表,触发参数冲突报错。
另外你的循环逻辑还有一个隐藏bug:循环内筛选数据时写的是df2 = df2[df2.StationName== i],第一次循环执行完后df2就只剩第一个站点的子集,后续循环会拿不到其他站点的数据,最终得到空的聚合结果。
修复方法
修改两处逻辑即可:
- 修正循环筛选逻辑:用原始全量数据表
df做单站点筛选,不要覆写遍历过程中用到的数据集,避免后续循环数据丢失 - 调整绘图传参方式:要么把聚合结果转成标准DataFrame后传列名给x、y,要么直接省略第一个数据源参数,只传x、y的序列值。
参考修复代码:
area_name = pd.unique(df["StationName"]) for i in area_name: print("Data for {} area".format(i)) # 从原始全量数据筛选单站点数据,避免覆写数据集 df_station = df[df.StationName == i] # 分组聚合后重置索引,转为标准DataFrame df_avg = df_station.groupby("month_year", as_index=False)['Price'].mean() # 转换时间格式 df_avg["month_year"] = df_avg["month_year"].dt.to_timestamp() # 传列名作为x、y参数 fig = px.line( df_avg, x="month_year", y="Price", labels={"month_year": "Period (Month/Year)", "Price": "Price (£)"}, title='Average House Price in {0}'.format(i) ) fig.show()
如果不想把聚合结果转成DataFrame,也可以直接去掉px.line()的第一个数据源参数,直接传入序列值:
fig = px.line( x = df_avg.index.to_timestamp(), y = df_avg.values, labels=dict(x="Period (Month/Year)", y="Price (£)"), title='Average House Price in {0}'.format(i) )
这种写法下Plotly不会按列名规则解析参数,也不会触发该报错。
内容的提问来源于stack exchange,提问作者tim2022
相关产品推荐
相关产品推荐

