当我绘制跨越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 estimated to generate 2879 ticks from 1970-01-01 01:00:00+00:00 to 1970-01-03 00:59:59+00:00: exceeds Locator.MAXTICKS * 2 (2000)
2879 ticks正好是该时间段中的分钟数,这意味着估计值是基于每分钟1 tick。 但是定位器应该每30分钟产生1个滴答声(48小时内每小时2个滴答声=96个滴答声)。 为什么估计值和实际值相距如此之远?
解决方法是提高MAXTICKS值:
locator = mdates.MinuteLocator(byminute=[0,30])
locator.MAXTICKS = 1500
ax.xaxis.set_major_locator(locator)
这很有效,图表显示得很好。但这不应该是必要的,对吧?为什么这个错误首先会发生?我在用日期定位器吗?
真正的问题是,RRuleLocator假设在设置byminute并且初始化时没有传入interval(默认为1)时,底层rrule实例的interval变量将被更新。事实上,当设置了byxxx(小时/分钟/秒等)时,rrule中完全忽略了间隔(如果设置了过滤,则有一些小的例外w.r.t.)!
与其重写MAXTICKS,不如将代码更改为包含MinuteLocator上的间隔也为30。这不会改变最终图像的绘制方式(除非使用过滤)。
尽管这只是一个解决方法,但可以清除RRuleLocator的tick_值中的估计检查,以包括byxxx变量中设置的内容(尽管这可能会变得混乱)。
似乎你的X轴有太多的记号,程序无法处理。
尝试改变
到
默认最大刻度数为2000,即locator.MAXTICKS*2。
以分钟计算,你有2879个节拍,每天1440分钟,持续两天,加上79个节拍的缓冲。
将x轴更改为小时将得到48小时加上缓冲区刻度,这远远低于x轴上2000刻度的限制。
将默认的MAXTICKS更改为1500可以工作,但它会破坏预期的保护。
此时没有30分钟刻度的选项。
相关问题 更多 >
编程相关推荐