我有一个使用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]
这一切对我来说都很好,但结果图不是:
欢迎任何有关如何解决此问题的建议。
@ 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前一分钟。在一小时。
答案 0 :(得分:0)
我认为这是由于浮点运算中的舍入误差在这里:
fourhours = 4. / 24.
您可以使用arange
,而不是使用linspace
,这样就不会低于目标。
或者,您可以使用timedelta
和deltatime
进行计算,然后使用matplotlib.dates.date2num
将其转换为Matplotlib的数字日期。