I've found the solution.  MonthLocator doesn't support the bysetpos 
argument that rrule can use.  Thankfully from my POV the following two 
lines give me exactly what I want.

rule = rrulewrapper(MONTHLY, bymonthday=(firstDate.day, -1), bysetpos=1)
majorLocator = RRuleLocator(rule)

Just wish I'd read the docs more carefully in the first place to save my 
time and yours.

On 05/04/2013 10:17, Mark Lawrence wrote:
> On 04/04/2013 19:00, Mark Lawrence wrote:
>> Sadly no :(  I want the day of the month that I'm processing *OR* the
>> last day.  The worst case for this is obviously the 31st of each month.
>>    The rrule code I've given provides exactly that.  When transferred to
>> mpl that doesn't work.
>
> Best seen by changing the lines I gave originally to this.
>
> start = datetime.date(2013, 4, 5)
> until = datetime.date(2014, 4, 5)
> dates = rrule(MONTHLY, bymonthday=(5, -1), bysetpos=1, until=until)
>
> rrule output as follows.
>
> 2013-04-05 10:15:24
> 2013-05-05 10:15:24
> 2013-06-05 10:15:24
> 2013-07-05 10:15:24
> 2013-08-05 10:15:24
> 2013-09-05 10:15:24
> 2013-10-05 10:15:24
> 2013-11-05 10:15:24
> 2013-12-05 10:15:24
> 2014-01-05 10:15:24
> 2014-02-05 10:15:24
> 2014-03-05 10:15:24
>
> Plot attached.
>
>>
>> On 04/04/2013 17:31, Phil Elson wrote:
>>> Hi Mark,
>>>
>>> Thanks for persevering :-)
>>>
>>> What is it you want to achieve? Is it that you just want the last day of
>>> each month as the located value?
>>>
>>> Changing your locator to:
>>>
>>> ax.xaxis.set_major_locator(MonthLocator(bymonthday = -1))
>>>
>>> Seems to do the trick for me (I've never looked at the mpl date magic,
>>> so I can give no guarantees).
>>>
>>> HTH,
>>>
>>>
>>> On 4 April 2013 17:18, Mark Lawrence
>>> <breamore...@yahoo.co.uk
>>> <mailto:breamore...@yahoo.co.uk>> wrote:
>>>
>>>      On 01/04/2013 14:48, Mark Lawrence wrote:
>>>       > On 29/03/2013 15:49, Mark Lawrence wrote:
>>>       >> Hi all,
>>>       >>
>>>       >>    From http://labix.org/python-dateutil
>>>       >>
>>>       >> "To generate a rrule for the use case of "a date on the
>>>      specified day of
>>>       >> the month, unless it is beyond the end of month, in which case
>>>      it will
>>>       >> be the last day of the month" use the following:
>>>       >>
>>>       >> rrule(MONTHLY, bymonthday=(some_day, -1), bysetpos=1)
>>>       >>
>>>       >> This will generate a value for every calendar month regardless
>>>      of the
>>>       >> day of the month it is started from."
>>>       >>
>>>       >> Using bymonthday with MonthLocator gives ticks on the day given
>>>      and the
>>>       >> last day of the month, which looks extremely ugly.  Code below
>>>      demonstrates.
>>>       >>
>>>       >> from dateutil.rrule import *
>>>       >> import datetime
>>>       >> import matplotlib.pyplot as plt
>>>       >> from matplotlib.ticker import FormatStrFormatter,
>>> MultipleLocator
>>>       >> from matplotlib.dates import DateFormatter, MonthLocator,
>>> DayLocator
>>>       >>
>>>       >> start = datetime.date(2013, 3, 29)
>>>       >> until = datetime.date(2014, 3, 29)
>>>       >> dates = rrule(MONTHLY, bymonthday=(29, -1), bysetpos=1,
>>> until=until)
>>>       >> for d in dates:print(d)
>>>       >>
>>>       >> dates = [start, until]
>>>       >> values = [0, 1]
>>>       >> plt.ylabel('Balance')
>>>       >> plt.grid()
>>>       >> ax = plt.subplot(111)
>>>       >> plt.plot_date(dates, values, fmt = 'rx-')
>>>       >> ax.xaxis.set_major_locator(MonthLocator(bymonthday =
>>>      (dates[0].day, -1)))
>>>       >> ax.xaxis.set_major_formatter(DateFormatter('%d/%m/%y'))
>>>       >> ax.yaxis.set_major_formatter(FormatStrFormatter('£%0.2f'))
>>>       >> ax.yaxis.set_minor_locator(MultipleLocator(5))
>>>       >> plt.axis(xmin=dates[0], xmax=dates[-1])
>>>       >> plt.setp(plt.gca().get_xticklabels(), rotation = 45,
>>> fontsize = 10)
>>>       >> plt.setp(plt.gca().get_yticklabels(), fontsize = 10)
>>>       >> plt.show()
>>>       >>
>>>       >
>>>       > Seems an apt date to realise that I didn't say much :(
>>>       >
>>>       > Assuming that I'm correct would you like an issue raised on
>>> the bug
>>>       > tracker?  If not please correct the mistake I've made,
>>> presumably in
>>>       > reading the docs, which I think are excellent by the way.
>>>       >
>>>
>>>      Anybody?
>>>
>>>      --
>>>      If you're using GoogleCrap™ please read this
>>>      http://wiki.python.org/moin/GoogleGroupsPython.
>>>
>>



-- 
If you're using GoogleCrap™ please read this 
http://wiki.python.org/moin/GoogleGroupsPython.

Mark Lawrence


------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to