Eje de fechas en matplotlib

Matplotlib puede representar fechas y horas directamente a partir de objetos datetime de Python, arrays datetime64 de NumPy o columnas de fechas de pandas. El módulo matplotlib.dates proporciona localizadores para colocar los ticks y formateadores para elegir cómo se muestran las fechas.

Representar fechas

Pasa las fechas como valores del eje X. Matplotlib detecta que son fechas y elige la posición y el formato de los ticks automáticamente.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()

fig, ax = plt.subplots()
ax.plot(dates, values)
# plt.show()

Representar fechas en matplotlib

Cuando las etiquetas se solapan, como en el gráfico anterior, tienes varias opciones: usar un formato más compacto, rotar las etiquetas o reducir el número de ticks.

Formato de fecha conciso

ConciseDateFormatter muestra la información mínima necesaria en cada etiqueta (por ejemplo, el año una sola vez) y suele ser la mejor opción para series temporales.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()
import matplotlib.dates as mdates

fig, ax = plt.subplots()
ax.plot(dates, values)

locator = mdates.AutoDateLocator()
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(mdates.ConciseDateFormatter(locator))
# plt.show()

Formateador de fechas conciso en matplotlib

Formato de fecha personalizado

Utiliza DateFormatter con una cadena de formato para elegir cómo se muestran las fechas. Los códigos más habituales son %Y (año), %m (mes en número), %b (nombre del mes abreviado), %B (nombre del mes completo), %d (día), %H (hora) y %M (minutos).

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()
import matplotlib.dates as mdates

fig, ax = plt.subplots()
ax.plot(dates, values)

ax.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
# plt.show()

Cambiar el formato de las fechas en matplotlib con DateFormatter

Ticks de fechas cada mes, semana o día

Los localizadores establecen la posición de los ticks. MonthLocator, WeekdayLocator, DayLocator, YearLocator y HourLocator colocan un tick cada cierto intervalo. También puedes agregar ticks secundarios con un localizador diferente.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()
import matplotlib.dates as mdates

fig, ax = plt.subplots()
ax.plot(dates, values)

ax.xaxis.set_major_locator(mdates.MonthLocator(interval = 3))
ax.xaxis.set_minor_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b"))
# plt.show()

Ticks de fechas cada mes en matplotlib

Rotar las etiquetas de las fechas

fig.autofmt_xdate rota y alinea a la derecha las etiquetas de las fechas para que no se solapen. También puedes usar ax.tick_params(axis = "x", labelrotation = 45).

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()

fig, ax = plt.subplots()
ax.plot(dates, values)

fig.autofmt_xdate()
# plt.show()

Rotar las etiquetas de las fechas en matplotlib

Límites de fechas

Para hacer zoom en un periodo pasa fechas a set_xlim. Pueden ser objetos datetime o timestamps de pandas.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()
import matplotlib.dates as mdates

fig, ax = plt.subplots()
ax.plot(dates, values)

ax.set_xlim(pd.Timestamp("2025-03-01"), pd.Timestamp("2025-06-30"))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d %b"))
# plt.show()

Establecer los límites de un eje de fechas en matplotlib

Fechas con pandas

Si tus datos están en un data frame de pandas con una columna de fechas (o un índice de fechas) puedes pasar las columnas a matplotlib directamente. Asegúrate de que la columna es de tipo fecha y conviértela con pd.to_datetime si es necesario.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({"date": ["2025-01-01", "2025-02-01", "2025-03-01"],
                   "value": [10, 15, 12]})
df["date"] = pd.to_datetime(df["date"])

fig, ax = plt.subplots()
ax.plot(df["date"], df["value"])
# plt.show()

Aprende a personalizar el resto de elementos de los ejes en el tutorial sobre la personalización de los ejes en matplotlib o cómo crear un gráfico de líneas en matplotlib.

Better Data Visualizations

A Guide for Scholars, Researchers, and Wonks

Comprar en Amazon

También te puede interesar