Pandas Plotting Mostrar todos los valores de la fecha en eje x (matplolib sólo muestra pocos valores) formateados como MMM-YYYY [duplicado]
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()
Tengo 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 diagonalmente en el eje x en el formato (Feb-19). Puedo hacer el tamaño de la trama más grande para encajar todo como lo guardaré como jpg.
Quiero que el eje x tenga los siguientes valores: 16 de enero, 16 de febrero, 16 de marzo, 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 febrero... (Quiero mostrar todos estos valores, matplotlib cambia automáticamente esto, quiero evitarlo)
Pregunta hecha hace 3 años, 4 meses, 28 días - Por binarybuilder
5 Respuestas:
-
Como se menciona en los comentarios, usted tiene que establecer ambos, el Localizador y el Formato. Esto se explica bien en la documentación matplotlib para gráficos en general y por separado para ejes de fecha. Véase también una explicación de la TickLocators. Los códigos de formato se derivan de Python's strftime() y strptime() códigos de formato.
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()
Respondida el Dec 17, 2020 a las 13:12 - por bytebard
Votos positivos: 0 | Votos negativos: 0 -
Con sólo funciones de pandas, se puede utilizar stftime() para reemplazar tus fechas índice de esquema '%Y-%m-%d' por una nueva forma '%b-%Y' y algunos params en parcela.
smoothdf.plot(xticks=smoothdf.index.strftime('%m-%Y').unique()).set_xticklabels(smoothdf.index.strftime('%b-%Y').unique())
xticks para especificar la etiqueta que usted absolutly desea ver.
set_xticklabels para modificar la lista de etiquetas.
Respondida el Dec 17, 2020 a las 13:22 - por quantumquasar
Votos positivos: 0 | Votos negativos: 0 -
Le sugiero que use matplotlib y no pandas plot, y haga algo así 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 sacar los datos del marco de datos con algo como:
.to_numpy()
o.values()
.Se refiere a esto documentación para el
set_xticks
función.Respondida el Dec 17, 2020 a las 13:31 - por codejuggernaut
Votos positivos: 0 | Votos negativos: 0 -
Para mostrar todos los valores de la fecha en el eje x de un gráfico de Pandas formateados como "MMM-YYYY" y evitar que Matplotlib cambie automáticamente los valores, puedes personalizar el eje x utilizando las funciones
set_xticks
yset_xticklabels
de Matplotlib.Aquí te muestro un ejemplo de cómo puedes lograr esto en tu código existente:
```python import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates
Leer datos
df = pd.readexcel(DATADIR+"/"+filelist[0], indexcol="Date")Calcular promedio móvil
smooth = df['Pur. Rate'].rolling(window=20).mean()Crear el gráfico
fig, ax = plt.subplots() smooth.plot(ax=ax)Obtener todas las fechas del DataFrame
dates = df.indexObtener todas las etiquetas de las fechas en el formato MMM-YYYY
date_labels = [date.strftime('%b-%y') for date in dates]Configurar el eje x con las fechas y etiquetas personalizadas
ax.setxticks(range(len(dates))) ax.setxticklabels(date_labelsRespondida el Dec 18, 2020 a las 13:10 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para mostrar todos los valores de fecha en el eje x en formato
MMM-YYYY
, puedes utilizar la funciónDateFormatter
de Matplotlib. Aquí tienes un ejemplo modificado de tu código:python 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()
Crea un formateador de fecha personalizado
date_formatter = matplotlib.dates.DateFormatter('%b-%Y')Dibuja la gráfica y aplica el formateador de fecha
fig, ax = plt.subplots() smooth.plot(ax=ax)Aplica el formateador de fecha al eje x
ax.xaxis.set_major_formatter(date_formatter)Rota las etiquetas del eje x en diagonal
plt.xticks(rotation=45)Ajusta el tamaño de la trama
fig.set_size_inches(12, 6)Guarda la gráfica como JPG
plt.savefig('grafica.jpg')Respondida el Dec 18, 2020 a las 13:23 - por Gemini
Votos positivos: 0 | Votos negativos: 0