首页 > 解决方案 > yaxis 上的 HourLocator() 引发运行时错误意外超过 Locator.MAXTICK

问题描述

我正在尝试用一些水平线设置一个简单的图形。

plt.figure()
plt.axhline(datetime.time(12,0,0,0),color='blue',ls='--',lw=3)
plt.axhline(datetime.time(18,0,0,0),color='red',ls='--',lw=3)

这工作正常,我得到: 在此处输入图像描述

哪个是对的。然后我希望我的 yticks 只在四舍五入的小时值上。我正在尝试使用 HourLocator()

from matplotlib.dates import HourLocator, DateFormatter, 
plt.gca().yaxis.set_major_locator(HourLocator()) # this fails
plt.gca().yaxis.set_major_formatter(DateFormatter('%H:%M')) 

但是,这会产生此错误。为什么它试图生成 570241 个刻度?

RuntimeError: Locator attempting to generate 570241 ticks from 42120.0 to 65880.0: exceeds Locator.MAXTICK小号

标签: pythondatetimematplotlib

解决方案


请注意,matplotlib 不支持datetime.time值。诚然,它看似有效的事实隐藏了这一点。

所以你首先需要使用datetime.datetime

import datetime
import matplotlib.pyplot as plt

fig,ax=plt.subplots()
ax.axhline(datetime.datetime(2018,7,24,12,0,0,0),color='blue',ls='--',lw=3)
ax.axhline(datetime.datetime(2018,7,24,18,0,0,0),color='red',ls='--',lw=3)
ax.autoscale()

plt.show()

在此处输入图像描述

现在,这已经为您提供了每小时的刻度(巧合)。但是您现在当然可以使用自定义位置和格式,添加

from matplotlib.dates import HourLocator, DateFormatter
plt.gca().yaxis.set_major_locator(HourLocator())
plt.gca().yaxis.set_major_formatter(DateFormatter('%H:%M')) 

如问题所示,将为您提供所需的输出。

在此处输入图像描述


推荐阅读