Используя for-l oop, вы можете использовать следующий подход. Предполагая, что для каждой группы у вас есть 2 даты, хорошим способом построения графика было бы иметь 2 столбца и строки, равные количеству групп
rows=len(groups) #set the desired number of rows
cols=2 #set the desired number of columns
fig, ax = plt.subplots(rows, cols, figsize=(13,8),sharex=False,sharey=False) # if you want to turn off sharing axis.
g=0 #to iterate over rows/cols
d=0 #to iterate over rows/cols
for group in groups:
for date in dates:
GROUP_ID = group
df = df[df['group_id'] == GROUP_ID]
df['Date'] = [datetime.datetime.date(d) for d in df['timestamp']]
df = df[df['Date'] == date]
df.plot(x='timestamp', y='data', figsize=(42, 16))
ax[g][d].axhline(y=40, color='r', linestyle='-')
ax[g][d].axhline(y=25, color='b', linestyle='-')
df['top_lim'] = 40
df['bottom_lim'] = 25
ax[g][d].fill_between(df['timestamp'], df['bottom_lim'], df['data'],
where=(df['data'] >= df['bottom_lim'])&(df['data'] <= df['top_lim']),
facecolor='orange', alpha=0.3)
mask = (df['data'] <= df['top_lim'])&(df['data'] >= df['bottom_lim'])
ax[g][d].scatter(df['timestamp'][mask], df['data'][mask], marker='.', color='black')
cumulated_time = df['timestamp'][mask].diff().sum()
d=d+1
if d==1:
g=g
else:
g=g+1
d=0
fig.text(0.5, -0.01, 'Timestamp', ha='center', va='center',fontsize=20)
fig.text(-0.01, 0.5, 'Data', ha='center', va='center', rotation='vertical',fontsize=20)
plt.subplots_adjust(left = 0.3)