类别变量和日期时间之间的绘图关系

问题描述 投票:1回答:1

考虑数据框

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

现在您可以看到有3个唯一的ID,其中a和b与2个时间戳相关联,我希望ID出现在x轴上,日期块出现在y轴上。如何才能做到这一点 ?感谢您的耐心等待。我想要在python中使用matplotlib或seaborn或任何其他可视化库来实现。如果您能提到这两个变量之间有意义的可视化的不同方式,我也将不胜感激。我希望该图如下所示。 enter image description here

python matplotlib data-visualization seaborn
1个回答
0
投票

这里是一种在x轴上显示id并在y轴上显示日期的方式来可视化数据的方法。假设您的日期格式为day.month.year

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

但是日期在图例中,如果列表太长,可能不适合。

© www.soinside.com 2019 - 2024. All rights reserved.