Вот способ визуализации данных с идентификаторами на оси 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()
Другая идея могла бы быть:
df.sort_values(by=['some_id', 'timestamp']).groupby(['some_id', 'timestamp']).size().unstack().plot(kind='bar', stacked=True)
Но тогда даты встречаются в легенде, которая может не подходить, если список слишком длинный.