Matplotlib: Erro "Projeção desconhecida '3d'"


130

Acabei de instalar o matplotlib e estou tentando executar um dos scripts de exemplo. No entanto, encontro o erro detalhado abaixo. O que estou fazendo de errado?

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

O erro é

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'


Funciona perfeitamente para mim. Windows XP, estado ativo python 2.6.5 matplotlib 1.0.0.
Joaquin

Qual versão do python você está usando?
Charlie Parker

Respostas:


114

Primeiro, acho que mplot3Dfuncionou um pouco diferente na matplotlibversão 0.99do que na versão atual do matplotlib.

Qual versão você está usando? (Tente executar:python -c 'import matplotlib; print matplotlib."__version__")

Suponho que você esteja executando a versão 0.99. Nesse caso, você precisará usar uma sintaxe um pouco diferente ou atualizar para uma versão mais recente do matplotlib.

Se você estiver executando a versão 0.99, tente fazer isso em vez de usar o projectionargumento keyword:

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

Isso deve funcionar matplotlib 1.0.x, também, não apenas 0.99.


47
@dashesy - Você ainda vai precisar importar as projeções 3D: from mpl_toolkits.mplot3d import Axes3D. Depois, deve funcionar.
precisa

2
aha, interessante! vi nos exemplos, mas acho que é apenas para versões mais antigas. Graças
dashesy

2
comando para a versão impressa do python 3 é #python -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker

2
e a versão 2.0.2?
Charlie Parker

1
Eu tenho esse erro para Python 2.7, matplotlib .__ version__ '2.2.3' ..... porque eu não estava usando from mpl_toolkits.mplot3d import Axes3D... :)
NTG

64

Apenas para adicionar à resposta de Joe Kington (reputação insuficiente para um comentário), há um bom exemplo de mistura de plotagens 2D e 3D na documentação em http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html, que mostra projeção = ' 3d 'trabalhando em conjunto com a importação do Axes3D.

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

De fato, enquanto a importação do Axes3D estiver presente, a linha

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

como usado pelo OP também funciona. (verificado com o matplotlib versão 1.3.1)


4
Isso é realmente muito útil saber! Enquanto a importação Axes3D nunca é usado explicitamente permite projeção = '3d' para ser usado sem erro
fogões

3
A declaração de importação fez funcionar para mim. Mas não posso deixar de sentir icky executando este código ... Usando uma instrução de importação para inicializar um código que parece totalmente separados na superfície parece ser uma má concepção
Ezbob

2
ax = fig.gca(projection='3d')funciona para mim. Em vez de ax = plt.subplot(111,projection="3d"). Estou usando a versão de2.1.0
Johnny Zhang

2
@Ezbob, toda a API do matplotlib é apenas um pé no saco. Eu sempre preciso pesquisar no Google se quiser criar um enredo básico. Nenhum outro lib pitão tem uma API de baixa qualidade, tais
Simon H

13

Importe mplot3d inteiro para usar "projection = '3d'".

Insira o comando abaixo na parte superior do seu script. Deve funcionar bem.

de mpl_toolkits import mplot3d

4

Encontro o mesmo problema, e a resposta de Joe Kington e @ bvanlew resolve o meu problema.

mas devo adicionar mais informações ao usar o pycharm e ativar auto import.

quando você formata o código, o código from mpl_toolkits.mplot3d import Axes3Dé removido automaticamente por pycharm.

então, minha solução é

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

e funciona bem!


Você também pode colocar # noinspection PyUnresolvedReferencesantes da importação.
Michael Bikovitsky

0

Tente o seguinte:

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.