当我绘制跨越2天的数据点与时间的关系图时,我将日期定位器设置为0和30分钟。每半个小时,matplotlib就会抛出一个错误。考虑这个例子:
from datetime import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
datapoints = 3600*24*2 #2 days, 1 datapoint/second
data = range(datapoints) #anydata
timestamps = [ datetime.fromtimestamp(t) for t in range(datapoints) ]
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0,30]))
plt.plot(timestamps,data)
plt.show()
然后我得到以下错误:
RuntimeError:RRuleLocator估计从中生成2879个tick1970-01-01 01:00:00+000:00至1970-01-03 00:59:59+00:00:超过定位器.MAXTICKS*2(2000)
2879个刻度正好是该时间跨度内的分钟数,这意味着估计是基于每分钟1个刻度。但是,定位器应每30分钟产生1次滴答声(48小时内每小时产生2次滴答声=96次滴答声)。为什么估价和实际价值相差如此之远?
解决方法是提高MAXTICKS值:
locator = mdates.MinuteLocator(byminute=[0,30])
locator.MAXTICKS = 1500
ax.xaxis.set_major_locator(locator)
这很有效,图表也很好地显示了这一点。然而,这不应该是必要的,对吗?为什么首先会出现这种错误?我是否仅使用日期定位器?
真正的问题是,RRuleLocator假设在设置byminute时,基础rrule实例的间隔变量已经更新,并且初始化时没有传入间隔(默认为1)。事实上,当设置byxxx(小时/分钟/秒等)时,rrule中的间隔被完全忽略(除了一些小的例外,如果设置或未设置filtered,则为w.r.t.)!
与其覆盖MAXTICKS,不如更改代码,将MinuteLocator上的间隔也包括为30。这不会改变最终图像的绘制方式(除非您使用的是已过滤的)。
ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0,30], interval=30))
当然,虽然这只是一个变通方法,但可以清理RRuleLocator的tick_values中的估计检查,以包括byxxx变量中设置的内容(尽管这可能会变得混乱)。
您的X轴似乎有太多的记号,程序无法处理。
尝试更改
ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0,30]))
至
ax.xaxis.set_major_locator(mdates.HourLocator(byhour=[0,1]))
默认的最大刻度数为2000,即定位器。MAXTICKS*2。
以分钟为单位工作,你有2879个蜱虫——两天内每天1440分钟,外加79个蜱虫的缓冲区。
将x轴更改为小时可获得48小时加上缓冲区刻度,该刻度远低于x轴上的2000刻度限制。
将默认的MAXTICKS更改为1500可以工作,但它会破坏预期的保护。
此时,没有30分钟刻度的选项。