Pandas Plotting Muestra todos los valores de fecha en el eje x (matplolib solo muestra algunos valores) con el formato MMM-YYYY [duplicado]

Dec 17 2020
import os
import pandas as pd
import matplotlib.pyplot as plt
import datetime

df = pd.read_excel(DATA_DIR+"/"+file_list[0], index_col="Date")
df.head(5)

smooth = df['Pur. Rate'].rolling(window=20).mean()
smooth.plot()

Obtengo el siguiente gráfico y necesito trazar todos los valores de fecha para cada MES-AÑO en el eje x. Quiero mostrar todos los meses y años formateados en diagonal en el eje x en el formato (19 de febrero). Puedo agrandar el tamaño del gráfico para que quepa todo, ya que lo guardaré como jpg.

Quiero que el eje x tenga los siguientes valores: 16 de enero, 16 de febrero, 16 de marzo, 16 de abril, 16 de mayo, 16 de junio, 16 de julio, 16 de agosto, 16 de septiembre, 16 de octubre, 16 de noviembre, 16 de diciembre, 17 de enero , 17 de febrero… (Quiero mostrar todos estos valores, matplotlib trunca automáticamente esto, quiero evitar eso)

Respuestas

1 Mr.T Dec 17 2020 at 22:48

Como se mencionó en los comentarios, debe configurar tanto el localizador como el formateador. Esto se explica bien en la documentación de matplotlib para gráficos en general y por separado para ejes de fecha y hora . Consulte también una explicación de los TickLocators . Los códigos de formato se derivan de los códigos de formato strftime () y strptime () de Python .

from matplotlib import pyplot as plt
import pandas as pd
from matplotlib.dates import MonthLocator, DateFormatter


#fake data
import numpy as np
np.random.seed(123)
n = 100
df = pd.DataFrame({"Dates": pd.date_range("20180101", periods=n, freq="10d"), "A": np.random.randint(0, 100, size=n), "B": np.random.randint(0, 100, size=n),})
df.set_index("Dates", inplace=True)
print(df)

ax = df.plot()

#defines the tick location 
ax.xaxis.set_major_locator(MonthLocator())
#defines the label format
ax.xaxis.set_major_formatter(DateFormatter("%b-%y"))
ax.tick_params(axis="x", labelrotation= 90)

plt.tight_layout()
plt.show()

Salida de muestra:

Boul Dec 17 2020 at 20:47

Con solo funciones de pandas, puede usar stftime () para reemplazar su índice de esquema de fechas '% Y-% m-% d' por una nueva forma '% b-% Y' y algunos parámetros en la gráfica .

smoothdf.plot(xticks=smoothdf.index.strftime('%m-%Y').unique()).set_xticklabels(smoothdf.index.strftime('%b-%Y').unique())

xticks para especificar qué etiqueta desea ver.

set_xticklabels para modificar la lista de etiquetas.

LucaAngioloni Dec 17 2020 at 20:14

Le sugiero que use matplotlib y no pandas plot, y haga algo como esto para trazar las fechas en el formato que especificó:

import matplotlib.dates as mdates

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

myFmt = mdates.DateFormatter('%b-%Y') # date formatter for matplotlib
                                      # %b is Month abbreviated name, %Y is the Year

# ... after some code

fig, ax = plt.subplots(figsize=(15,8))

ax.xaxis.set_major_formatter(myFmt)
fig.autofmt_xdate()

# Plot data ...

ax.set_xticks("""... define how often to show the date""")

Puede obtener los datos del marco de datos con algo como: .to_numpy()o .values().

Consulte esta documentación para conocer la set_xticksfunción.