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 变量中设置的内容(尽管这可能会变得混乱)。