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)

enter image description here

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

enter image description here

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()
    

    Salida de la muestra:![enter image description here

    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 y set_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 en

    Respondida 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