Matplotlib: errore “Unknown projection '3d'”


130

Ho appena installato matplotlib e sto cercando di eseguire uno di questi script di esempio. Tuttavia ho riscontrato l'errore dettagliato di seguito. Che cosa sto facendo di sbagliato?

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

L'errore è

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'


Funziona perfettamente per me. Windows XP, Active State Python 2.6.5 matplotlib 1.0.0.
— Joaquin,

Quale versione di Python stai usando?
— Charlie Parker,

Risposte:


114

Prima di tutto, penso che abbia mplot3Dfunzionato un po 'diversamente nella matplotlibversione 0.99rispetto alla versione attuale di matplotlib.

Che versione stai usando? (Prova a correre:python -c 'import matplotlib; print matplotlib."__version__")

Immagino che tu stia eseguendo la versione 0.99, nel qual caso dovrai utilizzare una sintassi leggermente diversa o aggiornare a una versione più recente di matplotlib.

Se stai eseguendo la versione 0.99, prova a farlo invece di utilizzare l' projectionargomento della parola chiave:

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

Anche questo dovrebbe funzionare matplotlib 1.0.x, non solo 0.99.


47
@dashesy - Avrai ancora bisogno di importare le proiezioni in 3D: from mpl_toolkits.mplot3d import Axes3D. Successivamente, dovrebbe funzionare.
— Joe Kington,

2
aha, interessante! visto negli esempi ma indovinato è solo per le versioni precedenti. Grazie
— dashesy

2
Il comando per la versione di stampa per Python 3 èpython -c 'import matplotlib; print(matplotlib.__version__)'
— Charlie Parker,

2
che dire della versione 2.0.2?
— Charlie Parker,

1
Ho questo errore per Python 2.7, matplotlib .__ versione__ '2.2.3' ..... PERCHÉ non stavo usando from mpl_toolkits.mplot3d import Axes3D... :)
— ntg

64

Solo per aggiungere alla risposta di Joe Kington (non abbastanza reputazione per un commento) c'è un buon esempio di mescolanza di grafici 2D e 3D nella documentazione su http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html che mostra proiezione = ' 3d 'funziona in combinazione con l'importazione Axes3D.

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

In effetti fintanto che l'importazione Axes3D è presente la linea

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

come utilizzato dall'OP funziona anche. (controllato con matplotlib versione 1.3.1)


4
Questo è davvero utile da sapere! Mentre l'importazione di Axes3D non viene mai utilizzata esplicitamente, consente di utilizzare la proiezione = "3d" senza errori
— stufe

3
La dichiarazione di importazione l'ha fatto funzionare per me. Ma non posso fare a meno di sentirmi male eseguendo questo codice ... Usare una dichiarazione di importazione per avviare un po 'di codice che sembra totalmente separato in superficie sembra un cattivo design
— Ezbob

2
ax = fig.gca(projection='3d')funziona per me. Invece di ax = plt.subplot(111,projection="3d"). Sto usando la versione di2.1.0
— Johnny Zhang il

2
@Ezbob l'intera API matplotlib è solo un dolore nel culo. Devo sempre google se voglio creare anche una trama di base. Nessun'altra libreria Python ha un'API così scadente
— Simon H,

13

Importa mplot3d intero per utilizzare "proiezione = '3d'".

Inserisci il comando in basso nella parte superiore dello script. Dovrebbe funzionare bene.

da mpl_toolkits importa mplot3d

4

Incontro lo stesso problema e la risposta di @Joe Kington e @ bvanlew risolve il mio problema.

ma dovrei aggiungere più informazioni quando usi pycharm e abiliti auto import.

quando si formatta il codice, il codice from mpl_toolkits.mplot3d import Axes3Dverrà rimosso automaticamente da Pycharm.

quindi, la mia soluzione è

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

e funziona bene!


Puoi anche mettere # noinspection PyUnresolvedReferencesprima dell'importazione.
— Michael Bikovitsky,

0

Prova questo:

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.