2010-10-11 17 views
9

Ho cercato in alto e in basso una soluzione a questo semplice problema ma non riesco a trovarlo da nessuna parte! Ci sono un sacco di post che descrivono in dettaglio il semilog/loglog di dati in 2D, ad es. plt.setxscale ('log') comunque sono interessato ad usare scale di log su un grafico 3d (mplot3d).Tracciare trama di superficie mplot3d/axes3D xyz con scala di registro?

Non ho il codice esatto a portata di mano e quindi non posso postarlo qui, tuttavia il semplice esempio di seguito dovrebbe essere sufficiente per spiegare la situazione. Attualmente sto usando Matplotlib 0.99.1, ma a breve dovrei aggiornarlo alla 1.0.0 - So che dovrò aggiornare il mio codice per l'implementazione di mplot3d.

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = Axes3D(fig) 
X = np.arange(-5, 5, 0.025) 
Y = np.arange(-5, 5, 0.025) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, extend3d=True) 
ax.set_zlim3d(-1.01, 1.01) 

ax.w_zaxis.set_major_locator(LinearLocator(10)) 
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) 

fig.colorbar(surf) 

plt.show() 

Il codice qui sopra tracciare bene in 3D, tuttavia i tre scale (X, Y, Z) sono tutti lineari. I miei dati "Y" si estendono su diversi ordini di grandezza (come 9!), Quindi sarebbe molto utile tracciarlo su una scala di registro. Posso aggirare il problema prendendo il log della 'Y', ricreando la matrice numpy e tracciando il log (Y) su una scala lineare, ma in vero stile python sto cercando una soluzione più intelligente che tracci i dati su una scala di registro.

È possibile produrre un grafico di superficie 3D dei miei dati XYZ utilizzando le scale di registro, preferibilmente X & Z su scale lineari e Y su una scala di registro?

Qualsiasi aiuto sarebbe molto apprezzato. Per favore perdona qualsiasi errore evidente nell'esempio sopra, come detto non ho il mio codice esatto da avere e quindi ho alterato un esempio di galleria matplotlib dalla mia memoria.

Grazie

risposta

4

Tutto quello che dovete fare è quello di definire la scala dell'asse che si desidera. Per esempio, se si desidera che l'asse X e Y sono in scala logaritmica, si dovrebbe scrivere:

ax.xaxis.set_scale('log') 
ax.yaxis.set_scale('log') 

e alla fine:

ax.zaxis.set_scale('log') 
+1

la risposta sopra afferma che questa risposta è sbagliata. hai una risposta a questo? – dbliss

10

Da quando ho incontrato la stessa domanda e Alejandros risposta non prodotto il Risultati desiderati ecco cosa ho scoperto finora.

Il ridimensionamento del registro per gli assi in 3D è un problema ricorrente in matplotlib. Attualmente è possibile etichettare solo gli assi con:

ax.yaxis.set_scale('log') 

Questo sarà tuttavia non causare gli assi da scalati logaritmica ma etichettati logaritmica. ax.set_yscale('log') causerà un'eccezione in 3D

Vedere su github issue 209

Pertanto è necessario ancora di ricreare l'array NumPy

+0

Esistono già soluzioni note? Sembra che set_yscale non funzioni ancora in 3D. – Blink

+0

Grazie per aver segnalato il bug report! – balu

+0

@Blink: io non la penso così. :( – balu

1

in OSX: corse ax.zaxis._set_scale ('log') (notare la sottolineatura)

Problemi correlati