web-dev-qa-db-fra.com

Dates de commande et de formatage sur l'axe des X dans le graphique à barres Seaborn

Cela semble si simple, mais pour la vie de moi, je ne peux pas le comprendre.

Je suis nouveau sur Python et Seaborn, et je fais tout cela en ligne sur PythonAnywhere.

Tout ce que j'essaie de faire est de créer un simple barplot dans seaborn, avec des dates correctement ordonnées (c'est-à-dire ascendantes de gauche à droite), sur l'axe des x.

Quand j'essaye ceci:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime
import pandas as pd
import seaborn as sns

emp = pd.DataFrame([[32, "5/31/2018"], [3, "2/28/2018"], [40, "11/30/2017"], [50, "8/31/2017"], [51, "5/31/2017"]], 
               columns=["jobs", "12monthsEnding"])

fig = plt.figure(figsize = (10,7))

sns.barplot(x = "12monthsEnding", y = "uniqueClientExits", data = emp, 
estimator = sum, ci = None)

fig.autofmt_xdate()
plt.show()

J'ai compris:

Joli graphique à barres mais avec les dates ordonnées descendant de gauche à droite

Et puis quand j'essaie de convertir les objets en datetime:

(Remarque: j'utilise pd.to_datetime () ci-dessous afin d'essayer de recréer ce qui se passe lorsque j'utilise parse_dates dans pd.read_csv (), c'est ainsi que je crée réellement la trame de données.)

emp = pd.DataFrame([[32, pd.to_datetime("5/31/2018")], [3, pd.to_datetime("2/28/2018")], [40, pd.to_datetime("11/30/2017")], [50, pd.to_datetime("8/31/2017")], [51, pd.to_datetime("5/31/2017")]], 
               columns=["jobs", "12monthsEnding"])

fig = plt.figure(figsize = (10,7))

sns.barplot(x = "12monthsEnding", y = "uniqueClientExits", data = emp, 
estimator = sum, ci = None)

fig.autofmt_xdate()

plt.show()

J'ai compris:

Diagramme à barres avec les dates dans le bon ordre, mais au mauvais format

Je reçois le même graphique à barres, avec les dates ordonnées correctement, mais au format datetime complet, avec l'heure, etc. Mais tout ce que je veux c'est le jour/mois/année.

J'ai parcouru stackoverflow pendant deux jours maintenant et rien n'a fonctionné. Je commence à me demander si une partie de la raison est parce que je travaille sur PythonAnywhere. Mais je ne trouve pas non plus de raison pour que ce soit le cas.

Ça me rend dingue. Dans l'attente de toute assistance. Merci.

5
ngunsch

En utilisant votre deuxième approche, il vous suffit de trier et de reformater les valeurs datetime en YYYY-MM-DD Et de passer des valeurs dans set_xticklabels. Ci-dessous illustre avec des données aléatoires et prédéfinies:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

# RANDOM DATA
np.random.seed(62918)
emp = pd.DataFrame({'uniqueClientExits': [np.random.randint(15) for _ in range(50)],
                    '12monthsEnding': pd.to_datetime(
                                          np.random.choice(
                                              pd.date_range('2018-01-01', periods=50), 
                                          50)
                                      )
                   }, columns = ['uniqueClientExits','12monthsEnding'])

# PLOTTING
fig, ax = plt.subplots(figsize = (12,6))    
fig = sns.barplot(x = "12monthsEnding", y = "uniqueClientExits", data = emp, 
                  estimator = sum, ci = None, ax=ax)

x_dates = emp['12monthsEnding'].dt.strftime('%Y-%m-%d').sort_values().unique()
ax.set_xticklabels(labels=x_dates, rotation=45, ha='right')

Plot Output

Pour vérifier la sortie du graphique, exécutez une groupby().sum():

print(emp.groupby('12monthsEnding').sum().head())

#                 uniqueClientExits
# 12monthsEnding                   
# 2018-01-01                     12
# 2018-01-02                      4
# 2018-01-04                     11
# 2018-01-06                     13
# 2018-01-08                     10
# 2018-01-11                     11
# 2018-01-14                      9
# 2018-01-15                      0
# 2018-01-16                      4
# 2018-01-17                      5
# ...
7
Parfait