考虑数据框
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或任何其他可视化库来实现。如果您能提到这两个变量之间有意义的可视化的不同方式,我也将不胜感激。我希望该图如下所示。
这里是一种在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()
另一个想法可能是:
df.sort_values(by=['some_id', 'timestamp']).groupby(['some_id', 'timestamp']).size().unstack().plot(kind='bar', stacked=True)
但是日期在图例中,如果列表太长,可能不适合。