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.