Matplotlib: Kesalahan "Proyeksi tidak diketahui '3d'"


130

Saya baru saja menginstal matplotlib dan saya mencoba menjalankan salah satu contoh skrip di sana. Namun saya mengalami kesalahan yang dirinci di bawah ini. Apa yang saya lakukan salah?

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

Kesalahannya adalah

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'


Ini bekerja dengan baik untuk saya. Windows XP, Python keadaan aktif 2.6.5 matplotlib 1.0.0.
joaquin

Versi python apa yang Anda gunakan?
Charlie Parker

Jawaban:


114

Pertama, saya pikir mplot3Dbekerja sedikit berbeda dalam matplotlibversi 0.99daripada di versi saat ini matplotlib.

Versi mana yang Anda gunakan? (Coba jalankan:python -c 'import matplotlib; print matplotlib."__version__")

Saya menduga Anda sedang menjalankan versi 0.99, dalam hal ini Anda harus menggunakan sintaks yang sedikit berbeda atau memperbarui ke versi yang lebih baru matplotlib.

Jika Anda menjalankan versi 0.99, coba lakukan ini alih-alih menggunakan menggunakan projectionargumen kata kunci:

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

Ini harus bekerja matplotlib 1.0.x, juga, bukan hanya 0.99.


47
@dashesy - Anda masih harus mengimpor proyeksi 3d: from mpl_toolkits.mplot3d import Axes3D. Setelah itu, itu akan berhasil.
Joe Kington

2
aha, menarik! melihatnya dalam contoh tetapi menebak itu hanya untuk versi yang lebih lama. Terima kasih
dashesy

2
perintah untuk versi cetak untuk python 3 adalahpython -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker

2
bagaimana dengan versi 2.0.2?
Charlie Parker

1
Saya memiliki kesalahan ini untuk python 2.7, matplotlib .__ version__ '2.2.3' ..... KARENA saya tidak menggunakan from mpl_toolkits.mplot3d import Axes3D... :)
ntg

64

Hanya untuk menambah jawaban Joe Kington (tidak cukup reputasi untuk komentar) ada contoh yang baik dari pencampuran plot 2d dan 3d dalam dokumentasi di http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html yang menunjukkan proyeksi = ' 3d 'bekerja dalam kombinasi dengan impor Axes3D.

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

Faktanya selama impor Axes3D hadir

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

seperti yang digunakan oleh OP juga berfungsi. (diperiksa dengan matplotlib versi 1.3.1)


4
Ini sebenarnya sangat membantu untuk mengetahui! Sementara impor Axes3D tidak pernah digunakan secara eksplisit, memungkinkan proyeksi = '3d' digunakan tanpa kesalahan
kompor

3
Pernyataan impor membuatnya bekerja untuk saya. Tapi saya tidak bisa menahan perasaan jijik dengan menjalankan kode ini ... Menggunakan pernyataan impor untuk mem-bootstrap beberapa kode yang terlihat benar-benar terpisah di permukaan sepertinya desain yang buruk
Ezbob

2
ax = fig.gca(projection='3d')tidak bekerja untuk saya. Alih-alih ax = plt.subplot(111,projection="3d"). Saya menggunakan versi2.1.0
Johnny Zhang

2
@Ezbob seluruh matplotlib API hanya menyebalkan. Saya selalu harus google jika saya ingin membuat plot dasar. Tidak ada python lib lain yang memiliki API jelek seperti itu
Simon H

13

Impor keseluruhan mplot3d untuk menggunakan "proyeksi = '3d'".

Masukkan perintah di bawah ini di atas skrip Anda. Seharusnya berjalan dengan baik.

dari mpl_toolkits import mplot3d

4

Saya mengalami masalah yang sama, dan jawaban @Joe Kington dan @ bvanlew memecahkan masalah saya.

tapi saya harus menambahkan lebih banyak informasi ketika Anda menggunakan pycharm dan aktifkan auto import.

ketika Anda memformat kode, kode from mpl_toolkits.mplot3d import Axes3Dakan dihapus secara otomatis oleh pycharm.

jadi, solusi saya adalah

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

dan itu bekerja dengan baik!


Anda juga dapat meletakkan # noinspection PyUnresolvedReferencessebelum impor.
Michael Bikovitsky

0

Coba ini:

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.