多变量回归3D拟合线绘制报错求助:Line3D无_verts3d属性
解决多变量回归3D拟合线绘制报错问题
我来帮你拆解这两个错误的根源,其实都是代码里的小细节没注意到——一个是笔误,另一个是数据维度不匹配导致的,一步步来解决:
错误原因分析
1. 隐藏的变量名笔误
你代码里先定义了z_cord和z_cod,但后面合并的时候却写了s = y_cord.add(y_cod, fill_value=0)——这里的y_cord和y_cod根本没定义!虽然你说注释掉plot3D后散点图能正常显示,可能是你实际运行时的笔误,但这是第一个要修正的点,必须把y_cord和y_cod改成z_cord和z_cod,否则会触发NameError。
2. plot3D的输入数据维度不匹配(核心错误)
ax.plot3D()要求输入的x、y、z必须是一维数组(比如pandas Series或者numpy一维数组),但你用train_engine[['ENGINESIZE']]这种双括号写法返回的是二维DataFrame,这就直接触发了ValueError: input operand has more dimensions than allowed by the axis remapping;而这个维度错误又导致生成的Line3D对象不符合库的预期,进而引发后续的AttributeError: 'Line3D' object has no attribute '_verts3d'。
修正后的完整代码
我还帮你简化了z值的计算(去掉低效的循环,改用pandas向量运算),同时修正了数据维度问题:
# 简化并修正z值的计算:直接用向量运算,避免循环 z = regr.coef_[0][0] * train_engine['ENGINESIZE'] + regr.coef_[0][1] * train_engine['FUELCONSUMPTION_CITY'] + regr.intercept_ fig = plt.figure() ax = fig.gca(projection='3d') # 散点图:改用单括号取Series(一维),更规范 ax.scatter(data['ENGINESIZE'], data['FUELCONSUMPTION_CITY'], co2_data) # plot3D用一维数据:单括号取Series即可 x = train_engine['ENGINESIZE'] y = train_engine['FUELCONSUMPTION_CITY'] ax.plot3D(x, y, z, color='red') plt.show()
额外小技巧
如果你习惯用双括号取DataFrame,也可以用.values.ravel()或者.squeeze()把二维数据转成一维,比如:
x = train_engine[['ENGINESIZE']].values.ravel()
内容的提问来源于stack exchange,提问作者Lord Cinders
相关产品推荐
相关产品推荐

