我想以特定的几种方式绘制x轴上的日期和y轴上的时间,然后绘制线图或间隔(浮动条)图。
但是我与那个情节有一些区别,我无法让它发挥作用。我实际上是让y轴绘制DATES和时间,所以当我需要大约一天的价值时,它会在y轴上淹没几个月的时间戳。这个例子在评论中声称,“yaxis的基准日期可以是任何东西,因为信息在时间中”,但我不明白他是如何“丢弃”基准日期信息。
无论如何,我的需求是:
我想选择24小时时间(00:00到24:00)或y轴的上午/下午时间,轴的刻度看起来像下午3:00,上午11:00等等。我猜这将用FuncFormatter完成。
对于间隔(时间范围)我不想使用误差线 - 线条太薄了。我想使用(浮动)条形/柱形图。
我的数据是格式为“2010-12-20 05:00:00”
的日期时间字符串感谢您的帮助。
答案 0 :(得分:10)
我认为你对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()
希望这有点帮助!
答案 1 :(得分:2)
关注Joe Kingston的回复,但我补充说你需要将日期字符串转换为datetime对象,这可以通过datetime模块轻松完成,然后将它们转换为表示为浮点数的matplotlib日期(可以是根据需要格式化。
import datetime as dt
import matplotlib as mpl
some_time_str = '2010-12-20 05:00:00'
some_time_dt = dt.datetime.strptime(some_time_str, '%Y-%m-%d %H:%M:%S')
some_time_num = mpl.dates.date2num(some_time_dt) # 734126.20833333337
如果您从一个充满时间字符串的数组开始,您可以执行以下操作:
time_str_list = ['2010-12-20 05:00:00','2010-12-20 05:30:00']
time_num_list = map(
lambda x: mpl.dates.date2num(dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')),
time_str_list) #[734126.20833333337, 734126.22916666663]