Matplotlib日期标记器-超出Locator.MAXTICKS错误,原因不明

2024-05-16 07:34:35 发布

您现在位置:Python中文网/ 问答频道 /正文

当我绘制跨越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)

这很有效,图表显示得很好。但这不应该是必要的,对吧?为什么这个错误首先会发生?我在用日期定位器吗?


Tags: fromimportdatadatetimematplotlibas错误range
2条回答

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

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

ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0,30], interval=30))

尽管这只是一个解决方法,但可以清除RRuleLocator的tick_值中的估计检查,以包括byxxx变量中设置的内容(尽管这可能会变得混乱)。

似乎你的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分钟刻度的选项。

相关问题 更多 >