使用日期时间数据在Matplotlib中绘制矩形

时间:2018-06-29 13:13:32

标签: python pandas datetime matplotlib

我有以下问题:我有一个带有日期时间索引和包含浮点或布尔值的列的数据框,如下所示:

                     TAG_2552  TAG_2526
timestamp
2018-06-17 14:41:48      50.0      True
2018-06-17 14:41:49      51.0      True
2018-06-17 14:41:50      52.0      True
2018-06-17 14:41:51      49.0      True
2018-06-17 14:41:52      55.0      False
2018-06-17 14:41:53      50.0      False
2018-06-17 14:41:54      48.0      False
2018-06-17 14:41:55      54.0      False
2018-06-17 14:41:56      53.0      True
2018-06-17 14:41:57      50.0      True

我想作图,这对于float值来说不是问题。对于布尔值,我想在True处绘制矩形。我尝试使用matplotlib.collections这样做。

我尝试了

df['datetime']=df.index
collection = collections.BrokenBarHCollection.span_where(df['datetime'].dt.date, ymin=0, ymax=1, where=df['TAG_2526']==True, facecolor='green', alpha=.5)

(和其他变体),但这不起作用。

可以使用

创建一个集合
df['timedelta'] = df['datetime']-df['datetime'][0]
collection2 = collections.BrokenBarHCollection.span_where(myProc9['timedelta'].astype('timedelta64[ns]')/np.timedelta64(1,'s'), ymin=0, ymax=1, where=myProc9['TAG_2503']==True, facecolor='green', alpha=.5)

但是由于要共享x轴,所以我想针对原始日期时间进行绘制,所以我唯一看到的选择是针对myProc9['timedelta'].astype('timedelta64[ns]')/np.timedelta64(1,'s')绘制所有内容并重新标记x轴。

我检查了有关更改日期时间格式的其他页面,但是matplotlib.collections似乎什么也没做,通常的错误消息是

TypeError: float() argument must be a string or a number, not 'datetime.date'

(或我尝试过的其他方法,有关日期时间格式之间的各种转换,请参见此处:Converting between datetime, Timestamp and datetime64

我想知道是否有更好的方法(不使用matplotlib.collections)或以其他方式调用它?

1 个答案:

答案 0 :(得分:0)

我正要删除问题,但是也许对某人某个时候有用。

ax.fill_between(df.index, 0,1,where=df['TAG_2526'])

做这项工作,并且在时间戳方面似乎很慷慨。

链接:https://matplotlib.org/gallery/pyplots/whats_new_98_4_fill_between.html#sphx-glr-gallery-pyplots-whats-new-98-4-fill-between-py