Matplotlib: "Bilinmeyen projeksiyon '3d'" hatası


130

Matplotlib'i yeni kurdum ve oradaki örnek betiklerden birini çalıştırmaya çalışıyorum. Ancak aşağıda ayrıntıları verilen hatayla karşılaşıyorum. Neyi yanlış yapıyorum?

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

Hata

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
Şu konu
başlığına

Benim için mükemmel çalışıyor. Windows XP, Active state python 2.6.5 matplotlib 1.0.0.
joaquin

Hangi python sürümünü kullanıyorsunuz?
Charlie Parker

Yanıtlar:


114

Öncelikle, sürümünde şu anki sürümünden mplot3Dbiraz farklı çalıştığını düşünüyorum .matplotlib0.99matplotlib

Hangi sürümü kullanıyorsunuz? (Koşmayı deneyin:python -c 'import matplotlib; print matplotlib."__version__")

Tahminimce sürüm çalıştırıyorsunuz 0.99, bu durumda ya biraz farklı bir sözdizimi kullanmanız ya da daha yeni bir sürümüne güncellemeniz gerekecek matplotlib.

Sürüm çalıştırıyorsanız 0.99, projectionanahtar kelime bağımsız değişkenini kullanmak yerine bunu yapmayı deneyin :

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

Bu da işe matplotlib 1.0.xyaramalı, sadece değil 0.99.


47
@dashesy - Hala 3d projeksiyonları ithal etmek gerekir: from mpl_toolkits.mplot3d import Axes3D. Daha sonra çalışması gerekir.
Joe Kington

2
aha, ilginç! örneklerde görmüş, ancak yalnızca eski sürümler için olduğunu tahmin etmişti. Teşekkürler
kısa

2
python 3 için baskı sürümü için komutpython -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker

2
versiyon ne olacak 2.0.2?
Charlie Parker

1
Python 2.7, matplotlib .__ version__ '2.2.3' ..... için bu hatayı aldım ... ÇÜNKÜ kullanmıyordum from mpl_toolkits.mplot3d import Axes3D... :)
ntg

64

Joe Kington'ın cevabına eklemek için (bir yorum için yeterli itibar yok) http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html adresindeki belgelerde projeksiyon = 'gösteren 2 ve 3 boyutlu grafikleri karıştırmanın güzel bir örneği var. Axes3D içe aktarma ile birlikte çalışan 3d '.

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

Aslında Axes3D içe aktarımı mevcut olduğu sürece

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

OP tarafından kullanıldığı şekliyle de çalışır. (matplotlib sürüm 1.3.1 ile kontrol edildi)


4
Bunu bilmek gerçekten çok yardımcı oluyor! Axes3D içe aktarma hiçbir zaman açıkça kullanılmasa da projeksiyon = '3d'nin hatasız kullanılmasını sağlar
sobalar

3
İthalat beyanı benim için çalışmasını sağladı. Ama bu kodu çalıştırarak kendimi kötü hissetmekten kendimi alamıyorum ... Yüzeyde tamamen ayrı görünen bazı kodları önyüklemek için bir import deyimi kullanmak kötü bir tasarım gibi görünüyor
Ezbob

2
ax = fig.gca(projection='3d')benim için çalışıyor. Yerine ax = plt.subplot(111,projection="3d"). 2.1.0
Johnny Zhang

2
@Ezbob tüm matplotlib API'si tam bir baş belası. Basit bir olay örgüsü bile oluşturmak istiyorsam her zaman google'a ihtiyacım var. Başka hiçbir python kitaplığı bu kadar berbat bir API'ye sahip değil
Simon H

13

"Projeksiyon = '3d'" kullanmak için mplot3d tamamını içe aktarın.

Aşağıdaki komutu komut dosyanızın üstüne ekleyin. İyi çalışmalı.

mpl_toolkits'ten ithal mplot3d

4

Aynı problemle karşılaşıyorum ve @Joe Kington ve @ bvanlew'in cevabı problemimi çözüyor.

ancak pycharm kullandığınızda ve etkinleştirdiğinizde daha fazla bilgi eklemeliyim auto import.

Kodu biçimlendirdiğinizde, kod from mpl_toolkits.mplot3d import Axes3Dpycharm tarafından otomatik olarak kaldırılır.

yani benim çözümüm

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

ve iyi çalışıyor!


# noinspection PyUnresolvedReferencesİthalattan önce de koyabilirsiniz .
Michael Bikovitsky

0

Bunu dene:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.