python - ticks - tick_params
Centrado de etiquetas x-tick entre marcas en matplotlib (3)
Quiero tener las etiquetas de fecha con marca x centradas entre las marcas, en lugar de centrarse sobre las marcas como se muestra en la foto de abajo.
He leído la documentación, pero sin éxito, ¿alguien sabe una manera de hacer esto?
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'')
Aquí hay una alternativa al uso de localizadores y formateadores. Puede ser utilizado para cualquier espaciado entre etiquetas:
# 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 evitar esto utilizando ax.twinx()
). Esto resultará en mover las etiquetas 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 etiquetas 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:
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 etiquetas manualmente.
Por ejemplo:
import matplotlib.ticker as ticker
# a is an axes object, e.g. 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 etiquetas 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:
Después: