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'
rectangletangle
источник
2
Взгляните на эту ветку: comments.gmane.org/gmane.comp.python.matplotlib.devel/8904
Манодж Говиндан
У меня он отлично работает. Windows XP, активное состояние 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
ага, интересно! видел это в примерах, но предположил, что это только для более старых версий. Спасибо
dashesy
2
команда для версии для печати для python 3python -c 'import matplotlib; print(matplotlib.__version__)'
Чарли Паркер
2
как насчет версии 2.0.2?
Чарли Паркер
1
У меня есть эта ошибка для python 2.7, matplotlib .__ version__ '2.2.3' ..... ПОТОМУ ЧТО я не использовал from mpl_toolkits.mplot3d import Axes3D... :)
ntg
64

Чтобы добавить к ответу Джо Кингтона (недостаточно репутации для комментария), есть хороший пример смешивания графиков 2d и 3d в документации по адресу http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html, который показывает projection = ' 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)

bvanlew
источник
4
Это действительно полезно знать! Хотя импорт Axes3D никогда явно не используется, он позволяет использовать projection = '3d' без ошибок
печи
3
Оператор импорта заставил меня работать. Но я не могу не чувствовать себя неприятно, запустив этот код ... Использование оператора импорта для начальной загрузки некоторого кода, который на поверхности выглядит полностью отделенным, кажется плохим дизайном
Эзбоб
2
ax = fig.gca(projection='3d')действительно работает для меня. Вместо ax = plt.subplot(111,projection="3d"). Я использую версию2.1.0
Джонни Чжан
2
@Ezbob весь API matplotlib - просто заноза в заднице. Мне всегда нужно гуглить, если я хочу создать хотя бы базовый сюжет. Ни в одной другой
Саймон Х
13

Импортируйте mplot3d целиком, чтобы использовать projection = '3d'.

Вставьте команду ниже в начало вашего скрипта. Он должен работать нормально.

из mpl_toolkits импортировать mplot3d
Тушар Шарма
источник
4

Я столкнулся с той же проблемой, и ответ @Joe Kington и @bvanlew решает мою проблему.

но я должен добавить больше информации, когда вы используете pycharm и enable 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)
Четан Ванкхеде
источник