2013-02-08 13 views
25

Ho riscontrato un problema con il formato delle etichette di graduazione di un asse. Ho disabilitato l'offset dal Y_AXIS:formato etichetta asse matplotlib

ax1.ticklabel_format(style = 'sci', useOffset=False) 

e ho cercato di metterlo in un formato scientifico, ma tutto quello che ottiene è:

0.00355872 

ma mi aspettavo qualcosa di simile:

3.55872...E-2 

o simile.

quello che voglio veramente è qualcosa di simile:

3.55872... (on the tick label) 
x 10^2 (or something similar - on the axis label) 

potrei provare a impostare le etichette come statica ,, ma alla fine avrò un paio di decine o centinaia di trame con valori diversi, in modo da deve essere impostato dinamicamente.

Un'alternativa sarebbe quella di posizionare l'offset y_axis come etichetta, ma non ho idea di come farlo.

risposta

24

Ci sono un certo numero di modi per farlo

si può solo modificare i limiti di potenza (doc)

ax1.xaxis.get_major_formatter().set_powerlimits((0, 1)) 

che ha fissato i poteri in cui ScalerFormatter passa alla notazione scientifica

Oppure, si potrebbe usa uno FuncFormatter che ti dà un buon controllo (ma puoi far saltare il piede).

from matplotlib import ticker 

scale_pow = 2 
def my_formatter_fun(x, p): 
    return "%.2f" % (x * (10 ** scale_pow)) 
ax1.get_xaxis().set_major_formatter(ticker.FuncFormatter(my_formatter_fun)) 
ax1.set_xlabel('my label ' + '$10^{{{0:d}}}$'.format(scale_pow)) 

FuncFormatter(doc) prende una funzione 2 argomento che restituisce una stringa e utilizza tale funzione per formattare l'etichetta. (Attenzione, questo cambierà anche il modo in cui i valori vengono visualizzati nell'angolo delle figure interattive). Il secondo argomento è per "position", che è un argomento passato quando il formattatore crea le etichette. Puoi tranquillamente ignorarlo, ma devi prenderlo (altrimenti avrai degli errori dal numero sbagliato di argomenti). Questa è una conseguenza dell'API unificata di tutti i formattatori e l'utilizzo del formattatore per la visualizzazione della posizione del mouse in modalità interattiva.

+0

Fresco, FuncFormatter utilizzato, ma con un paio di correzioni 'ax1.get_yaxis(). Set_major_formatter (ticker.FuncFormatter (lambda x, p: "%. 2f"% (x * (10 ** scale_pow))))) '. Solo un paio di dubbi: non capisco ancora cosa siano "lambda" e "p". Grazie molto! :) – jorgehumberto

+0

Immagino che 'FuncFormatter' voglia una funzione con due argomenti. 'lambda x, p: do something' crea una funzione che accetta due argomenti (' x' e 'p') ed esegue qualsiasi operazione tu debba fare. [Vedi qui per un tutorial] (http://www.secnetix.de/olli/Python/lambda_functions.hawk) –

+0

@jorgehumberto ha rimosso il 'lambda' e aggiunto un po 'di spiegazione su' p'. 'lambda' è solo un modo per fare una funzione con out' def', non è davvero necessario Python pantaloni di fantasia per questa risposta. Mi dispiace per aver reso più complicato del necessario. – tacaswell

33

Si dovrebbe anche specificare i limiti degli assi e di soglia:

ax1.ticklabel_format(axis='y', style='sci', scilimits=(-2,2)) 

tal modo si utilizzano formato sci su y asse quando le figure sono fuori dei limiti [0.01, 99].

+1

Semplice e ha funzionato per me, +1 – user3208430

Problemi correlati