[reportlab-users] Question about passing function to
labelTextFormat
reportlab
reportlab-users@reportlab.com
Tue, 16 Sep 2003 19:01:05 -0400
This is great stuff. I am really making some progress with graphing
time series data with reportlab.
Thanks for the very helpful explanation.
On Tue, 16 Sep 2003 23:18:46 +0100
Robin Becker <robin@reportlab.com> wrote:
> In article <64972.199.169.240.132.1063745970.squirrel@svr1.turboweb.net>
> , reportlab@sarcastic-horse.com writes
> >Hi-
> >
> >I have been making lineplots of time series data by converting the dates
> >to integers, where 1 is the beginning of the date range I want to graph.
> >
> >For example, if I want to plot a series from November, 1999 to March,
> >2000, then I convert:
> >
> >November, 1999 => 1
> >December, 1999 => 2
> >January, 2000 => 3
> >Februrary, 2000 => 4
> >March, 2000 => 5
> >
> >You get the idea.
> >
> >Then, to print x-axes with the dates, I wrote this function:
> >
> >def mk_date_labels(i):
> > dates = ['November, 1999', 'December, 1999', ... ] #you get the idea
> > return dates[i]
> >
> >Then I have been passing this function to
> >reportlab.graphics.charts.axes.XValueAxis.labelTextFormat like so:
> >
> >lp.xValueAxis.labelTextFormat = num2str #lp is my LinePlot() object
> >
> >This is great, but I want to change the mk_date_labels to get 2 args: the
> >indexing number, and also, the list to use to get the text string. How do
> >I write the function that way? I don't know enough about passing
> >functions as parameters to figure it out.
> ....
> in python you can have a keyword argument set at definition time.
> So you can have a factory function like
>
> def get_labels_func(dates):
> def num2str(i,dates=dates):
> return dates[i]
> return num2str
>
> ie get_labels_func is a function that returns a function. we know that
> the result function will be called with one argument, i, so dates will
> be kept with its default value which we pass in at creation time.
>
> So now you should be able to do
>
> lp.xValueAxis.labelTextFormat = get_labels_func(['November, 1999',
> 'December, 1999', ... ,'December 2003'])
>
> ie the strings become deciable at run time.
>
>
> Another way to do this is to set lp.xValueAxis.labelTextFormat to a
> callable instance since we test only for callability (not that it's a
> function).
>
> This way is probably more pythonic.
>
> class MyLabeller:
> def __init__(self,info):
> self.info = info
>
> def __call__(self,i):
> return self.info[i]
>
> not that although I have written the example above with self.info as a
> simple list it could be anything that helps to get the required string
> when i is given in the special __call__ method.
>
> Going on with this scheme we just set
>
> lp.xValueAxis.labelTextFormat = MyLabeller(['November, 1999',
> 'December, 1999', ... ,'December 2003'])
>
> MyLabeller([...]) produces an instance which is callable ie we
>
> can do
> >>> lf = MyLabeller(['A','B','C'])
> >>> lf(1)
> 'B'
> >>>
> hope this helps.
> --
> Robin Becker
> _______________________________________________
> reportlab-users mailing list
> reportlab-users@reportlab.com
> http://two.pairlist.net/mailman/listinfo/reportlab-users