Ho provato molti modi per ottenere il minore zecche funziona correttamente in trame di registro. Se stai bene mostrando il registro del valore del segno di spunta, puoi usare matplotlib.ticker.LogFormatterExponent
. Ricordo di aver provato matplotlib.ticker.LogFormatter
ma non mi piaceva molto: se ricordo bene mette tutto in base^exp
(anche 0.1, 0, 1). In entrambi i casi (come pure tutti gli altri matplotlib.ticker.LogFormatter*
) è necessario impostare labelOnlyBase=False
per ottenere segni di spunta minori.
Ho finito per creare una funzione personalizzata e utilizzare matplotlib.ticker.FuncFormatter
. Il mio approccio presuppone che i tick siano a valori interi e che tu voglia un log di base 10.
from matplotlib import ticker
import numpy as np
def ticks_format(value, index):
"""
get the value and returns the value as:
integer: [0,99]
1 digit float: [0.1, 0.99]
n*10^m: otherwise
To have all the number of the same size they are all returned as latex strings
"""
exp = np.floor(np.log10(value))
base = value/10**exp
if exp == 0 or exp == 1:
return '${0:d}$'.format(int(value))
if exp == -1:
return '${0:.1f}$'.format(value)
else:
return '${0:d}\\times10^{{{1:d}}}$'.format(int(base), int(exp))
subs = [1.0, 2.0, 3.0, 6.0] # ticks to show per decade
ax.xaxis.set_minor_locator(ticker.LogLocator(subs=subs)) #set the ticks position
ax.xaxis.set_major_formatter(ticker.NullFormatter()) # remove the major ticks
ax.xaxis.set_minor_formatter(ticker.FuncFormatter(ticks_format)) #add the custom ticks
#same for ax.yaxis
Se non si rimuovono i principali zecche e utilizzare subs = [2.0, 3.0, 6.0]
la dimensione del carattere delle maggiori e minori zecche è diverso (questo potrebbe essere motivo utilizzando text.usetex:False
nel mio matplotlibrc
)
fonte
2013-06-20 09:16:57
lasciamo perdere la mia voto ravvicinato, molto fuorviante la domanda. Se non si dispone di segni di registro importanti sul grafico, probabilmente non si dovrebbe utilizzare una scala di registro. – tacaswell
@tcaswell non è vero: se hai una funzione che è vicina alla legge di potenza (possibilmente con qualche piccola caratteristica), vuoi usare una scala di registro anche con intervalli piccoli. Quindi in una trama di log le zecche principali hanno una potenza di 10, quindi puoi avere un range [2000, 9000] e nessun tick principale –
Questo è quello che pensavo. Posso avere migliaia di punti tutti concentrati (con pochissima dispersione) attorno a un valore non vicino a qualsiasi potenza di 10 e voglio comunque applicare una scala di registro all'asse X. –