2010-09-28 14 views
65

Właśnie zainstalowałem matplotlib i próbuję uruchomić jeden z przykładów skryptów. Jednak napotkam błąd opisany poniżej. Co ja robię źle?Matplotlib: "Nieznany rzut" 3d "" błąd

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

Błąd znajduje

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

Zobacz ten wątek: http://comments.gmane.org/gmane.comp.python.matplotlib.devel/8904 –

+0

To działa idealnie dla mnie. Windows XP, aktywny stan python 2.6.5 matplotlib 1.0.0. – joaquin

+0

Jakiej wersji Pythona używasz? –

Odpowiedz

71

Po pierwsze, myślę mplot3D pracował nieco inaczej w matplotlib wersji 0.99, niż ma to miejsce w obecnej wersji matplotlib.

Którą wersję używasz? (Spróbuj uruchomić: python -c 'import matplotlib; print matplotlib.__version__')

Zgaduję, że używasz wersji 0.99, w takim przypadku będziesz musiał użyć nieco innej składni lub aktualizacji w nowszej wersji matplotlib.

Jeśli używasz wersji 0.99, spróbuj robić to zamiast korzystać używając argumentu projection słów kluczowych:

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

To powinno działać w matplotlib 1.0.x, jak również, nie tylko 0.99.

+0

Używam wersji 0.99.3. Próbowałem twojego skryptu, ale ciągle mówi mi, że axes3d nie jest zdefiniowany. – rectangletangle

+0

@Anteater - Przepraszamy, nie zauważyłem, że używasz danych testowych axes3d. To powinno być teraz naprawione ... To nauczy mnie umieszczać kod bez próby uruchomienia! –

+0

Próbowałem, że działa świetnie, dzięki za aktualizację! – rectangletangle

31

Wystarczy dodać do Joe kington za odpowiedź (nie dość reputację komentarzu) jest dobrym przykładem mieszania 2D i 3D działki w dokumentacji na http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html który pokazuje projekcję = „3d” pracuje w połączeniu z importem Axes3D.

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

W rzeczywistości, o ile jest obecny importu Axes3D LINE

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

używanego przez PO również działa. (sprawdzone z matplotlib wersja 1.3.1)

+3

To jest naprawdę naprawdę pomocne wiedzieć! Podczas gdy import Axes3D nigdy nie jest jawnie używany, umożliwia użycie projekcji = '3d' bez błędu. – stoves

+2

Polecenie importowania sprawiło, że zadziałało. Ale nie mogę pomóc czuć się nieczytelnym, uruchamiając ten kod ... Używanie instrukcji import do bootstrap jakiegoś kodu, który wygląda całkowicie odseparowany na powierzchni, wydaje się złym projektem – Ezbob

+1

'ax = fig.gca (rzutowanie = '3d')' działa dla mnie. Zamiast 'ax = plt.subplot (111, rzut =" 3d ")'. Używam wersji '2.1.0' –

Powiązane problemy