web-dev-qa-db-fra.com

Matplotlib: erreur "projection inconnue '3d'"

Je viens d’installer Matplotlib et j’essaie d’exécuter l’un des exemples de scripts. Cependant, je rencontre l'erreur détaillée ci-dessous. Qu'est-ce que je fais 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()

L'erreur est

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'
104
rectangletangle

Tout d’abord, je pense que mplot3D fonctionnait un peu différemment dans matplotlib version 0.99 que dans la version actuelle de matplotlib.

Quelle version utilisez-vous? (Essayez de courir: python -c 'import matplotlib; print matplotlib."__version__")

Je suppose que vous utilisez la version 0.99, auquel cas vous devrez soit utiliser une syntaxe légèrement différente, soit mettre à jour une version plus récente de matplotlib.

Si vous utilisez la version 0.99, essayez ceci au lieu d'utiliser l'argument de mot clé projection:

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()

Cela devrait fonctionner dans matplotlib1.0.x, pas seulement 0.99.

101
Joe Kington

Pour ajouter à la réponse de Joe Kington (pas assez de réputation pour un commentaire), il existe un bon exemple de mélange de graphes 2D et 3D dans la documentation de http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html qui indique que projection = '3d' fonctionne en combinaison avec l’importation Axes3D.

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

En fait, tant que l’importation Axes3D est présente, la ligne

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

tel qu'utilisé par l'OP fonctionne également (vérifié avec matplotlib version 1.3.1)

52
bvanlew

Importez tout mplot3d pour utiliser "projection = '3d'".

Insérez la commande ci-dessous en haut de votre script. Il devrait bien fonctionner.

 de mpl_toolkits import mplot3d
3
Tushar Sharma

Je rencontre le même problème et la réponse de @Joe Kington et @ bvanlew résout mon problème.

mais je devrais ajouter plus d'informations lorsque vous utilisez pycharm et que vous activez auto import.

lorsque vous formatez le code, le code from mpl_toolkits.mplot3d import Axes3D sera automatiquement supprimé par pycharm.

oui, ma solution est

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

et ça marche bien!

2
Colin Wang

Essaye ça:

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)
0
chetan wankhede