【问题标题】:How to plot events with minute precision on hourly plots using matplotlib?如何使用 matplotlib 在每小时图上以分钟精度绘制事件?
【发布时间】:2018-10-24 16:49:05
【问题描述】:

我有一个使用 matplotlib 生成的每小时绘图。我需要绘制一个事件,例如从 09:00 到 10:45。当我尝试这样做时,使用 axvspan 我从 9:00 到 10:00 获得了一个酒吧。我怎样才能获得更长的?

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

【问题讨论】:

  • 请包含使用一小组数据生成此图的代码。

标签: python-3.x datetime matplotlib


【解决方案1】:

Juan,看起来当您使用 pandas to plot 时,每小时索引似乎会导致 axvspan 的绘制方式出现问题。

我换了

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

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

生成下面的图像,但不幸的是您丢失了自动 x 轴格式。

添加下面的两行将导致与您的示例相同的日期格式。

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

以下是生成上述图的完整代码。

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

【讨论】:

    猜你喜欢
    • 2013-07-16
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2022-11-24
    • 1970-01-01
    • 2019-02-17
    • 2014-10-06
    相关资源
    最近更新 更多