Matplotlib: "Неизвестная проекция" 3d "

Я только что установил 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'

Ответ 1

Прежде всего, я думаю, что 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.

Ответ 2

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

Ответ 3

Я сталкиваюсь с той же проблемой, и @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')

и это работает хорошо!

Ответ 4

Попробуй это:

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)

Ответ 5

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

Вставьте команду ниже в верхней части вашего сценария. Это должно работать нормально.

from mpl_toolkits import mplot3d