Matplotlib: Erreur "projection inconnue '3d'"

130

Je viens d'installer matplotlib et j'essaie d'exécuter l'un de ces 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'
rectangle
la source
2
Jetez un œil à ce fil: comments.gmane.org/gmane.comp.python.matplotlib.devel/8904
Manoj Govindan
Cela fonctionne parfaitement pour moi. Windows XP, état actif python 2.6.5 matplotlib 1.0.0.
joaquin
Quelle version de python utilisez-vous?
Charlie Parker

Réponses:

114

Tout d' abord, je pense mplot3Dtravaillé un peu différemment dans la matplotlibversion 0.99qu'il fait dans la version actuelle matplotlib.

Quelle version utilisez-vous? (Essayez d'exécuter:python -c 'import matplotlib; print matplotlib."__version__")

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

Si vous utilisez la version 0.99, essayez de le faire au lieu d'utiliser l' projectionargument de mot - clé:

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 également fonctionner matplotlib 1.0.x, pas seulement 0.99.

Joe Kington
la source
47
@dashesy - Vous aurez toujours besoin d'importer les projections 3D: from mpl_toolkits.mplot3d import Axes3D. Ensuite, ça devrait marcher.
Joe Kington
2
aha, intéressant! je l'ai vu dans les exemples, mais je suppose que c'est pour les anciennes versions uniquement. Merci
dashesy
2
commande pour la version imprimée pour python 3 estpython -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker
2
qu'en est-il de la version 2.0.2?
Charlie Parker
1
J'ai cette erreur pour python 2.7, matplotlib .__ version__ '2.2.3' ..... PARCE QUE je n'utilisais pas from mpl_toolkits.mplot3d import Axes3D... :)
ntg
64

Juste pour ajouter à la réponse de Joe Kington (pas assez de réputation pour un commentaire), il y a un bon exemple de mélange de tracés 2D et 3D dans la documentation à http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html qui montre projection = ' 3d 'fonctionnant 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'import Axes3D est présent 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)

bvanlew
la source
4
C'est vraiment très utile à savoir! Bien que l'importation Axes3D ne soit jamais explicitement utilisée, elle permet d'utiliser projection = '3d' sans erreur
poêles
3
La déclaration d'importation l'a fait fonctionner pour moi. Mais je ne peux pas m'empêcher de me sentir mal en exécutant ce code ... Utiliser une instruction d'importation pour amorcer un code qui semble totalement séparé en surface semble être une mauvaise conception
Ezbob
2
ax = fig.gca(projection='3d')fonctionne pour moi. Au lieu de ax = plt.subplot(111,projection="3d"). J'utilise la version de2.1.0
Johnny Zhang
2
@Ezbob toute l'API matplotlib est juste une douleur dans le cul. Je dois toujours chercher sur Google si je veux créer même une intrigue basique. Aucune autre bibliothèque python n'a une API aussi merdique
Simon H
13

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

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

de mpl_toolkits import mplot3d
Tushar Sharma
la source
4

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 enable auto import.

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

alors 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!

Colin Wang
la source
Vous pouvez également mettre # noinspection PyUnresolvedReferencesavant l'importation.
Michael Bikovitsky le
0

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)
chetan wankhede
la source