一种可能的方法是将你的条目分散绘制出来,并在每个条目上添加文本。首先从文本文件加载数据(如果您使用的是标准CSV文件,请删除delimiter和skipinitialspace)。接下来,它将条目排序到字典中,键是id。它为每个ID创建一个单独的图形。每个ID的所有条目都按日期排序。如果一个日期有多个条目,则它们的文本将垂直组合成一个条目,以避免覆盖。月日也被添加到文本中。在from collections import defaultdict
import matplotlib.pyplot as plt
import matplotlib.dates as dates
from itertools import groupby
from datetime import datetime
import csv
data = defaultdict(list)
with open('input2.txt', 'rb') as f_input:
csv_input = csv.reader(f_input, delimiter=' ', skipinitialspace=True)
header = next(csv_input)
for row in csv_input:
row.append(datetime.strptime(row[1], '%Y-%m-%d'))
row.append(dates.date2num(row[4]))
data[row[0]].append(row)
bbox = dict(facecolor='blue', alpha=0.1, pad=1.0)
for rows in data.values():
fig = plt.figure(figsize=(10, 2))
ax = fig.add_subplot(111)
# Get date range
d = sorted(row[5] for row in rows)
ax.set_xlim(d[0]-10, d[-1]+10)
ax.set_ylim(0, 0.8)
for k, g in groupby(sorted(rows), lambda x: x[4]):
rows = list(g)
text = '{}\n\n{}'.format(k.day, '\n'.join([row[2] for row in rows]))
ax.scatter(rows[0][5], 0.1, s=5, c='black')
ax.text(row[5], 0.15, text, ha="center", va="bottom", fontsize=7.0, bbox=bbox)
fig.suptitle(row[0])
fig.subplots_adjust(bottom=0.2) # Add space at bottom
ax.xaxis.set_major_locator(dates.MonthLocator())
#ax.xaxis.set_minor_locator(dates.DayLocator())
ax.xaxis.set_major_formatter(dates.DateFormatter('%Y\n%m'))
ax.yaxis.set_ticks([])
plt.show()
这将显示一个ID: