2010-09-28 23 views
65

Matplotlib'yi yeni yükledim ve örnek komut dosyalarından birini çalıştırmaya çalışıyorum. Ancak aşağıda ayrıntıları verilen hatayı araştırıyorum. Neyi yanlış yapıyorum?Matplotlib: "Bilinmeyen projeksiyon '3d'" hatası

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

Bu konuya bir bakın: http://comments.gmane.org/gmane.comp.python.matplotlib.devel/8904 –

+0

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

+0

Hangi sürüm python kullanıyorsunuz? –

cevap

71

Öncelikle, ben mplot3D matplotlib sürümü o matplotlib geçerli sürümünde olduğundan daha 0.99 yılında ufak bir farkla çalışıyordu düşünüyorum.

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

Sanırım, 0.99 sürümünü çalıştırıyorsunuzdur, bu durumda, biraz daha farklı bir sözdizimi veya matplotlib'in daha yeni bir sürümüne güncellemeniz gerekir. Sürüm 0.99 çalıştırıyorsanız

, bunu yerine projection kelime argümanı kullanarak kullanmayı deneyin: Bu yanı, matplotlib 1.0.x içinde çalışması gerekir

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

, sadece 0.99.

+0

Sürüm 0.99.3 çalıştırıyorum. Komut dosyanızı denedim ama bana axes3d'nin tanımlanmadığını söylemeye devam ediyor. – rectangletangle

+0

@Anteater - Üzgünüz, 'axes3d' test verilerini kullandığınızı farketmedim. Şimdi düzeltilmeli ... Bu kod çalıştırmayı denemeden kod yazmamı öğretecek! –

+0

Sadece harika çalışıyor, güncelleme için teşekkürler! – rectangletangle

31

Sadece Joe Kington'un cevabına (yorum için yeterli bir itibara değil) eklemek için, 2d ve 3 boyutlu grafikleri http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html dokümantasyonuna ekleyerek projeksiyon = '3d' ekseninde Axes3D import ile birlikte çalışmanın iyi bir örneği vardır.

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

Aslında sürece OP da çalışır tarafından kullanıldığı gibi Axes3D ithalat hattını oluşturmak

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

mevcut olduğu gibi. (matplotlib sürüm 1.3.1 ile işaretlenmiştir)

+3

Bu gerçekten bilmek gerçekten yararlı! Axes3D içe aktarma hiçbir zaman açıkça kullanılmazken, – stoves

+2

hatasız olarak kullanılacak projeksiyon = '3d' sağlar. İçe aktarma ifadesi benim için çalışmamı sağladı. Ama ben bu kodu çalıştırarak icky hissetmeme yardımcı olamam ... Yüzeye tamamen ayrılmış gibi görünen bir kod önyükleme için bir içe aktarma deyiminin kullanılması kötü bir tasarım gibi görünüyor – Ezbob

+1

'ax = fig.gca (projection = '3d')' Benim için çalışıyor. Ax = plt.subplot (111, projection = "3d") 'yerine. '2.1.0' sürümünü kullanıyorum –

İlgili konular