1
votes

Comment corriger l'ordre des étiquettes x dans le graphe matplotlib python

J'ai les données suivantes que j'essaye de tracer.

def plot_timeline_data(df):
    fig, ax = plt.subplots()

    ax.set_xticklabels(df['month'].unique(), rotation=90)

    for name, group in df.groupby('year'):
        ax.plot(group['month'], group['total_sales'], label=name,linestyle='--', marker='o')

    ax.legend()
    plt.tight_layout()
    plt.show()

Voici le code que j'utilise pour le faire:

month      year       total_sales
May         2020        7
June        2020        2  
July        2020        1
August      2020        2
September   2020        22 
October     2020       11
November    2020        6
December    2020        3
January     2019        3
feburary    2019        11
March       2019        65 
April       2019        22
May         2019        33
June        2019        88
July        2019        44
August      2019        12
September   2019        32
October     2019        54
November    2019        76
December    2019        23
January     2018        12
feburary    2018        32
March       2018        234
April       2018        2432
May         2018        432

Je veux que l'ordre des x étiquettes commence de janvier à décembre mais mon graphique commence de mai à décembre, puis reprend de janvier à avril comme indiqué sur la figure (les valeurs exactes du graphique sont différentes car j'ai changé les valeurs) . Comment puis-je mettre cela dans le bon ordre?

 entrez la description de l'image ici


0 commentaires

3 Réponses :


0
votes

Je pense que vous devez changer l'ordre de votre index 'month' dans le dataframe pandas. essayez d'ajouter:

group['month'] = group['month'][8:] + group['month'][:8]

avant de désactiver la boucle for pour tracer les années


0 commentaires

0
votes

Dataframe.plot vous facilite un peu la tâche - il trace chaque série sur une ligne différente et conserve l'ordre dans lequel vous vous inscrivez:

import matplotlib.pyplot as plt

# Convert the dataframe to series of years
df = df.set_index(["month","year"])["total_sales"].unstack()
# Sort the index (which is month)
df = df.loc[[
    "January","feburary","March","April","May","June",
    "July", "August", "September","October", "November", "December"
]]
# Plot!
df.plot(marker="o", linestyle="--", rot=90)
# Show all ticks
plt.xticks(range(12), df.index)

entrez la description de l'image ici


0 commentaires

1
votes

Vous pouvez utiliser la méthode suivante. L'idée est de trier la colonne du mois comme indiqué dans ceci et ce message

# Capitalize the month names
df["month"] = df["month"].str.capitalize()

# Correct the spelling of February
df['month'] = df['month'].str.replace('Feburary','February')

# Convert to datetime object for sorting
df['month_in'] = pd.DatetimeIndex(pd.to_datetime(df['month'], format='%B')).month

# Sort using the index
df = df.set_index('month_in').sort_index()

plot_timeline_data(df)

 entrez la description de l'image ici


0 commentaires