Упорядочивание и форматирование дат по оси X в Seaborn Bar Plot - PullRequest
0 голосов
/ 29 июня 2018

Это кажется таким простым, но я не могу с этим разобраться. 1001 *

Я новичок в 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 () ниже, чтобы попытаться воссоздать то, что происходит, когда я использую parse_dates в pd.read_csv (), именно так я на самом деле создаю фрейм данных.)

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

Я получаю это:

Гистограмма с датами в правильном порядке, но НЕПРАВИЛЬНЫЙ формат

Я получаю ту же гистограмму с правильно упорядоченными датами, но в полном длинном формате даты-времени, со временем и т. Д. Но все, что мне нужно, это день / месяц / год.

Я искал stackoverflow уже два дня, и ничего не помогло. Я начинаю задаваться вопросом, является ли отчасти причина в том, что я работаю над PythonAnywhere. Но я также не могу найти причину, почему это будет.

Это сводит меня с ума. Ждем любую помощь. Спасибо.

1 Ответ

0 голосов
/ 29 июня 2018

Используя ваш второй подход, просто отсортируйте и переформатируйте значения даты и времени в 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
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...