pyplot xticklabel(日期/时间)有时会暂停一分钟

时间:2017-02-05 10:42:26

标签: python matplotlib

我有一个使用matplotlib.pyplot生成几个图形的程序。在x轴上我想用4小时的时间间隔标记主要刻度(所以:00:00,04:00,08:00等) 当我绘制图表时,前几个标签是可以的,但其余的不是。

我正在使用的代码(未显示ax3正在设置和加载数据,因为这是恕我直言的主题):

import matplotlib as mpl
mpl.use("Agg")                              # activate Anti-Grain Geometry library

import matplotlib.pyplot as plt
import numpy as nmp

:
:

hours     = mpl.dates.HourLocator()
fourhours = 4. / 24.
# [DAY]
major_ticks = nmp.arange(nmp.ceil(DY[1, 0]/fourhours)*fourhours, DY[-1, 0], fourhours)
ax3.set_xlabel('past day')
ax3.grid(True)
ax3.set_ylim([Ymin, Ymax])
ax3.set_xlim([DY[1, 0], DY[-1, 0]])
#
t = nmp.array(DY[:, 0])       # date/time
ax3.set_xticklabels(t, size='small')
ax3.set_yticklabels([])
ax3.set_xticks(major_ticks)
ax3.xaxis.set_major_formatter(mpl.dates.DateFormatter('%R'))
ax3.grid(which='major', alpha=0.5)
ax3.xaxis.set_minor_locator(hours)
ax3.grid(which='minor', alpha=0.2)
#
s = nmp.array(DY[:, 2])       # averages
slo = nmp.array(DY[:, 1])     # minima
shi = nmp.array(DY[:, 3])     # maxima
line, = ax3.plot(t, s, marker='.', linestyle='', color='red', lw=2)
ax3.fill_between(t, slo, shi, interpolate=True, color='red', alpha=0.2)

DY[1,0]包含值736364.444444
DY[-1,0]736365.458333 然后major_ticks成为: [ 736364.5 736364.66666667 736364.83333333 736365. 736365.16666667 736365.33333333]

这一切对我来说都很好,但结果图不是:

enter image description here

欢迎任何有关如何解决此问题的建议。

@ j-p-petersen建议使用linspace: 我用以下代码替换了计算major_ticks = ...的行:

intervals = int((DY[-1, 0] - DY[1, 0]) / fourhours) + 1
major_ticks = np.linspace(np.ceil(DY[1, 0]/fourhours)*fourhours, np.floor(DY[-1, 0]/fourhours)*fourhours, intervals)

这减少了问题,但仍有一些刻度显示为小时i.s.o前一分钟。在一小时。

1 个答案:

答案 0 :(得分:0)

我认为这是由于浮点运算中的舍入误差在这里:

fourhours = 4. / 24.

您可以使用arange,而不是使用linspace,这样就不会低于目标。

或者,您可以使用timedeltadeltatime进行计算,然后使用matplotlib.dates.date2num将其转换为Matplotlib的数字日期。