Matplotlib WeekdayLocator提供错误日期/太多刻度

时间:2016-02-02 20:18:26

标签: python datetime matplotlib plot

我一直在使用matplotlib.pyplot来绘制日期范围内的一些数据,但是已经遇到了一些奇怪的行为,与this question没有什么不同。

我的问题和那个问题之间的主要区别(除了建议的修复程序不起作用)是它们引用不同的定位器(在我的情况下为WeekdayLocator(),在他们的情况下是AutoDateLocator()。)作为一些背景,这里'我得到了什么:

预期的和典型的结果,我的数据以合理的日期范围显示: Good Results

非常偶然的结果,数据给出了大约5年的荒谬范围(从我所看到的): Bad Results

我使用通用的matplotlib.pyplot.plot进行了一些额外的测试,它似乎与使用子图无关,或者只是直接使用模块创建绘图。

plt.plot(some plot)

VS

fig = plt.figure(...)
sub = fig.add_subplot(...)
sub.plot(some plot)

根据我的发现,奇怪的行为只发生在数据集只有一个点(因此只有一个日期要绘制)时。由于某种原因,由于某些原因,基于此错误输出尝试为x轴日期范围(从大约2013年到2018年)生成1653个刻度,这是一个令人发指的刻度数:

RuntimeError: RRuleLocator estimated to generate 1635 ticks from
2013-07-11 19:23:39+00:00 to 2018-01-02 00:11:39+00:00: exceeds Locator.MAXTICKS * 2 (20)

(这是来自一些使用WeekdayLocator()的实验.MAXTICKS成员设置为10)

然后我尝试根据我必须绘制的日期点数来更改定位器:

# If all the entries in the plot dictionary have <= 1 data point to plot
if all(len(times[comp]) <= 1 for comp in times.keys()):
    sub.xaxis.set_major_locator(md.DayLocator())
else:
    sub.xaxis.set_major_locator(md.WeekdayLocator())

这适用于我有2行和1行(或只是一个点)的边缘情况,并希望正常滴答,因为它没有搞砸,但只有< em>有点努力解决我的问题:

Almost...

现在我没有傻标记,但我的日期范围仍然是5年! (旁注:我也尝试使用HourLocator(),但它试图产生近40,000个刻度线...)

所以我想我的问题是这样的:当只有一个日期要绘制时,是否有某种方法可以控制日期范围爆炸,或者我是否受到Matplotlib日期绘图方法的奇怪错误的支配?

我想要的是与第一张图片类似的东西,其中日期范围从第一个日期之前的一小部分到最后一个日期之后的一点点。即使Matplotlib要填充轴范围以匹配第一张图像中的刻度频率,我预计它只会跨越一个月左右,而不是整整五年。

修改

忘记提及无论我使用哪种定位器,范围爆炸似乎也会发生。使用零点进行绘图只会产生空白的x轴(由于根本没有日期范围),单个点给出了所描述的巨大日期范围,多个点/线给出了预期的日期范围。

0 个答案:

没有答案