Centrar las tags del eje x en el trazado lineal.

Estoy construyendo una línea de trazado con dos líneas, una para altas temperaturas y otra para bajas temperaturas. El eje x se basa en días durante un año completo en el formato de fecha y hora (2014-01-01, etc.). Sin embargo, cambié las tags, no los datos, por meses (enero, febrero, marzo, etc.). El problema es que la primera etiqueta ‘Jan’ está en el origen. Lo que quiero es mover todas las tags a la derecha para centrarlas entre marcas .

fig, ax = plt.subplots() plt.plot(x, y1) plt.plot(x, y2) # Change x-axis from %y-%m-%d format to %m: monthsFmt = mdates.DateFormatter('%m') plt.gca().xaxis.set_major_formatter(monthsFmt) # Replace numeric x-axis labels (1,2,3, ..., 12) for abbreviations of months ('Jan', 'Feb', 'Mar', etc.): labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] ax.set_xticklabels(labels) # CODE GOES HERE TO CENTER X-AXIS LABELS... # Render plot: plt.show() 

Este es el resultado que estoy buscando :

introduzca la descripción de la imagen aquí

Usar las marcas menores como se sugiere en el hilo publicado por DavidG debería funcionar. A continuación se muestra un MWE que he adaptado para su problema específico, forzando a que aparezcan las principales marcas en el primer día de cada mes y usando las marcas menores para colocar las tags entre las principales marcas:

 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import datetime # Generate some data for example : yr = 2014 fig, ax = plt.subplots() x0 = datetime.datetime(yr, 1, 1) x = np.array([x0 + datetime.timedelta(days=i) for i in range(365)]) y1 = np.sin(2*np.pi*np.arange(365)/365) + np.random.rand(365)/5 y2 = np.sin(2*np.pi*np.arange(365)/365) + np.random.rand(365)/5 - 1 # Draw high and low temperatures lines : ax.plot(x, y1, color='#c83c34') ax.plot(x, y2, color='#28659c') ax.fill_between(x, y2, y1, facecolor='#daecfd', alpha=0.5) # Force the major ticks position on the first of each month and hide labels: xticks = [datetime.datetime(yr, i+1, 1) for i in range(12)] xticks.append(datetime.datetime(yr+1, 1, 1)) ax.set_xticks(xticks) ax.tick_params(axis='both', direction='out', top=False, right=False) ax.axis([xticks[0], xticks[-1], -2.5, 1.5]) ax.set_xticklabels([]) # CODE GOES HERE TO CENTER X-AXIS LABELS... labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] mticks = ax.get_xticks() ax.set_xticks((mticks[:-1]+mticks[1:])/2, minor=True) ax.tick_params(axis='x', which='minor', length=0) ax.set_xticklabels(labels, minor=True) fig.tight_layout() plt.show() 

lo que resulta en: introduzca la descripción de la imagen aquí

A menudo tiene sentido usar fechas directamente al trazar. Entonces, en lugar de establecer manualmente ubicaciones fijas para las tags, uno puede usar los localizadores matplotlib.dates . Para posicionar las garrapatas en la mitad de los meses, uno podría elegir el día 15 del mes,

 matplotlib.dates.MonthLocator(bymonthday=15) 

Un ejemplo completo:

 import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates import matplotlib.ticker as mticker import random df = pd.DataFrame(random.sample(range(10000),8760), index = pd.date_range(start ='2013-01-01 00:00:00', end ='2013-12-31 23:30:00', freq='1H'), columns =['value']) fig, ax = plt.subplots() ax.plot(df.index, df['value']) ax.set_xlim(pd.Timestamp('2013-01-01 00:00:00'), pd.Timestamp('2013-12-31 23:30:00')) months = mdates.MonthLocator(bymonth =(1,6,12), bymonthday=15 ) allmonths = mdates.MonthLocator() m_fmt = mdates.DateFormatter('%b') ax.xaxis.set_major_locator(allmonths) ax.xaxis.set_minor_locator(months) ax.xaxis.set_major_formatter(mticker.NullFormatter()) ax.xaxis.set_minor_formatter(m_fmt) ax.tick_params(axis="x", which="minor", length=0) plt.show() 

introduzca la descripción de la imagen aquí

Casi, Jean-Sébastien . Se ve todo perfecto pero el último mes. No aparece.

Tu solución se ha ajustado un poco:

 fig, ax = plt.subplots() # Draw high and low temperatures lines: plt.plot(x, y1, color = '#c83c34') plt.plot(x, y2, color = '#28659c') # Fill area between lines: plt.gca().fill_between(x, y2, y1, facecolor='#daecfd', alpha=0.5) # Force major ticks on a monthly time scale only: locator = mpl.dates.MonthLocator() ax.xaxis.set_major_locator(locator) # Hide major labels and set axis limits: ax.set_xticklabels([]) ax.tick_params(axis='both', direction='out') ax.axis(xmin=datetime.datetime(2014, 1, 1), xmax=datetime.datetime(2014, 12, 31), ymin=-50, ymax=50) labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] mticks = ax.get_xticks() ax.set_xticks((mticks[:-1]+mticks[1:])/2, minor=True) ax.tick_params(axis='x', which='minor', length=0) ax.set_xticklabels(labels, minor=True) plt.show() 

La ttwig que tengo es esta: introduzca la descripción de la imagen aquí

¿Alguna pista sobre lo que se necesita para incluir diciembre en las tags del eje x? De todos modos, muchas gracias.