一尘不染

在matplotlib中绘制一天中的时间与日期的关系

python

我想以特定的几种方式在x轴上绘制日期,在y轴上绘制一天中的时间,然后绘制线条图或间隔(浮动条)图。

但是我与那个情节有一些区别,我无法使其正常工作。我实际上是在y轴上绘制日期和时间的图,所以当我只需要一天的时间时,它在y轴上压缩了几个月的时间戳。该示例在注释中声称:“
yaxis的基准日期可以是任何东西,因为信息在时间上”,但是我不明白他是如何“扔掉”基准日期信息的。

无论如何,我的需求是:

  1. 我想选择y轴的24小时制(00:00到24:00)或am / pm样式时间,该轴的刻度看起来像3:00 pm、11:00am等。我想是用FuncFormatter完成的。

  2. 对于间隔(时间范围),我不想使用误差线-线太细了。我想使用一个(浮动的)条形/柱形图。

我的数据是格式为‘2010-12-20 05:00:00’的日期时间字符串

谢谢你的帮助。


阅读 243

收藏
2021-01-20

共1个答案

一尘不染

我认为您对matplotlib究竟如何在后台处理时间和日期感到有些困惑。

matplotlib中的所有日期时间都表示为简单浮点数。1天对应于1.0的差,日期是自1900年以来的天数(如果我没有记错的话,无论如何)。

因此,为了只绘制给定日期的时间,您需要使用% 1

我将使用点,但是您可以轻松使用条形图。考虑使用bottom,如果你使用关键字参数plt.bar,使杆的底部将在您的时间间隔的开始时间开始(请记住第二个参数是
高度 了吧,不是其顶部的y值)。

例如:

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import datetime as dt

# Make a series of events 1 day apart
x = mpl.dates.drange(dt.datetime(2009,10,1), 
                     dt.datetime(2010,1,15), 
                     dt.timedelta(days=1))
# Vary the datetimes so that they occur at random times
# Remember, 1.0 is equivalent to 1 day in this case...
x += np.random.random(x.size)

# We can extract the time by using a modulo 1, and adding an arbitrary base date
times = x % 1 + int(x[0]) # (The int is so the y-axis starts at midnight...)

# I'm just plotting points here, but you could just as easily use a bar.
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot_date(x, times, 'ro')
ax.yaxis_date()
fig.autofmt_xdate()

plt.show()

时间与日期

希望能有所帮助!

2021-01-20