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 设置,但不考虑由byminutebyseconds 等。我猜你可能会说这是一个错误。让我们看看@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 错误的主要内容,如果未能解决你的问题,请参考以下文章

proxmox VE超融合集群连续无故障运行超过700天

熊猫用字符串转换日期

熊猫用字符串转换日期

Matplotlib 绘图 x 轴(数据文件日期时间)

Matplotlib 以奇数间隔日期 YearLocator

如何使用 matplotlib 在日期时间轴上绘制一个矩形?