Centrado de las tags x-tick entre las marcas en matplotlib

Quiero tener las tags de fecha de marca x centradas entre las marcas de verificación, en lugar de centrarse sobre las marcas de verificación como se muestra en la foto de abajo.

He leído la documentación pero en vano, ¿alguien sabe una manera de hacer esto?

introduzca la descripción de la imagen aquí

Aquí está todo lo que he usado para mi formato de marca del eje x si ayuda:

day_fmt = '%d' myFmt = mdates.DateFormatter(day_fmt) ax.xaxis.set_major_formatter(myFmt) ax.xaxis.set_major_locator(matplotlib.dates.DayLocator(interval=1)) for tick in ax.xaxis.get_major_ticks(): tick.tick1line.set_markersize(0) tick.tick2line.set_markersize(0) tick.label1.set_horizontalalignment('center') 

Una forma de hacerlo es usar las garrapatas menores. La idea es que establezca las marcas menores para que estén ubicadas a medio camino entre las marcas principales y especifique las tags manualmente.

Por ejemplo:

 import matplotlib.ticker as ticker # a is an axes object, eg from figure.get_axes() # Hide major tick labels a.xaxis.set_major_formatter(ticker.NullFormatter()) # Customize minor tick labels a.xaxis.set_minor_locator(ticker.FixedLocator([1.5,2.5,3.5,4.5,5.5])) a.xaxis.set_minor_formatter(ticker.FixedFormatter(['1','2','3','4','5'])) 

Las tres líneas:

  • “Oculta” el 1,2,3,4, … que tienes en las principales garrapatas
  • Establezca marcas menores a medio camino entre las marcas principales (suponiendo que sus marcas principales estén en 1,2,3 …)
  • Especifica manualmente las tags para las marcas menores. Aquí, ‘1’ estaría entre 1.0 y 2.0 en el gráfico.

Este es solo un ejemplo simple. Probablemente querrá simplificarlo un poco al rellenar las listas en un bucle o algo así.

También puedes experimentar con otros localizadores o formateadores .

Edit: Alternativamente, como se sugiere en los comentarios:

 # Hide major tick labels a.set_xticklabels('') # Customize minor tick labels a.set_xticks([1.5,2.5,3.5,4.5,5.5], minor=True) a.set_xticklabels(['1','2','3','4','5'], minor=True) 

Ejemplo:

Antes de: antes de

Después: introduzca la descripción de la imagen aquí

Aquí hay una alternativa al uso de localizadores y formateadores. Puede ser utilizado para cualquier espaciado entre tags:

 # tick_limit: the last tick position without centering (16 in your example) # offset: how many steps between each tick (1 in your example) # myticklabels: string labels, optional (range(1,16) in your example) # need to set limits so the following works: ax.xaxis.set_ticks([0, tick_limit]) # offset all ticks between limits: ax.xaxis.set(ticks=np.arange(offset/2., tick_limit, offset), ticklabels=myticklabels) # turn off grid ax.grid(False) 

Dado que esto modifica las marcas principales, es posible que la cuadrícula deba ajustarse, dependiendo de la aplicación. También es posible ax.twinx() esto utilizando ax.twinx() ). Esto resultará en mover las tags en el lado opuesto de un eje separado, pero dejará la cuadrícula original sin tocar y dará dos cuadrículas, una para las marcas originales y otra para las compensaciones.

Editar:

Asumiendo tics enteros espaciados uniformemente, esta es probablemente la forma más simple:

 ax.set_xticks([float(n)+0.5 for n in ax.get_xticks()]) 

Una alternativa simple es usar la alineación horizontal y manipular las tags agregando espacios, como en el MWE a continuación.

 #python v2.7 import numpy as np import pylab as pl from calendar import month_abbr pl.close('all') fig1 = pl.figure(1) pl.ion() x = np.arange(120) y = np.cos(2*np.pi*x/10) pl.subplot(211) pl.plot(x,y,'r-') pl.grid() new_m=[] for m in month_abbr: #'', 'Jan', 'Feb', ... new_m.append(' %s'%m) #Add two spaces before the month name new_m=np.delete(new_m,0) #remove first void element pl.xticks(np.arange(0,121,10), new_m, horizontalalignment='left') pl.axis([0,120,-1.1,1.1]) fig1name = './labels.png' fig1.savefig(fig1name) 

La figura resultante:

Aproximadamente centradas etiquetas de tick