Matplotlib: Błąd „Nieznana projekcja„ 3d ””

130

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

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 jest

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'
prostokąt
źródło
2
Spójrz na ten wątek: comments.gmane.org/gmane.comp.python.matplotlib.devel/8904
Manoj Govindan
U mnie działa idealnie. Windows XP, stan aktywny Python 2.6.5 matplotlib 1.0.0.
joaquin
Jakiej wersji Pythona używasz?
Charlie Parker

Odpowiedzi:

114

Po pierwsze, myślę, że mplot3Ddziałało trochę inaczej w matplotlibwersji 0.99niż w obecnej wersjimatplotlib .

Której wersji używasz? (Spróbuj biegać:python -c 'import matplotlib; print matplotlib."__version__")

Zgaduję, że używasz wersji 0.99, w takim przypadku musisz użyć nieco innej składni lub zaktualizować do nowszej wersji matplotlib.

Jeśli używasz wersji 0.99, spróbuj to zrobić, zamiast używać projectionargumentu słowa kluczowego:

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

Powinno to również zadziałać matplotlib 1.0.x, a nie tylko 0.99.

Joe Kington
źródło
47
@dashesy - Będziesz nadal trzeba importować 3D projekcje: from mpl_toolkits.mplot3d import Axes3D. Potem powinno działać.
Joe Kington
2
aha, ciekawe! Widziałem to w przykładach, ale zgadłem, że jest to tylko dla starszych wersji. Dzięki
dashesy
2
polecenie dla wersji drukowanej dla Pythona 3 topython -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker
2
co z wersją 2.0.2?
Charlie Parker
1
Mam ten błąd dla pythona 2.7, matplotlib .__ wersja__ '2.2.3' ..... PONIEWAŻ nie używałem from mpl_toolkits.mplot3d import Axes3D... :)
ntg
64

Aby dodać do odpowiedzi Joe Kingtona (nie ma wystarczającej reputacji do komentarza), jest dobry przykład mieszania wykresów 2D i 3D w dokumentacji na http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html, która pokazuje projection = ' 3d 'działające 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, dopóki import Axes3D jest obecny, wiersz

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

w wersji używanej przez PO również działa. (sprawdzane w matplotlib w wersji 1.3.1)

wiał
źródło
4
Naprawdę warto wiedzieć! Chociaż import Axes3D nigdy nie jest jawnie używany, umożliwia bezbłędne użycie projection = '3d'
piece
3
Oświadczenie importu sprawiło, że działało dla mnie. Ale nie mogę przestać czuć się nieprzyjemnie, uruchamiając ten kod ... Używanie instrukcji importu do załadowania kodu, który wygląda na całkowicie oddzielony, wydaje się złym projektem
Ezbob
2
ax = fig.gca(projection='3d')działa dla mnie. Zamiast ax = plt.subplot(111,projection="3d"). Używam wersji2.1.0
Johnny Zhang,
2
@Ezbob całe API matplotlib to tylko wrzód na dupie. Zawsze muszę google, jeśli chcę stworzyć choćby podstawową fabułę. Żadna inna biblioteka Pythona nie ma tak kiepskiego API
Simon H
13

Zaimportuj całość mplot3d, aby użyć „projection = '3d'”.

Wstaw poniższe polecenie u góry skryptu. Powinno działać dobrze.

z mpl_toolkits import mplot3d
Tushar Sharma
źródło
4

Napotykam ten sam problem, a odpowiedź @Joe Kington i @ bvanlew rozwiązuje mój problem.

ale powinienem dodać więcej informacji, gdy używasz pycharm i włączasz auto import.

kiedy sformatujesz kod, from mpl_toolkits.mplot3d import Axes3Dzostanie on automatycznie usunięty przez pycharm.

więc moim rozwiązaniem jest

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

i działa dobrze!

Colin Wang
źródło
Możesz również wstawić # noinspection PyUnresolvedReferencesprzed importem.
Michael Bikovitsky
0

Spróbuj tego:

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
źródło