在日期轴上对齐矩形

时间:2014-04-16 03:21:27

标签: python matplotlib

我想画一个矩形来表示x轴内的范围。我可以使用定位器来设置刻度和标签,但我似乎没有成功使用它们来绘制矩形。我该怎么办呢?!

import datetime as DT
from matplotlib import pyplot as plt
import matplotlib.dates as dates

ddata = [DT.datetime.strptime('2010-02-05', "%Y-%m-%d"),
         DT.datetime.strptime('2010-02-19', "%Y-%m-%d"),
         DT.datetime.strptime('2010-03-05', "%Y-%m-%d"),
         DT.datetime.strptime('2010-03-19', "%Y-%m-%d"),]

values = [123,678,987,345]

d1 = zip(ddata,values)

def nplot(data):

    x = [date for (date, value) in data]
    y = [value for (date, value) in data]

#     Set the stage
    fig, ax = plt.subplots()
    graph = fig.add_subplot(111)

#     Plot the data as a red line with round markers
    graph.plot(x,y,'r-o')

    days   = dates.DayLocator(interval=7)  # every week
    months   = dates.MonthLocator()  # every month

#     Create locators and ticks
    ax.xaxis.set_minor_locator(days)
    ax.xaxis.set_minor_formatter(dates.DateFormatter('%d'))

    ax.xaxis.set_major_locator(months)
    ax.xaxis.set_major_formatter(dates.DateFormatter('\n\n%b'))
    ax.xaxis.grid(True, which="major", linewidth=2)

#     Now how do I align a rectangle with specific dates?
    gca().add_patch(Rectangle((data[0][0], 1000), 
                    data[2][0], 1000, facecolor='w', alpha=0.9)) # doesn't work

    plt.show()

nplot(d1)

Resulting image

1 个答案:

答案 0 :(得分:1)

有了这个,我得到了当前设置的次要标记

locs = ax.xaxis.get_minorticklocs()

然后我写了这个矩形。奇数,左侧的位置是一个6位数的浮点数,但右侧的位置是自左侧以来的天数。不知道它是如何工作的,但似乎......

gca().add_patch(Rectangle((locs[0], 0), 7, 1000, facecolor='w', alpha=0.9))

这就是我想从头开始做的事情:标记重复范围。

locs = ax.xaxis.get_minorticklocs()
loc_len = len(locs)
zloc = zip(locs, [7] * loc_len) # Seven-day loops
for i in zloc[::2]:
    gca().add_patch(Rectangle((i[0], 0), i[1], 1000, facecolor='w', alpha=0.9))

Final image

然而,如果我决定点月份,这将无法工作,因为每个月都有不同的天数。 @Greg建议使用 fill_between 是另一种选择,但是它会设置与数据相关的限制,而不是规模(我猜这是好的):

xloc = zip(x[:-1], x[1:])
for i in xloc[::2]:
    ax.fill_between(i, 0, 1200, facecolor='w', alpha=0.5)
ylim(0, 1200)
plt.show()

Final image