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, 29 días - Por techmaestro
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:14 - por codechampionx
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:20 - 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:29 - por byteninja8245
Votos positivos: 0 | Votos negativos: 0 -
Para mostrar todos los valores de la fecha en el eje x con el formato deseado (MMM-YYYY) en un gráfico de Pandas utilizando Matplotlib, puedes personalizar el eje x utilizando la función
set_xticks
yset_xticklabels
.Aquí te muestro un ejemplo de cómo hacerlo en tu código:
python import pandas as pd import matplotlib.pyplot as plt
Crear un DataFrame de ejemplo
dates = pd.date_range('2021-01-01', periods=100) values = range(100) df = pd.DataFrame({'Date': dates, 'Value': values}) df.set_index('Date', inplace=True)Calcular el valor suavizado
smooth = df['Value'].rolling(window=20).mean()Plotear el gráfico
plt.figure(figsize=(12, 6))Definir el tamaño de la figura
smooth.plot()Personalizar el eje x con el formato deseado (MMM-YYYY)
plt.xticks(df.index, [date.strftime('%b-%y') for date in df.index], rotation=45) plt.show()En este código, la función
plt.xticks
se utiliza para establecer las marcas enRespondida el Dec 18, 2020 a las 13:11 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para mostrar todos los valores de fecha en el eje x y formatearlos como MMM-YYYY, puedes utilizar el objeto
Locator
de Matplotlib. Aquí tienes un ejemplo de cómo hacerlo:python import matplotlib.dates as mdates
Crea un objeto Locator para mostrar todas las fechas
locator = mdates.MonthLocator()Crea un objeto Formatter para formatear las fechas como MMM-YYYY
formatter = mdates.DateFormatter('%b-%Y')Configura el eje x para utilizar el Locator y Formatter
ax.xaxis.set_major_locator(locator) ax.xaxis.set_major_formatter(formatter)Rota las etiquetas del eje x para que aparezcan en diagonal
plt.xticks(rotation=45)Ejemplo:
python import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates df = pd.DataFrame({'date': ['2020-01-16', '2020-02-16', '2020-03-16', '2020-05-16', '2020-06-16', '2020-07-16', '2020-08-16', '2020-09-16', '2020-10-16', '2020-11-16', '2020-12-16', '2021-02-16'], 'value': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]})
Crea un objeto Locator para mostrar todas las fechas
locator = mdates.MonthLocator()Crea un objeto Formatter para formatear las fechas como MMM-YYYY
formatter = mdates.DateFormatter('%b-%Y')Configura el eje x para utilizar el Locator y Formatter
plt.figure(figsize=(10, 6)) ax = plt.gca() ax.xaxis.set_major_locator(locator) ax.xaxis.set_major_formatter(formatter)Traza los datos
df.plot(x='date', y='value')Rota las etiquetas del eje x para que aparezcan en diagonal
plt.xticks(rotation=45)Muestra el gráfico
plt.show()Esto generará un gráfico con todas las fechas en el eje x formateadas como MMM-YYYY. Las etiquetas del eje x se rotarán diagonalmente para mejorar la legibilidad.
Respondida el Dec 18, 2020 a las 13:20 - por Gemini
Votos positivos: 0 | Votos negativos: 0