[reportlab-users] Need to extend NormalDateXValueAxis to be with hour, minute and second

Fatih Karatana fatih at karatana.com
Tue May 17 06:33:10 EDT 2016


Thank you for your response, Robin. I'll look at what you've recently done
with and try to involve to the code. Do you mind if I let you know when
I face any hardness while developing? BTW, is there any progress different
from the latest version of your work?

On Tue, May 10, 2016 at 2:50 PM Robin Becker <robin at reportlab.com> wrote:

> On 09/05/2016 12:30, Fatih Karatana wrote:
> > Hi,
> >
> > In the current version, we have only date value on
> > NormalDateXValueAxis like "yyyy-mm-dd", but what I need to extend this
> display
> > by including hour, minutes and seconds too.
> >
> > It will certainly help on my project to arrange the LinePlot graph
> > values by hourly period.
> >
> > Any help and advice will be appreciated.
> >
>
> I eventually came up with this which seems to do something sensible
> although you
> may want to change the ticking strategy.
>
>
>
> class TimeValueAxis:
>         _mc = 60
>         _hc = 60*_mc
>         _dc = 24*_hc
>
>         def __init__(self,*args,**kwds):
>                 if not self.labelTextFormat:
>                         self.labelTextFormat = self.timeLabelTextFormatter
>                 self._saved_tickInfo = {}
>
>         def _calcValueStep(self):
>                 '''Calculate _valueStep for the axis or get from
> valueStep.'''
>                 if self.valueStep is None:
>                         rawRange = self._valueMax - self._valueMin
>                         rawInterval = rawRange /
>
> min(float(self.maximumTicks-1),(float(self._length)/self.minimumTickSpacing))
>                         #here's where we try to choose the correct value
> for the unit
>                         if rawInterval >= self._dc:
>                                 d = self._dc
>                                 self._unit = 'days'
>                         elif rawInterval >= self._hc:
>                                 d = self._hc
>                                 self._unit = 'hours'
>                         elif rawInterval >= self._mc:
>                                 d = self._mc
>                                 self._unit = 'minutes'
>                         else:
>                                 d = 1
>                                 self._unit = 'seconds'
>                         self._unitd = d
>                         if d>1:
>                                 rawInterval = int(rawInterval/d)
>                         self._valueStep = nextRoundNumber(rawInterval) * d
>                 else:
>                         self._valueStep = self.valueStep
>
>         def timeLabelTextFormatter(self,val):
>                 u = self._unitd
>                 k = (u,tuple(self._tickValues))
>                 if k in self._saved_tickInfo:
>                         fmt = self._saved_tickInfo[k]
>                 else:
>                         uf = float(u)
>                         tv = [v/uf for v in self._tickValues]
>                         s = self._unit[0]
>                         if _allInt(tv):
>                                 fmt = lambda x, uf=uf, s=s: '%.0f%s' %
> (x/uf,s)
>                         else:
>                                 stv = ['%.10f' % v for v in tv]
>                                 stvl =
> max((len(v.rstrip('0'))-v.index('.')) for v in stv)
>                                 if u==1:
>                                         fmt = lambda x,uf=uf,fmt='%%.%dfs'
> % stvl: fmt % (x/uf)
>                                 else:
>                                         #see if we can represent fractions
>                                         fm = 24 if u==self._dc else 60
>                                         fv = [(v - int(v))*fm for v in tv]
>                                         if _allInt(fv):
>                                                 s1 = 'h' if u==self._dc
> else ('m' if u==self._mc else 's')
>                                                 fmt = lambda
> x,uf=uf,fm=fm, fmt='%%d%s%%d%%s' % (s,s1): fmt %
> (int(x/uf),int((x/uf - int(x/uf))*fm))
>                                         else:
>                                                 fmt = lambda
> x,uf=uf,fmt='%%.%df%s' % (stvl,s): fmt % (x/uf)
>                         self._saved_tickInfo[k] = fmt
>
>                 return fmt(val)
>
>
>
> class XTimeValueAxis(_XTicks,TimeValueAxis,XValueAxis):
>         def __init__(self,*args,**kwds):
>                 XValueAxis.__init__(self,*args,**kwds)
>                 TimeValueAxis.__init__(self,*args,**kwds)
>
> --
> Robin Becker
> _______________________________________________
> reportlab-users mailing list
> reportlab-users at lists2.reportlab.com
> https://pairlist2.pair.net/mailman/listinfo/reportlab-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist2.pair.net/pipermail/reportlab-users/attachments/20160517/3abb2b44/attachment.html>


More information about the reportlab-users mailing list