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

    Salida de la muestra:![enter image description here

    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 y set_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.index

    Obtener 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_labels

    Respondida 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ón DateFormatter 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