2013-06-18 15 views
8

In matplotlib, quando uso una scala log su un asse, può succedere che tale asse avrà grosse zecche, solo lievi quelli. Quindi questo significa che non vengono visualizzate etichette per l'intero asse.Matplotlib: mostra le etichette per minore zecche anche

Come posso specificare che ho bisogno di etichette anche per tick secondari?

ho provato:

plt.setp(ax.get_xticklabels(minor=True), visible=True) 

... ma non ha fatto il trucco.

+0

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

+2

@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 –

+1

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. –

risposta

5

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)

+2

Questa funzione è un approccio brillante per ottenere una buona formattazione per le etichette logaritmiche del segno di spunta! Ottimo post! –

11

È possibile utilizzare set_minor_tickformatter sull'asse corrispondente:

from matplotlib import pyplot as plt 
from matplotlib.ticker import FormatStrFormatter 

axes = plt.subplot(111) 
axes.loglog([3,4,7], [2,3,4]) 
axes.xaxis.set_minor_formatter(FormatStrFormatter("%.2f")) 
plt.xlim(1.8, 9.2) 
plt.show() 

enter image description here

Problemi correlati