ValueError: proyección desconocida ‘3d’

5 minutos de lectura

avatar de usuario de rectángulotangle
rectánguloenredo

Acabo de instalar matplotlib y estoy tratando de ejecutar uno de los scripts de ejemplo. Sin embargo, me encuentro con el error que se detalla a continuación. ¿Qué estoy haciendo mal?

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
cset = ax.contour(X, Y, Z, 16, extend3d=True)
ax.clabel(cset, fontsize=9, inline=1)

plt.show()

el error es

Traceback (most recent call last):
  File "<string>", line 245, in run_nodebug
  File "<module1>", line 5, in <module>
  File "C:\Python26\lib\site-packages\matplotlib\figure.py", line 945, in gca
    return self.add_subplot(111, **kwargs)
  File "C:\Python26\lib\site-packages\matplotlib\figure.py", line 677, in add_subplot
    projection_class = get_projection_class(projection)
  File "C:\Python26\lib\site-packages\matplotlib\projections\__init__.py", line 61, in get_projection_class
    raise ValueError("Unknown projection '%s'" % projection)
ValueError: Unknown projection '3d'

  • Echa un vistazo a este hilo: comentarios.gmane.org/gmane.comp.python.matplotlib.devel/8904

    – Manoj Govindan

    28 de septiembre de 2010 a las 8:20

  • Funciona perfectamente para mí. Windows XP, estado activo python 2.6.5 matplotlib 1.0.0.

    – joaquín

    28 de septiembre de 2010 a las 9:15

  • ¿Qué versión de python estás usando?

    –Charlie Parker

    5 sep 2017 a las 21:04

  • Usar from mpl_toolkits.mplot3d import Axes3D resolverá el problema

    – HmT

    28 de diciembre de 2021 a las 11:05

Avatar de usuario de Joe Kington
jose kington

En primer lugar, creo mplot3D funcionó un poco diferente en matplotlib versión 0.99 que en la versión actual de matplotlib.

¿Qué versión está utilizando? (Intente ejecutar: python -c 'import matplotlib; print matplotlib."__version__")

Supongo que estás ejecutando la versión 0.99en cuyo caso deberá usar una sintaxis ligeramente diferente o actualizar a una versión más reciente de matplotlib.

Si está ejecutando la versión 0.99intente hacer esto en lugar de usar el projection argumento de palabra clave:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d, Axes3D #<-- Note the capitalization! 
fig = plt.figure()

ax = Axes3D(fig) #<-- Note the difference from your original code...

X, Y, Z = axes3d.get_test_data(0.05)
cset = ax.contour(X, Y, Z, 16, extend3d=True)
ax.clabel(cset, fontsize=9, inline=1)
plt.show()

Esto debería funcionar en matplotlib 1.0.xtambién, no sólo 0.99.

  • @dashesy: ​​aún deberá importar las proyecciones en 3D: from mpl_toolkits.mplot3d import Axes3D. Después, debería funcionar.

    –Joe Kington

    24 de abril de 2013 a las 2:46

  • jaja, interesante! lo vi en los ejemplos pero supuse que es solo para versiones anteriores. Gracias

    – deslumbrante

    24 de abril de 2013 a las 2:49

  • el comando para la versión impresa de python 3 es python -c 'import matplotlib; print(matplotlib.__version__)'

    –Charlie Parker

    5 sep 2017 a las 21:06

  • ¿Qué pasa con la versión? 2.0.2?

    –Charlie Parker

    5 sep 2017 a las 21:06

  • Tengo este error para python 2.7, matplotlib.__version__ ‘2.2.3’ ….. PORQUE no estaba usando from mpl_toolkits.mplot3d import Axes3D… 🙂

    – NTG

    7 de enero de 2019 a las 16:49


Solo para agregar a la respuesta de Joe Kington (no hay suficiente reputación para un comentario), hay un buen ejemplo de mezclar tramas 2d y 3d en la documentación en http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html que muestra la proyección = ‘3d’ trabajando en combinación con la importación Axes3D.

from mpl_toolkits.mplot3d import Axes3D
...
ax = fig.add_subplot(2, 1, 1)
...
ax = fig.add_subplot(2, 1, 2, projection='3d')

De hecho, siempre que la importación de Axes3D esté presente, la línea

from mpl_toolkits.mplot3d import Axes3D
...
ax = fig.gca(projection='3d')

como lo usa el OP también funciona. (comprobado con matplotlib versión 1.3.1)

  • ¡Esto es realmente muy útil saberlo! Si bien la importación Axes3D nunca se usa explícitamente, permite que se use la proyección = ‘3d’ sin error

    – estufas

    3 de agosto de 2016 a las 14:04


  • La declaración de importación hizo que funcionara para mí. Pero no puedo evitar sentirme molesto al ejecutar este código… Usar una declaración de importación para iniciar un código que parece totalmente separado en la superficie parece un mal diseño

    – Ezbob

    18 de enero de 2017 a las 16:43


  • ax = fig.gca(projection='3d') funciona para mi En lugar de ax = plt.subplot(111,projection="3d"). Estoy usando la versión de 2.1.0

    – Juan

    13 de octubre de 2017 a las 2:16

  • @Ezbob, toda la API de matplotlib es solo un dolor en el culo. Siempre tengo que buscar en Google si quiero crear incluso una trama básica. Ninguna otra biblioteca de Python tiene una API tan mala

    – Simón Hessner

    15 de abril de 2019 a las 21:46

Importe mplot3d completo para usar “proyección = ‘3d'”.

Inserte el siguiente comando en la parte superior de su secuencia de comandos. Debería funcionar bien.

from mpl_toolkits import mplot3d

Me encuentro con el mismo problema, y ​​la respuesta de @Joe Kington y @bvanlew resuelve mi problema.

pero debería agregar más información cuando use pycharm y habilite auto import.

cuando formateas el código, el código from mpl_toolkits.mplot3d import Axes3D se eliminará automáticamente por pycharm.

Entonces, mi solución es

from mpl_toolkits.mplot3d import Axes3D
Axes3D = Axes3D  # pycharm auto import
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

y funciona bien!

Como se recomienda en otros comentarios, descubrí que importar “axes3d” resolvió el problema:

from mpl_toolkits.mplot3d import Axes3D

Parece que esto es necesario si se usa una versión anterior de matplotlib.pyplot

avatar de usuario de vvvvv
vvvvv

Prueba esto:

import matplotlib.pyplot as plt
import seaborn as sns
from mpl_toolkits.mplot3d import axes3d

fig=plt.figure(figsize=(16,12.5))
ax=fig.add_subplot(2,2,1,projection="3d")

a=ax.scatter(Dataframe['bedrooms'],Dataframe['bathrooms'],Dataframe['floors'])
plt.plot(a)

¿Ha sido útil esta solución?