2010-09-28 42 views
65

Tôi vừa cài đặt matplotlib và đang cố gắng chạy một trong các tập lệnh mẫu đó. Tuy nhiên tôi chạy vào các lỗi chi tiết dưới đây. Tôi đang làm gì sai?Matplotlib: Lỗi "Không xác định chiếu" 3d '"

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

Lỗi này là

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

Hãy xem chủ đề này: http://comments.gmane.org/gmane.comp.python.matplotlib.devel/8904 –

+0

Nó hoạt động hoàn hảo cho tôi. Windows XP, Trạng thái hoạt động python 2.6.5 matplotlib 1.0.0. – joaquin

+0

Bạn đang sử dụng phiên bản python nào? –

Trả lời

71

Trước hết, tôi nghĩ mplot3D làm việc một chút khác nhau trong phiên bản matplotlib 0.99 hơn là trong phiên bản hiện tại của matplotlib.

Bạn đang sử dụng phiên bản nào? (Thử chạy: python -c 'import matplotlib; print matplotlib.__version__')

Tôi đoán bạn đang chạy phiên bản 0.99, trong trường hợp đó, bạn cần sử dụng cú pháp hơi khác hoặc cập nhật lên phiên bản mới hơn của matplotlib.

Nếu bạn đang chạy phiên bản 0.99, hãy thử làm điều này thay vì sử dụng bằng cách sử dụng lập luận projection keyword:

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

này nên làm việc trong matplotlib 1.0.x, cũng như, không chỉ là 0,99.

+0

Tôi đang chạy phiên bản 0.99.3. Tôi đã thử kịch bản của bạn nhưng nó giữ cho tôi biết axes3d không được xác định. – rectangletangle

+0

@Anteater - Rất tiếc, tôi không nhận thấy rằng bạn đang sử dụng dữ liệu thử nghiệm của "axes3d'. Nó phải được cố định ngay bây giờ ... Điều đó sẽ dạy cho tôi để đưa mã vào mà không cố gắng để chạy nó! –

+0

Chỉ cần thử nó hoạt động tuyệt vời, cảm ơn cho việc cập nhật! – rectangletangle

31

Chỉ cần thêm vào câu trả lời của Joe Kington (không đủ danh tiếng cho nhận xét) có một ví dụ điển hình về việc trộn các ô 2d và 3d trong tài liệu tại số http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html cho thấy phép chiếu = '3d' hoạt động kết hợp với nhập Axes3D.

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

Trong thực tế miễn là việc nhập khẩu Axes3D hiện diện dòng

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

như được sử dụng bởi các OP cũng làm việc. (được kiểm tra với phiên bản matplotlib 1.3.1)

+3

Điều này thực sự thực sự hữu ích để biết! Trong khi nhập khẩu Axes3D không bao giờ được sử dụng một cách rõ ràng nó cho phép chiếu = '3d' được sử dụng mà không có lỗi – stoves

+2

Câu lệnh nhập đã làm cho nó hoạt động cho tôi. Nhưng tôi không thể không cảm thấy icky bằng cách chạy mã này ... Sử dụng một tuyên bố nhập khẩu để bootstrap một số mã trông hoàn toàn tách ra trên bề mặt có vẻ giống như một thiết kế xấu – Ezbob

+1

'ax = fig.gca (chiếu = '3d')' làm việc cho tôi. Thay vì 'ax = plt.subplot (111, chiếu =" 3d ")'. Tôi đang sử dụng phiên bản '2.1.0' –

Các vấn đề liên quan