2013-06-18 11 views
8

In matplotlib, wenn ich eine log Skala auf einer Achse zu verwenden, kann es vorkommen, dass die Achse keine größere Zecken, nur geringe diejenigen hat. Das bedeutet also, dass keine Labels für die gesamte Achse angezeigt werden.Matplotlib: anzeigen Etiketten für kleinere Zecken auch

Wie kann ich angeben, dass ich Etiketten auch für kleine Ticks brauche?

Ich habe versucht:

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

... aber es hat nicht den Trick.

+0

nie meinen Verstand enge Abstimmung, falsch gelesen die Frage. Wenn Sie in Ihrem Diagramm keine größeren Log-Ticks haben, sollten Sie wahrscheinlich keinen Log-Maßstab verwenden. – tacaswell

+2

@tcaswell das ist nicht wahr: Wenn Sie eine Funktion haben, die in der Nähe von Potenzgesetz ist (möglicherweise mit einem kleinen Feature), möchten Sie eine Log-Skala auch mit kleinen Bereichen verwenden. Dann sind in einem logarithmischen Plot große Ticks in der Potenz von 10, so dass Sie eine Range [2000, 9000] und keine größeren Ticks haben können. –

+1

Das dachte ich mir. Ich kann Tausende von Punkten haben, die alle konzentriert sind (mit sehr geringer Streuung) um einen Wert, der nicht nahe einer Potenz von 10 ist und trotzdem eine logarithmische Skala auf die X-Achse anwenden möchte. –

Antwort

5

ich viele Möglichkeiten versucht haben, richtig in Log-Plots kleinere Zecken zum Laufen zu bringen. Wenn es Ihnen gut geht, das Protokoll des Werts des Ticks anzuzeigen, können Sie matplotlib.ticker.LogFormatterExponent verwenden. Ich erinnere mich daran, versucht matplotlib.ticker.LogFormatter, aber ich mochte es nicht viel: wenn ich mich gut erinnere, setzt es alles in base^exp (auch 0,1, 0, 1). In beiden Fällen (sowie in allen anderen matplotlib.ticker.LogFormatter*) müssen Sie labelOnlyBase=False setzen, um kleinere Ticks zu erhalten.

Ich endete beim Erstellen einer benutzerdefinierten Funktion und matplotlib.ticker.FuncFormatter verwenden. Bei meinem Ansatz wird davon ausgegangen, dass die Ticks ganzzahlige Werte haben und dass Sie ein logisches Basis-10-Protokoll wünschen.

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 

Wenn Sie nicht die großen Zecken entfernen und verwenden subs = [2.0, 3.0, 6.0] die Schriftgröße der Dur- und Moll-Zecken unterscheidet (dies könnte Ursache sein, indem Sie text.usetex:False in meinem matplotlibrc)

+2

Diese Funktion ist ein brillanter Ansatz, um eine gute Formatierung für logarithmische Markierungen zu erhalten! Guter Eintrag! –

11

Sie können set_minor_tickformatter auf der entsprechenden Achse verwenden:

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

Verwandte Themen