Matplotlib: Lỗi không xác định được chiếu '3d'


130

Tôi vừa cài đặt matplotlib và đang cố chạy một trong các tập lệnh ví dụ. Tuy nhiên tôi chạy vào lỗi chi tiết dưới đây. Tôi đang làm gì sai?

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 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'


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

Phiên bản nào của python bạn đang sử dụng?
Charlie Parker

Câu trả lời:


114

Trước hết, tôi nghĩ rằng phiên bản mplot3Dlàm việc hơi khác so với phiên bản hiện tại .matplotlib0.99matplotlib

Phiên bản bạn đang sử dụng? (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 sẽ 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 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 projectionđối số từ khóa:

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

Điều này nên làm việc matplotlib 1.0.x, là tốt, không chỉ 0.99.


47
@dashesy - Bạn vẫn sẽ cần nhập các hình chiếu 3d : from mpl_toolkits.mplot3d import Axes3D. Sau đó, nó sẽ làm việc.
Joe Kington

2
aha, thú vị nhìn thấy nó trong các ví dụ nhưng đoán nó chỉ dành cho các phiên bản cũ hơn. Cảm ơn
bảnh bao

2
Lệnh cho phiên bản in cho python 3 làpython -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker

2
Phiên bản 2.0.2thì sao?
Charlie Parker

1
Tôi có lỗi này đối với python 2.7, matplotlib .__ phiên bản__ '2.2.3' ..... VÌ Tôi không sử dụng from mpl_toolkits.mplot3d import Axes3D... :)
ntg

64

Chỉ cần thêm vào câu trả lời của Joe Kington (không đủ danh tiếng cho một nhận xét), có một ví dụ hay về việc trộn các lô 2d và 3d trong tài liệu tại http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html hiển thị 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à nhập Axes3D là dòng

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

như được sử dụng bởi OP cũng hoạt động. (được kiểm tra với phiên bản matplotlib 1.3.1)


4
Điều này thực sự hữu ích để biết! Mặc dù nhập khẩu Axes3D không bao giờ được sử dụng rõ ràng, nhưng nó cho phép chiếu = '3d' được sử dụng mà không gặp lỗi
bếp lò

3
Các báo cáo nhập khẩu làm cho nó làm việc cho tôi. Nhưng tôi không thể giúp cảm thấy thoải mái bằng cách chạy mã này ... Sử dụng câu lệnh nhập để khởi động một số mã trông hoàn toàn tách biệt trên bề mặt có vẻ như là một thiết kế tồi
Ezbob

2
ax = fig.gca(projection='3d')không làm việc cho tôi Thay vì ax = plt.subplot(111,projection="3d"). Tôi đang sử dụng phiên bản của2.1.0
Johnny Zhang

2
@Ezbob toàn bộ API matplotlib chỉ là một nỗi đau ở mông. Tôi luôn phải google nếu tôi muốn tạo ngay cả một cốt truyện cơ bản. Không có lib python nào khác có API nhảm nhí như vậy
Simon H

13

Nhập toàn bộ mplot3d để sử dụng "chiếu = '3d'".

Chèn lệnh dưới đây vào đầu tập lệnh của bạn. Nó sẽ chạy tốt.

từ mpl_toolkits nhập mplot3d

4

Tôi gặp phải vấn đề tương tự, và câu trả lời của @Joe Kington và @ bvanlew giải quyết vấn đề của tôi.

nhưng tôi nên thêm thông tin khi bạn sử dụng pycharm và kích hoạt auto import.

Khi bạn định dạng mã, mã from mpl_toolkits.mplot3d import Axes3Dsẽ tự động xóa bằng pycharm.

vì vậy, giải pháp của tôi là

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

và nó hoạt động tốt!


Bạn cũng có thể đặt # noinspection PyUnresolvedReferencestrước khi nhập khẩu.
Michael Bikovitsky

0

Thử cái này:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.