2014-04-16 2 views
0

Я хотел бы нарисовать прямоугольник, чтобы указать диапазон в пределах оси 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

+0

код, который вы дали много подробностей, но не совсем ясно (по крайней мере для меня), в чем вопрос. Я подозреваю, что [третье демо здесь] (http://matplotlib.org/examples/pylab_examples/fill_between_demo.html) поможет вам. – Greg

+0

@ Грег, может, я постараюсь завтра. Мой пример не показывает его (потому что я не знаю, как это сделать), но я хочу заполнить каждую вторую пару локаторов даты. В конечном счете, я хотел бы заполнить промежутки между кварталами (от Jan до Mar, затем с июля по сентябрь и т. Д.), Независимо от того, где находятся ограничения по оси. И, чтобы пополнить его, я хотел бы, чтобы границы заливки были отметками между месяцами, поэтому ясно, какие месяцы принадлежат кварталу. Не спрашивать слишком много? :) – dmvianna

ответ

0

С этим я получаю в настоящее время установить незначительные клещи

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

Однако, это не будет работать, если я решу боксировать месяца, а каждый месяц имеет разное количество дней. @ Предложение Грега использования 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

Смежные вопросы