Matplotlib 日期代码 - 无故超过 Locator.MAXTICKS 错误
Posted
技术标签:
【中文标题】Matplotlib 日期代码 - 无故超过 Locator.MAXTICKS 错误【英文标题】:Matplotlib date ticker - exceeds Locator.MAXTICKS error for no apparent reason 【发布时间】:2015-09-13 08:56:52 【问题描述】:当我绘制数据点与时间的关系时,跨越 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 估计会从 1970-01-01 01:00:00+00: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)
这很有效,并且图表很好地显示了。但是,这不应该是必需的吗?为什么首先会发生此错误?我是否错误地使用了日期定位器?
【问题讨论】:
通过对相关source 的非常 简短检查,我得出结论,DateLocators
确实考虑了interval
设置,但不考虑由byminute
、byseconds
等。我猜你可能会说这是一个错误。让我们看看@tcaswell 是否可以确认
我认为github上有一个悬而未决的问题。
哦,好的,谢谢,我现在在 github 上查看,找不到相关问题。如果我在现有问题(url?)中添加任何内容或者我在 github 上添加问题是否有帮助,请告诉我。
我也有这个问题,很高兴看到这不是(我们的)代码的错。
@tcaswell 和其他人:这里有人运气更好吗?我在最新版本中也遇到了同样的问题。
【参考方案1】:
真正的问题是 RRuleLocator 假定底层 rrule 实例的间隔变量将在设置 byminute 时更新,并且在初始化时未传入间隔(默认为 1)。实际上,在设置 byxxx(小时/分钟/秒等)时,rrule 中的时间间隔完全被忽略(有一些小的例外情况,无论是否设置了过滤)!
与其重写 MAXTICKS,不如将代码更改为将 MinuteLocator 上的间隔也包含为 30。这不会改变最终图像的绘制方式(除非您使用过滤)。
ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0,30], interval=30))
尽管这也只是一种解决方法,但可以清理 RRuleLocator 的 tick_values 中的估计检查以包括在 byxxx 变量中设置的内容(尽管这可能会变得混乱)。
【讨论】:
【参考方案2】:您的 X 轴似乎有太多刻度线,程序无法处理。
尝试改变
ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0,30]))
到
ax.xaxis.set_major_locator(mdates.HourLocator(byhour=[0,1]))
默认的最大刻度数为 2000,即 locator.MAXTICKS * 2。 在几分钟内工作,你有 2879 个滴答声,这两天每天 1440 分钟加上 79 个滴答声的缓冲区。
将 x 轴更改为小时可以得到 48 小时加上缓冲区滴答声,这远低于 x 轴上 2000 滴答刻的限制。
将默认 MAXTICKS 更改为 1500 可能会起作用,但它会破坏预期的保护。
目前没有 30 分钟刻度线的选项。
【讨论】:
以上是关于Matplotlib 日期代码 - 无故超过 Locator.MAXTICKS 错误的主要内容,如果未能解决你的问题,请参考以下文章