Matplotlib: error de "proyección desconocida '3d'"


130

Acabo de instalar matplotlib y estoy tratando de ejecutar uno de sus scripts de ejemplo. Sin embargo, me encuentro con el error detallado 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'


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

¿Qué versión de Python estás usando?
Charlie Parker

Respuestas:


114

En primer lugar, creo que mplot3Dtrabajó un poco diferente en matplotlibla versión 0.99que lo hace en la versión actual de matplotlib.

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

Supongo que está ejecutando la versión 0.99, en 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.99, intente hacerlo en lugar de usar el projectionargumento de la 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 matplotlib 1.0.xtambién, no solo 0.99.


47
@dashesy - Usted todavía tendrá que importar las proyecciones en 3D: from mpl_toolkits.mplot3d import Axes3D. Luego, debería funcionar.
Joe Kington el

2
aha, interesante! Lo vi en los ejemplos, pero supuse que es solo para versiones anteriores. Gracias
guiones

2
El comando para la versión impresa de Python 3 espython -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker, el

2
¿Qué hay de la versión 2.0.2?
Charlie Parker

1
Tengo este error para python 2.7, matplotlib .__ version__ '2.2.3' ..... PORQUE no estaba usando from mpl_toolkits.mplot3d import Axes3D... :)
ntg

64

Solo para agregar a la respuesta de Joe Kington (no hay suficiente reputación para un comentario) hay un buen ejemplo de la mezcla de gráficos en 2D y 3D en la documentación en http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html que muestra 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, mientras la importación 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. (marcado con matplotlib versión 1.3.1)


44
¡Esto es realmente útil saberlo! Si bien la importación Axes3D nunca se usa explícitamente, permite que la proyección = '3d' se use sin error
estufas del

3
La declaración de importación lo hizo funcionar para mí. Pero no puedo evitar sentirme mal ejecutando este código ... Usar una declaración de importación para arrancar un código que se ve totalmente separado en la superficie parece un mal diseño
Ezbob

2
ax = fig.gca(projection='3d')funciona para mi En lugar de ax = plt.subplot(111,projection="3d"). Estoy usando la versión de2.1.0
Johnny Zhang el

2
@Ezbob toda la API de matplotlib es solo un fastidio. Siempre tengo que buscar en Google si quiero crear incluso una trama básica. Ninguna otra lib de Python tiene una API tan mala
Simon H

13

Importe mplot3d entero para usar "proyección = '3d'".

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

desde mpl_toolkits import mplot3d

4

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 usas pycharm y habilitas auto import.

cuando formatea el código, el código from mpl_toolkits.mplot3d import Axes3Dse eliminará automáticamente mediante 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!


También puede poner # noinspection PyUnresolvedReferencesantes de la importación.
Michael Bikovitsky

0

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.