Установка оси X в качестве даты с использованием mdates с помощью matplotlib - PullRequest
0 голосов
/ 05 июня 2018

Я загружаю эти пакеты:

import pandas as pd
from matplotlib import pyplot as plt
import numpy
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib
import matplotlib.dates as mdates
sns.set()
%matplotlib inline

И у меня есть фрейм данных df, который выглядит следующим образом

df['element_date'] = pd.to_datetime(df['element_date'])
df['mdate'] = [mdates.date2num(d) for d in df['element_date']]
df.head()

id            Tier    element     element_date           mdate
5228039     Tier B      4      2018-05-28 10:59:00  736842.457639
5232263     Tier B      3      2018-05-28 10:59:00  736842.457639
5245478     Tier B      EA     2018-05-27 13:58:00  736841.581944
4975552     Tier B      2      2018-05-30 21:01:00  736844.875694
4975563     Tier A      2      2018-05-30 21:01:00  736844.875694

Я пытаюсь установить ось хграфик подсчета только для месяца и дня, и я получаю сообщение об ошибке.Это код, который я запускаю (я удалил ярлыки имен для экономии места):

fig, ax = plt.subplots(figsize=(15,10))
fig = sns.countplot(x="mdate", hue="element", data=df)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
plt.show(fig)

Я получаю DateFormatter found a value of x=0, which is an illegal date. This usually occurs because you have not informed the axis that it is plotting dates, e.g., with ax.xaxis_date()

Теперь, конечно, япробовал добавить ax.xaxis_date(), но безрезультатно.У меня также нет значений x, равных 0. Я сбросил NA, и значение подсчитано как mdate, и 0 не найдено.

Я посмотрел здесь несколько разных ответов и, похоже, не могу найти решение.Я пробовал использовать как 1017 * в качестве значения даты и времени, так и даты "mathplotlib", используя mdate.

. Любые мысли будут высоко оценены.По сути, я просто пытаюсь сделать так, чтобы моя ось х была упорядоченной серией дат в течение двух месяцев с подсчетом элементов для каждой даты.

Спасибо!

1 Ответ

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

Закрывшись на странице проблем GitHub для панд, пользователь @pawaller нашел обходной путь , используя plt.FixedFormatter, где вы форматируете строку в столбце даты и времени.

ax.xaxis.set_major_formatter(plt.FixedFormatter(df['element_date'].dt.strftime("%m-%d")))

Однако,Использование выше не сразу работает, так как метки значений не в порядке и не выровнены должным образом.Следовательно, unique() и sort_values() требуются:

x_dates = df['element_date'].dt.strftime('%m-%d').sort_values().unique()
ax.xaxis.set_major_formatter(plt.FixedFormatter(x_dates))

Для демонстрации ниже (где столбец mdate никогда не используется):

Данные

from io import StringIO
...

txt = '''id            Tier    element     element_date           mdate
5228039     "Tier B"      4      "2018-05-28 10:59:00"  736842.457639
5232263     "Tier B"      3      "2018-05-28 10:59:00"  736842.457639
5245478     "Tier B"      EA     "2018-05-27 13:58:00"  736841.581944
4975552     "Tier B"      2      "2018-05-30 21:01:00"  736844.875694
4975563     "Tier A"      2      "2018-05-30 21:01:00"  736844.875694'''

df = pd.read_table(StringIO(txt), sep="\s+", parse_dates=[3])

Участок

fig, ax = plt.subplots(figsize=(13,4))

fig = sns.countplot(x="element_date", hue="element", data=df, ax=ax)

x_dates = df['element_date'].dt.strftime('%m-%d').sort_values().unique()
ax.xaxis.set_major_formatter(plt.FixedFormatter(x_dates))

plt.legend(loc='upper left')
plt.show()
plt.close()

Plot Output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...