Matplotlib: mostrar tags para garrapatas menores también

En matplotlib , cuando utilizo una escala de log en un eje, puede suceder que ese eje no tenga grandes tics , solo pequeños. Esto significa que no se muestran tags para todo el eje.

¿Cómo puedo especificar que necesito tags también para marcas menores?

Lo intenté:

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

… pero no hizo el truco.

He intentado muchas formas de hacer que las garrapatas menores funcionen correctamente en los gráficos de registros. Si no está de acuerdo con mostrar el registro del valor de la marca, puede usar matplotlib.ticker.LogFormatterExponent . Recuerdo haber intentado matplotlib.ticker.LogFormatter pero no me gustó mucho: si recuerdo bien, pone todo en base^exp (también 0.1, 0, 1). En ambos casos (al igual que todos los demás matplotlib.ticker.LogFormatter* ), debe establecer labelOnlyBase=False para obtener labelOnlyBase=False menores.

Terminé creando una función personalizada y uso matplotlib.ticker.FuncFormatter . Mi enfoque supone que los tics están en valores enteros y que desea un registro de 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 

Si no elimina las marcas principales y usa subs = [2.0, 3.0, 6.0] el tamaño de fuente de las text.usetex:False mayores y menores es diferente (esto podría deberse al uso de text.usetex:False en mi matplotlibrc )

Puede usar set_minor_tickformatter en el eje correspondiente:

 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() 

introduzca la descripción de la imagen aquí

Creo que vale la pena mencionar la opción “minor_thresholds” introducida en matplotlib versión 2.0 ( enlace docs ). Es un parámetro en forma de un par (subconjunto, todos) de la clase LogFormatter que le permite especificar cuándo se debe mostrar un subconjunto (fijo) de marcas de verificación menores y cuándo se deben mostrar todas las tags de verificación menores (explicación de lo que esto significa en el fondo).

En el siguiente código muestro el efecto utilizando los mismos valores de parámetros ((2, 0.4) en este caso) pero cambiando los límites del eje x:

 import matplotlib.pyplot as plt from matplotlib.ticker import LogFormatter import numpy as np fig, axes = plt.subplots(4, figsize=(12, 24)) dt = 0.01 t = np.arange(dt, 20.0, dt) # first plot doesn't use a formatter axes[0].semilogx(t, np.exp(-t / 5.0)) axes[0].set_xlim([0, 25]) axes[0].grid() xlims = [[0, 25], [0.2, 8], [0.6, 0.9]] for ax, xlim in zip(axes[1:], xlims): ax.semilogx(t, np.exp(-t / 5.0)) formatter = LogFormatter(labelOnlyBase=False, minor_thresholds=(2, 0.4)) ax.get_xaxis().set_minor_formatter(formatter) ax.set_xlim(xlim) ax.grid() plt.show() 

Esto da lugar a la siguiente ttwig: introduzca la descripción de la imagen aquí

Verá que en la segunda fila las marcas de verificación son las mismas que en la primera fila donde no usamos un formateador. Esto se debe a que el registro del rango de vista es más de 2 (el primer valor del par de parámetros) o, para decirlo de manera diferente, la vista abarca un rango que es más grande que un rango entre dos marcas de verificación principales. En la tercera fila, la vista es más pequeña que 2 pero más grande que 0,4 (el segundo valor del par de parámetros), por lo que vemos un subconjunto de las marcas de verificación menores. Finalmente, en la última fila, la vista abarca menos de 0,4 del espacio entre dos marcas de verificación principales, por lo que se muestran todas las marcas de verificación secundarias.