Matplotlib日期自动收报机 - 没有明显原因超出Locator.MAXTICKS错误

Seb*_*ian 16 python plot datetime matplotlib python-3.x

当我绘制数据点与时间,跨越2天时,我设置了一个0和30分钟的datelocator.每半小时一次主要的滴答,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()
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

RuntimeError:RRuleLocator估计从1970-01-01 01:00:00 + 00:00到1970-01-03 00:59:59 + 00:00:生成2879个刻度超过Locator.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)
Run Code Online (Sandbox Code Playgroud)

这是有效的,图表很好地显示.但是,这不应该是正确的吗?为什么这个错误首先发生?我是否使用了datelocator?

小智 4

真正的问题是,RRuleLocator 假定当设置了 bymonth 并且在初始化时未传入间隔(默认为 1)时,底层 rrule 实例的间隔变量将被更新。事实上,当设置了 byxxx (小时/分钟/秒等)时,rrule 中的间隔被完全忽略(如果是否设置了过滤,则有一些小例外)!

与其覆盖 MAXTICKS,不如更改代码以将 MinuteLocator 上的间隔也设为 30。这不会改变最终图像的绘制方式(除非您使用过滤)。

ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0,30], interval=30))
Run Code Online (Sandbox Code Playgroud)

当然,虽然这也只是一种解决方法,但可以清理 RRuleLocator 的 tick_values 中的估计检查,以包括 byxxx 变量中设置的内容(尽管这可能会变得混乱)。