How to plot events with minute precision on hourly plots

Question:

I have an hourly plot generated with matplotlib. I need to plot an event which goes for example, from 09:00 to 10:45. When I try to do it, using axvspan I obtain a bar from 9:00 to 10:00. How could I obtain the longer one?

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
import datetime as dt
import pandas as pd

now_date = dt.datetime(2018,10,1,9)
d_tw_ini = now_date - dt.timedelta(hours = 1)
d_tw_fin = now_date + dt.timedelta(hours = 3)
  
dts = pd.date_range(start=d_tw_ini, end=d_tw_fin, freq='1H', name='ini', closed='left')
data=pd.DataFrame({'val':[0.5,0.4,0.7,0.9]})

ev1=[dt.datetime(2018,10,1,9,5),dt.datetime(2018,10,1,10,50)]

data['t']=dts.values
data.set_index('t',inplace=True)

fig = plt.figure()
gs = GridSpec(1, 1)
ax_1 = fig.add_subplot(gs[0, 0])

data.plot(ax=ax_1, y='val')
ax_1.axvspan(ev1[0],ev1[1], alpha=0.3, color= 'red')

Result

Asked By: jgarci7777

||

Answers:

Juan, it looks when you used pandas to plot, the hourly indexing seems to cause issues with how axvspan gets plotted.

I replaced

data.plot(ax=ax_1, y='val')

with

ax_1.plot(data.index, data['val'])

which generates the image below, but unfortunately you lose the automated x-axis formatting.

enter image description here

Adding the two lines below will result in the same date formatting as your example.

ax_1.set_xticks([x for x in data.index])
ax_1.set_xticklabels([str(x)[11:16] for x in data.index])

enter image description here

Below is the full code to produce the above plot.

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
import datetime as dt
import pandas as pd

now_date = dt.datetime(2018,10,1,9)
d_tw_ini = now_date - dt.timedelta(hours = 1)
d_tw_fin = now_date + dt.timedelta(hours = 3)

dts = pd.date_range(start=d_tw_ini, end=d_tw_fin, freq='1h', name='ini', 
closed='left')
data=pd.DataFrame({'val':[0.5,0.4,0.7,0.9]})

ev1=[dt.datetime(2018,10,1,9,5,0),dt.datetime(2018,10,1,10,50,0)]

data['t']=dts.values
data.set_index('t',inplace=True)

fig = plt.figure()
gs = GridSpec(1, 1)
ax_1 = fig.add_subplot(gs[0, 0])

# modified section below
ax_1.plot(data.index, data['val'])
ax_1.axvspan(ev1[0],ev1[1], alpha=0.3, color= 'red')

ax_1.set_xticks([x for x in data.index])
ax_1.set_xticklabels([str(x)[11:16] for x in data.index])

plt.show()
Answered By: daronjp
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.