Seaborn Barplot Дата Оси не форматируется - PullRequest
0 голосов
/ 30 апреля 2020

enter image description here

Как отрегулировать форматирование даты оси x морского побережья? Я обычно использую

ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))

, но это выдает ошибку

ValueError: DateFormatter found a value of x=0, which is an illegal date

, несмотря на то, что данные даты правильно отформатированы как dtype = 'datetime64 [ns]' и нет значений 0.

Диаграмма создается с помощью

data = data.melt('Name', var_name='country', value_name='cpi')
data.set_index('Name',inplace=True)
fig, ax = plt.subplots(figsize=(10, 6), dpi=80)
ax = sns.barplot(x=data.index, y='cpi', hue='country', data=data, ax=ax)
fig.autofmt_xdate()

так выглядят данные оси даты:

data.index
Out[286]: 
DatetimeIndex(['2019-04-30', '2019-05-31', '2019-06-30', '2019-07-31',
               '2019-08-31', '2019-09-30', '2019-10-31', '2019-11-30',
               '2019-12-31', '2020-01-31', '2020-02-29', '2020-03-31',
               '2019-04-30', '2019-05-31', '2019-06-30', '2019-07-31',
               '2019-08-31', '2019-09-30', '2019-10-31', '2019-11-30',
               '2019-12-31', '2020-01-31', '2020-02-29', '2020-03-31',
               '2019-04-30', '2019-05-31', '2019-06-30', '2019-07-31',
               '2019-08-31', '2019-09-30', '2019-10-31', '2019-11-30',
               '2019-12-31', '2020-01-31', '2020-02-29', '2020-03-31',
               '2019-04-30', '2019-05-31', '2019-06-30', '2019-07-31',
               '2019-08-31', '2019-09-30', '2019-10-31', '2019-11-30',
               '2019-12-31', '2020-01-31', '2020-02-29', '2020-03-31',
               '2019-04-30', '2019-05-31', '2019-06-30', '2019-07-31',
               '2019-08-31', '2019-09-30', '2019-10-31', '2019-11-30',
               '2019-12-31', '2020-01-31', '2020-02-29', '2020-03-31',
               '2019-04-30', '2019-05-31', '2019-06-30', '2019-07-31',
               '2019-08-31', '2019-09-30', '2019-10-31', '2019-11-30',
               '2019-12-31', '2020-01-31', '2020-02-29', '2020-03-31'],
              dtype='datetime64[ns]', name='Name', freq=None)

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Ваше решение кажется хорошим; Я проголосовал за это.
Если вы хотите что-то менее подробное, вы можете сделать:

x_dates = data.index.strftime('%b %Y').sort_values().unique()
ax.set_xticklabels(labels=x_dates, rotation=45, ha='right')

С этим вам не нужен вызов fig.autofmt_xdate().

1 голос
/ 30 апреля 2020

Тем временем я разобрался с рабочим решением, используя следующую настройку

    ax.set_xticklabels([datetime.strptime(t.get_text(), '%Y-%m-%dT%H:%M:%S.%f000').strftime('%b %Y') for t in ax.get_xticklabels()])

Я не думаю, что это очень красиво, так что если у вас есть еще способ Pythoni c, чтобы решить эту проблему, пожалуйста, дайте мне знать .

...