AttributeError: 'Line3D' objeto no tiene atributo '_verts3d '
He estado tratando de dibujar una línea de regresión para una regresión multivariable, ambos ENGINESIZE
y FUELCONSUMPTION_CITY
son variables independientes y CO2EMISSION
es la variable dependiente.
Estaba tratando de dibujar una línea de regresión pero no importa qué, no soy capaz de dibujar como sigue mostrándome el mismo error.
A continuación mi código:-
z_cord = regr.coef_[0][0]*train_engine[['ENGINESIZE']]
z_cod = regr.coef_[0][1]*train_engine[['FUELCONSUMPTION_CITY']]
s = y_cord.add(y_cod, fill_value=0)
l = []
for index, row in s.iterrows():
l.append(row['ENGINESIZE']+row['FUELCONSUMPTION_CITY'] + regr.intercept_)
z = pd.DataFrame(l,columns=['CO2EMISSION'])
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.scatter(data[['ENGINESIZE']],data[['FUELCONSUMPTION_CITY']],co2_data)
x = train_engine[['ENGINESIZE']]
y = train_engine[['FUELCONSUMPTION_CITY']]
ax.plot3D(x,y,z,color='red')
plt.show()
Cada vez que lo ejecuto me da estos errores
ValueError: input operand has more dimensions than allowed by the axis remapping
AttributeError: 'Line3D' object has no attribute '_verts3d'
la trama de dispersión se dibuja cuando yo comentario ax.plot3D(x,y,z,color='red')
línea.
No sé adónde voy mal, algo de ayuda sería apreciado.
Pregunta hecha hace 3 años, 4 meses, 27 días - Por syntaxsniper
3 Respuestas:
-
En su código,
x
yy
son bidimensionales. Sin embargo,ax.plot3D
Requisitosx
yy
para ser una dimensión y usted puede hacer que una dimensión por:x = train_engine['ENGINESIZE'] y = train_engine['FUELCONSUMPTION_CITY']
Tenga en cuenta que podemos conseguir el número de dimensiones
x
yy
porndim
:x.ndim, y.ndim
Respondida el Dec 18, 2020 a las 21:00 - por logicloom
Votos positivos: 0 | Votos negativos: 0 -
El error
ValueError: input operand has more dimensions than allowed by the axis remapping
probablemente está relacionado con la forma en que estás pasando los datos a la funciónplot3D
.Por otro lado, el error
AttributeError: 'Line3D' object has no attribute '_verts3d'
parece estar relacionado con el métodoplot3D
, el cual no recibe correctamente los datos de las variablestrain_engine[['ENGINESIZE']]
,train_engine[['FUELCONSUMPTION_CITY']]
ypd.DataFrame(l,columns=['CO2EMISSION'])
.Parece que estás intentando graficar una línea en un espacio 3D utilizando datos que no tienen la misma dimensión. Asegúrate de que
x
,y
, yz
tengan la misma cantidad de puntos para poder graficar la línea correctamente en 3D.Una solución sería asegurarte de que
x
,y
, yz
tengan la misma forma y dimensiones antes de pasarlos a la funciónplot3D
.Además, ten en cuenta que al pasar
x
yy
a la funciónplot3D
, es posible que necesites convertirlos de DataFrames a arrays de numpy con el métodovalues
.A continuación te muestro un ejemplo de cómo podrías corregir tu código:
python fig = plt.figure() ax = fig.gca(projection='3d') ax.scatter(data['ENGINESIZE'], data['FUELCONSUMPTION_CITY'], co2_data) x = train_engine['ENGINESIZE'].values y = train_engine['FUELCONSUMPTION_CITY'].values z = np.array(l).flatten() ax.plot3D(x, y, z, color='red') plt.show()
Con estas modificaciones, deberías poder graficar la línea de regresión en 3D correctamente. ¡Espero que esto te sea de ayuda!
Respondida el Dec 19, 2020 a las 21:00 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error
AttributeError: 'Line3D' object has no attribute '_verts3d'
indica que estás intentando acceder a un atributo que no existe para un objetoLine3D
. Esto generalmente ocurre cuando intentas interactuar con un objeto de trama que aún no se ha creado.Para solucionar este problema, asegúrate de que la línea
ax.plot3D(x,y,z,color='red')
se ejecute después de que se haya creado el objetoLine3D
.Además, el error
ValueError: input operand has more dimensions than allowed by the axis remapping
sugiere que estás intentando trazar datos con más dimensiones de las que permite el tipo de trama. En este caso, estás intentando trazar datos tridimensionales en una trama 2D.Para solucionar este problema, puedes utilizar la proyección 3D de Matplotlib especificando
projection='3d'
al crear la figura. Esto permitirá trazar datos tridimensionales correctamente.Aquí tienes el código corregido:
import matplotlib.pyplot as plt import pandas as pd from sklearn.linear_model import LinearRegression
Cargar datos
data = pd.read_csv('auto-mpg.csv') train_engine = data[['ENGINESIZE', 'FUELCONSUMPTION_CITY', 'CO2EMISSION']]Ajustar modelo de regresión
regr = LinearRegression() regr.fit(train_engine[['ENGINESIZE', 'FUELCONSUMPTION_CITY']], train_engine['CO2EMISSION'])Calcular coordenadas z para la línea de regresión
z_cord = regr.coef_[0][0]train_engine[['ENGINESIZE']] z_cod = regr.coef_[0][1]train_engine[['FUELCONSUMPTION_CITY']] s = z_cord.add(z_cod, fill_value=0) l = [] for index, row in s.iterrows(): l.append(row['ENGINESIZE']+row['FUELCONSUMPTION_CITY'] + regr.intercept_) z = pd.DataFrame(l,columns=['CO2EMISSION'])Crear figura y ejes 3D
fig = plt.figure() ax = fig.gca(projection='3d')Dibujar trama de dispersión
ax.scatter(data[['ENGINESIZE']],data[['FUELCONSUMPTION_CITY']],co2_data)Dibujar línea de regresión
x = train_engine[['ENGINESIZE']] y = train_engine[['FUELCONSUMPTION_CITY']] ax.plot3D(x,y,z,color='red') plt.show()Respondida el Dec 19, 2020 a las 21:12 - por Gemini
Votos positivos: 0 | Votos negativos: 0