matplotlib中的非单调x范围

时间:2012-12-04 21:00:37

标签: python matplotlib

我想将图表显示为小时数的函数,其中x轴从24小时跳到0小时。但是,绘制的数量应该在日期边界上平滑地连接。我可以在x轴上使用不同的时间单位,单调增加,但我想在x轴的整数刻度位置显示小时数,我该怎么做?

hours = [19,20.5,21.5,22.5,23.5,0.5,1.5,2.5,3,4]
list1 = [random.randint(1,10) for x in range(10)]
plt.plot(hours, list1)

2 个答案:

答案 0 :(得分:2)

我认为hours列表是从更完整的日期结构中剥离时间的结果?

如果转换日期datetime对象(包括日期信息,因此它们确实是单调的),则可以直接根据日期绘制list1。那么你可以

import datetime

d = datetime.datetime.now()
delta = datetime.timedelta(hours=1)
dates = [d]
for j in range(20):
    dates.append(dates[-1] + delta)

date_list = dates
list1 = rand(len(dates))
figure()
ax = gca()
ax.plot(date_list,list1)
ax.xaxis.set_major_locator(
    matplotlib.dates.HourLocator()
)
ax.xaxis.set_major_formatter(
    matplotlib.dates.DateFormatter('%H')
)

改编自here

result of code

答案 1 :(得分:2)

嗯,这很脏,我现在尝试使用other answer发布它,但是(在ipython --pylab中):

In [1]: def monotonic_hours(h):
    hours = h[:]
    for i, _ in enumerate(h[1:], 1):
        while hours[i-1] > hours[i]:
            hours[i] += 24
    return hours
   ...: 

In [2]: %paste
hours = [19,20.5,21.5,22.5,23.5,0.5,1.5,2.5,3,4]
list1 = [random.randint(1,10) for x in range(10)]

## -- End pasted text --

In [3]: plot(monotonic_hours(hours), list1)
Out[3]: [<matplotlib.lines.Line2D at 0x3271810>]

In [4]: xticks(xticks()[0], [int(h%24) for h in xticks()[0]])

enter image description here

注意:如果默认xticks处于整数位置,这是准确的,否则您可以执行类似

的操作
ticks = sorted(set(int(round(t)) for t in xticks()[0]))
xticks(ticks, [h%24 for h in ticks])

注意2:如果没有ipython,您可以拨打plt上的所有内容。