Matplotlib: ข้อผิดพลาด“ การฉายที่ไม่รู้จัก '3d'”


130

ฉันเพิ่งติดตั้ง matplotlib และฉันพยายามเรียกใช้สคริปต์ตัวอย่างหนึ่งในนั้น อย่างไรก็ตามฉันพบข้อผิดพลาดรายละเอียดด้านล่าง ผมทำอะไรผิดหรือเปล่า?

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

ข้อผิดพลาดคือ

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
ดูที่หัวข้อนี้: comments.gmane.org/gmane.comp.python.matplotlib.devel/8904
Manoj Govindan

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน Windows XP, active state python 2.6.5 matplotlib 1.0.0
joaquin

คุณใช้ไพ ธ อนรุ่นใด
Charlie Parker

คำตอบ:


114

ปิดแรกผมคิดว่าการmplot3Dทำงานแตกต่างกันเล็กน้อยในmatplotlibรุ่นกว่าที่มันจะอยู่ในรุ่นปัจจุบัน0.99matplotlib

คุณใช้เวอร์ชั่นไหน (ลองเรียกใช้:python -c 'import matplotlib; print matplotlib."__version__")

ฉันเดาว่าคุณกำลังใช้เวอร์ชั่น0.99อยู่ซึ่งในกรณีนี้คุณจะต้องใช้ไวยากรณ์ที่แตกต่างกันเล็กน้อยหรืออัปเดตเป็นเวอร์ชันที่ใหม่matplotlibกว่า

หากคุณใช้เวอร์ชัน0.99ลองทำสิ่งนี้แทนการใช้การใช้projectionอาร์กิวเมนต์คำหลัก:

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

นี้จะทำงานในเป็นอย่างดีไม่เพียงmatplotlib 1.0.x0.99


47
@dashesy - คุณจะยังคงต้องนำเข้าประมาณการ from mpl_toolkits.mplot3d import Axes3D3D: หลังจากนั้นควรใช้งานได้
Joe Kington

2
อ่าน่าสนใจ! เห็นมันในตัวอย่าง แต่เดาว่ามันมีไว้สำหรับรุ่นเก่าเท่านั้น ขอบคุณ
dashesy

2
คำสั่งสำหรับเวอร์ชันการพิมพ์สำหรับ python 3 คือpython -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker

2
แล้วรุ่น2.0.2ล่ะ
Charlie Parker

1
ฉันมีข้อผิดพลาดนี้สำหรับ python 2.7, matplotlib .__ version__ '2.2.3' ..... เพราะฉันไม่ได้ใช้from mpl_toolkits.mplot3d import Axes3D... :)
ntg

64

เพียงเพิ่มคำตอบของ Joe Kington (ชื่อเสียงไม่เพียงพอต่อความคิดเห็น) มีตัวอย่างที่ดีของการผสม 2d และ 3d ในเอกสารที่http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.htmlซึ่งแสดงการฉาย = ' 3d ทำงานร่วมกับการนำเข้า Axes3D

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

ในความเป็นจริงตราบใดที่การนำเข้า Axes3D ยังมีอยู่

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

ตามที่ใช้โดย OP ยังทำงานได้ (ตรวจสอบกับ matplotlib เวอร์ชั่น 1.3.1)


4
นี่เป็นประโยชน์จริง ๆ ที่จะรู้! ในขณะที่การนำเข้า Axes3D ไม่เคยใช้อย่างชัดเจน แต่ก็ช่วยให้การฉายภาพ = '3d' ถูกนำมาใช้โดยไม่มีข้อผิดพลาด
เตา

3
คำสั่งการนำเข้าทำให้ฉันทำงานได้ แต่ฉันไม่สามารถรู้สึก
งี่เง่า

2
ax = fig.gca(projection='3d')ทำงานได้สำหรับฉัน ax = plt.subplot(111,projection="3d")แทน ฉันใช้รุ่น2.1.0
Johnny Zhang

2
@Ezbob ทั้ง matplotlib API เป็นเพียงความเจ็บปวดในตูด ฉันต้อง google เสมอถ้าฉันต้องการสร้างแม้แต่พล็อตพื้นฐาน ไม่มี lib งูเหลือมอื่น ๆ ที่มี API เส็งเคร็ง
Simon H

13

นำเข้า mplot3d ทั้งหมดเพื่อใช้ "projection = '3d'"

แทรกคำสั่งด้านล่างด้านบนของสคริปต์ของคุณ มันควรจะทำงานได้ดี

จาก mpl_toolkits นำเข้า mplot3d

4

ฉันพบปัญหาเดียวกันและคำตอบของ @Joe Kington และ @ bvanlew แก้ปัญหาของฉันได้

แต่ฉันควรเพิ่มข้อมูลเพิ่มเติมเมื่อคุณใช้ pycharm auto importและเปิดใช้งาน

เมื่อคุณจัดรูปแบบรหัสรหัสfrom mpl_toolkits.mplot3d import Axes3Dจะลบอัตโนมัติโดย pycharm

ดังนั้นทางออกของฉันคือ

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

และมันใช้งานได้ดี!


คุณสามารถใส่# noinspection PyUnresolvedReferencesก่อนนำเข้าได้
Michael Bikovitsky

0

ลองสิ่งนี้:

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.