 <p>I've been fighting with something like what you show (only one major tick in the axis range). None of the matplotlib tick formatter satisfied me, so I use <code>matplotlib.ticker.FuncFormatter</code> to achieve what I wanted. I haven't tested with twin axes, but my feeling is that it should work anyway.</p> <pre><code>import matplotlib.pyplot as plt from matplotlib import ticker import numpy as np #@Mark: thanks for the suggestion :D mi, ma, conv = 4, 8, 1./3. x = np.linspace(mi, ma, 20) y = 1 / (x ** 4) fig, ax = plt.subplots() ax.plot(x, y) # plot the lines ax.set_xscale('log') #convert to log ax.set_yscale('log') ax.set_xlim([0.2, 1.8]) #large enough, but should show only 1 tick def ticks_format(value, index): """ This function decompose value in base*10^{exp} and return a latex string. If 0&lt;=value&lt;99: return the value as it is. if 0.1&lt;value&lt;0: returns as it is rounded to the first decimal otherwise returns $base*10^{exp}$ I've designed the function to be use with values for which the decomposition returns integers """ 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)) # here specify which minor ticks per decate you want # likely all of them give you a too crowed axis subs = [1., 3., 6.] # set the minor locators ax.xaxis.set_minor_locator(ticker.LogLocator(subs=subs)) ax.yaxis.set_minor_locator(ticker.LogLocator(subs=subs)) # remove the tick labels for the major ticks: # if not done they will be printed with the custom ones (you don't want it) # plus you want to remove them to avoid font missmatch: the above function # returns latex string, and I don't know how matplotlib does exponents in labels ax.xaxis.set_major_formatter(ticker.NullFormatter()) ax.yaxis.set_major_formatter(ticker.NullFormatter()) # set the desired minor tick labels using the above function ax.xaxis.set_minor_formatter(ticker.FuncFormatter(ticks_format)) ax.yaxis.set_minor_formatter(ticker.FuncFormatter(ticks_format)) </code></pre> <p>The figure that I get is the following <img src="https://i.stack.imgur.com/HfNWP.png" alt="enter image description here">:</p> <p>Of course you can set different minor locators for x and y axis and you can wrap everything from <code>ticks_format</code> to the end into a function that accepts an axes instance <code>ax</code> and <code>subs</code> or <code>subsx</code> and <code>subsy</code> as input parameters.</p> <p>I hope that this helps you</p>