web-dev-qa-db-ja.com

シーボーンバープロットのX軸の日付の順序とフォーマット

これはとてもシンプルに思えますが、私の人生ではそれを理解することはできません。

私はPythonとSeabornを初めて使用し、PythonAnywhereでこれをすべてオンラインで行っています。

私がやろうとしていることは、シーボーンで単純なバープロットを作成し、日付をx軸に適切に(つまり、左から右に昇順に)並べることです。

私がこれを試すとき:

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

私はこれを手に入れます:

見栄えの良い棒グラフですが、日付が左から右に降順

次に、オブジェクトをdatetimeに変換しようとすると、次のようになります。

(注:以下のpd.to_datetime()を使用して、pd.read_csv()でparse_datesを使用したときに何が起こるかを再作成しています。これは、実際にデータフレームを作成している方法です。)

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

私はこれを手に入れます:

日付が正しい順序の棒グラフですが、形式が間違っています

日付が適切に並べられた同じバープロットが表示されますが、完全な長い日時形式、時間などが表示されます。ただし、必要なのは日/月/年だけです。

私は今から2日間、stackoverflowを調べましたが、何も機能しませんでした。その理由の一部がPythonAnywhereに取り組んでいるためかどうか疑問に思い始めています。しかし、その理由もわかりません。

これは私にナッツを運転しています。ご支援をお待ちしております。ありがとう。

5
ngunsch

2番目の方法を使用して、日時の値を並べ替えて再フォーマットし、_YYYY-MM-DD_に再フォーマットして、値を_set_xticklabels_に渡します。以下は、ランダムでシードされたデータを示しています。

_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

グラフの出力を確認するには、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