Matplotlib: Fehler "Unbekannte Projektion '3d'"


130

Ich habe gerade matplotlib installiert und versuche, eines dieser Beispielskripte auszuführen. Ich stoße jedoch auf den unten beschriebenen Fehler. Was mache ich falsch?

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

Der Fehler ist

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'


Es funktioniert perfekt für mich. Windows XP, Active State Python 2.6.5 Matplotlib 1.0.0.
Joaquin

Welche Python-Version verwenden Sie?
Charlie Parker

Antworten:


114

Zunächst einmal, ich denke , mplot3Dein wenig anders in gearbeitet matplotlibVersion , 0.99als es in der aktuellen Version von tut matplotlib.

Welche Version verwenden Sie? (Versuchen Sie zu laufen:python -c 'import matplotlib; print matplotlib."__version__")

Ich vermute, Sie führen eine Version aus 0.99. In diesem Fall müssen Sie entweder eine etwas andere Syntax verwenden oder auf eine neuere Version von aktualisieren matplotlib.

Wenn Sie eine Version 0.99ausführen, versuchen Sie dies, anstatt das projectionSchlüsselwortargument zu verwenden:

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

Dies sollte auch funktionieren matplotlib 1.0.x, nicht nur 0.99.


47
@dashesy - Sie müssen die 3D-Projektionen noch importieren : from mpl_toolkits.mplot3d import Axes3D. Danach sollte es funktionieren.
Joe Kington

2
Aha, interessant! habe es in den Beispielen gesehen, aber vermutet, dass es nur für ältere Versionen ist. Danke
schneidig

2
Befehl für die Druckversion für Python 3 istpython -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker

2
Was ist mit der Version 2.0.2?
Charlie Parker

1
Ich habe diesen Fehler für Python 2.7, matplotlib .__ version__ '2.2.3' ..... WEIL ich nicht verwendet habe from mpl_toolkits.mplot3d import Axes3D... :)
ntg

64

Nur um Joe Kingtons Antwort zu ergänzen (nicht genug Ruf für einen Kommentar), gibt es in der Dokumentation unter ein gutes Beispiel für das Mischen von 2D- und 3D-Plots http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html das projection = 'zeigt. 3d 'arbeitet in Kombination mit dem Axes3D-Import.

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

In der Tat, solange der Axes3D-Import vorhanden ist, die Linie

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

wie vom OP verwendet funktioniert auch. (geprüft mit matplotlib Version 1.3.1)


4
Das ist eigentlich sehr hilfreich zu wissen! Während der Axes3D-Import niemals explizit verwendet wird, ermöglicht er die fehlerfreie Verwendung von projection = '3d'
Öfen

3
Die Import-Anweisung hat es für mich funktionieren lassen. Aber ich kann nicht anders, als mich durch das Ausführen dieses Codes icky zu fühlen ... Die Verwendung einer Importanweisung zum Bootstrap von Code, der auf der Oberfläche völlig getrennt aussieht, scheint ein schlechtes Design zu sein
Ezbob

2
ax = fig.gca(projection='3d')funktioniert für mich. Anstelle von ax = plt.subplot(111,projection="3d"). Ich benutze die Version von2.1.0
Johnny Zhang

2
@ Esbob die ganze Matplotlib API ist nur ein Schmerz im Arsch. Ich muss immer googeln, wenn ich auch nur einen einfachen Plot erstellen möchte. Keine andere Python-Bibliothek hat eine so beschissene API
Simon H

13

Importieren Sie mplot3d als Ganzes, um "projection = '3d'" zu verwenden.

Fügen Sie den folgenden Befehl oben in Ihr Skript ein. Es sollte gut laufen.

aus mpl_toolkits importiere mplot3d

4

Ich habe das gleiche Problem und die Antwort von @Joe Kington und @ bvanlew löst mein Problem.

Aber ich sollte mehr Informationen hinzufügen, wenn Sie Pycharm verwenden und aktivieren auto import.

Wenn Sie den Code formatieren, wird der Code from mpl_toolkits.mplot3d import Axes3Dautomatisch von pycharm entfernt.

Meine Lösung ist also

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

und es funktioniert gut!


Sie können auch # noinspection PyUnresolvedReferencesvor dem Import setzen.
Michael Bikovitsky

0

Versuche dies:

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.