2010-09-28 13 views
65

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?Matplotlib: "Error de proyección desconocida '3d'"

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' 
+2

Eche un vistazo a este hilo: http://comments.gmane.org/gmane.comp.python.matplotlib.devel/8904 –

+0

Funciona perfectamente para mí. Windows XP, Active state python 2.6.5 matplotlib 1.0.0. – joaquin

+0

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

Respuesta

71

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

¿Qué versión estás usando? (Intente 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 se está utilizando la versión 0.99, intente hacer esto en lugar de utilizar el argumento projection 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 1.0.x matplotlib, así, no sólo 0,99.

+0

Estoy ejecutando la versión 0.99.3. Probé tu script pero me sigue diciendo que axes3d no está definido. – rectangletangle

+0

@Anteater - Lo siento, no me di cuenta de que estaba usando los datos de prueba de 'axes3d'. Debería arreglarse ahora ... ¡Eso me enseñará a poner código sin intentar ejecutarlo! –

+0

Acabo de probar funciona muy bien, gracias por la actualización! – rectangletangle

31

Solo para añadir a la respuesta de Joe Kington (no hay suficiente reputación para un comentario) hay un buen ejemplo de mezcla de gráficos 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 de 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 Axes3D está presente la línea

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

tal como se utiliza por el OP también funciona. (comprobado con matplotlib versión 1.3.1)

+3

¡Esto es realmente útil para saber! Si bien la importación de Axes3D nunca se usa explícitamente, permite que se use projection = '3d' sin error – stoves

+2

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

+1

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

Cuestiones relacionadas