График зависимости между категориальной переменной и датой и временем - PullRequest
1 голос
/ 19 февраля 2020

Рассмотрим фрейм данных

some_id  timestamp
  a         1.2.2019
  b         2.2.2019
  c         3.2.2019
  a         4.2.2019
  b         5.2.2019

Теперь вы можете видеть, что есть 3 уникальных идентификатора, и среди которых a и b связаны с 2 временными метками, я хочу, чтобы идентификаторы появлялись на оси x, а блоки дат на y ось. Как это может быть сделано ? Спасибо за терпеливость. Я хочу это в python, используя matplotlib или seaborn или любую другую библиотеку визуализации. Я также признателен, если вы можете упомянуть другой способ осмысленной визуализации между этими двумя переменными. Я хочу, чтобы фигура выглядела следующим образом. enter image description here

1 Ответ

1 голос
/ 19 февраля 2020

Вот способ визуализации данных с идентификаторами на оси X и датами на оси Y. Предположим, что ваши даты имеют формат day.month.year.

С помощью ax.text вы можете поместить текст внутри столбцов, будь то дата или другой интересующий столбец.

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
import pandas as pd

def timestr_to_num(timestr):
    print(datetime.strptime(timestr, '%d.%m.%Y'))
    return mdates.date2num(datetime.strptime(timestr, '%d.%m.%Y'))

rows = [['a', '1.2.2019'],
        ['b', '2.2.2019'],
        ['c', '3.2.2019'],
        ['a', '4.2.2019'],
        ['b', '5.2.2019']]
columns = ['some_id', 'timestamp']
df = pd.DataFrame(data=rows, columns=columns)

fig, ax = plt.subplots(figsize=(10, 5))

xs = list(df['some_id'].unique())
for row in df.itertuples():
    x = xs.index( row.some_id)
    y = timestr_to_num(row.timestamp)
    ax.barh(y, left=x-0.5, width=1, height=1)
    ax.text(x, y, row.timestamp, ha='center', va='center', color='white', fontsize=16)
ax.yaxis.set_major_formatter(mdates.DateFormatter('%d.%m.%Y'))
ax.yaxis.set_major_locator(mdates.DayLocator(interval=1))  # set a tick every hour
ax.set_xlabel('some_id')
ax.set_ylabel('timestamp')
ax.set_xticks(range(len(xs)))
ax.set_xticklabels(xs)

plt.tight_layout()
plt.show()

example plot

Другая идея могла бы быть:

df.sort_values(by=['some_id', 'timestamp']).groupby(['some_id', 'timestamp']).size().unstack().plot(kind='bar', stacked=True)

Но тогда даты встречаются в легенде, которая может не подходить, если список слишком длинный.

...