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'


Це прекрасно працює для мене. Windows XP, Active state python 2.6.5 matplotlib 1.0.0.
Жоакін

Яку версію python ви використовуєте?
Чарлі Паркер

Відповіді:


114

По-перше, я думаю, що mplot3Dу matplotlibверсії працювали трохи інакше, 0.99ніж у поточній версії matplotlib.

Яку версію ви використовуєте? (Спробуйте запустити: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.xі не тільки 0.99.


47
@dashesy - Ви по- , як і раніше необхідно імпортувати 3D - проекції: from mpl_toolkits.mplot3d import Axes3D. Згодом це має спрацювати.
Джо Кінгтон

2
ага, цікаво! бачив це в прикладах, але здогадувався, що це лише для старих версій. Спасибі
тире

2
Команда для версії для друку для python 3python -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker

2
як щодо версії 2.0.2?
Чарлі Паркер

1
У мене є ця помилка для python 2.7, matplotlib .__ версія__ '2.2.3' ..... ЗА ЯКОМО не використовую from mpl_toolkits.mplot3d import Axes3D... :)
ntg

64

Просто для додання відповіді Джо Кінгтона (недостатньо репутації для коментаря) є хороший приклад змішування 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')

як використовується ОП, також працює. (перевірено матплотлібом версії 1.3.1)


4
Це насправді дуже корисно знати! Хоча імпорт Axes3D ніколи не використовується явно, це дозволяє projection = '3d' використовуватись без помилок
пічки

3
Заява про імпорт змусила мене працювати. Але я не можу не відчути пристрасті, запускаючи цей код ... Використання заяви про імпорт для завантаження якогось коду, який виглядає повністю розділеним на поверхні, здається поганим дизайном
Ezbob

2
ax = fig.gca(projection='3d')працює для мене. Замість цього ax = plt.subplot(111,projection="3d"). Я використовую версію2.1.0
Johnny Zhang

2
@Ezbob весь API matplotlib - це просто біль у дупі. Мені завжди доводиться гугл, якщо хочу створити навіть базовий сюжет. Жоден інший пітон не має такого
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перед імпортом.
Михайло Біковицький

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.