
    Q?hai                       S r SrSSKJr  SSKJr  SSKJrJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJrJr  SSK7  SSKJr  SSKJrJrJrJrJrJ r J!r!J"r"  SS	K#J$r$J%r%  SS
K&J'r'J(r(J)r)J*r*  SSK+J,r,  SSK-J.r.  SSK/J0r0  SSK1J2r2  SOS jr3SOS jr4SOS jr5S r6 " S S5      r7 " S S5      r8 " S S5      r9 " S S5      r: " S S\$5      r; " S S\(5      r< " S  S!\;5      r=S" r>S# r? " S$ S%5      r@ " S& S'\@5      rA " S( S)\@\=5      rB " S* S+\A\=5      rC " S, S-5      rDS. rE " S/ S0\;5      rF " S1 S2\@\F5      rG/ S3QrH/ S4QrIS5 rJ " S6 S7\5      rK\K" 5       rLS8rM " S9 S:\G5      rN " S; S<\A\F5      rO " S= S>5      rP " S? S@\P\G5      rQ " SA SB\O5      rR " SC SD\F5      rS " SE SF\D5      rT " SG SH\D5      rU " SI SJ5      rV " SK SL\S\V\G5      rW " SM SN\S\V\O5      rXg)Pz3.3.0a  Collection of axes for charts.

The current collection comprises axes for charts using cartesian
coordinate systems. All axes might have tick marks and labels.
There are two dichotomies for axes: one of X and Y flavours and
another of category and value flavours.

Category axes have an ordering but no metric. They are divided
into a number of equal-sized buckets. Their tick marks or labels,
if available, go BETWEEN the buckets, and the labels are placed
below to/left of the X/Y-axis, respectively.

  Value axes have an ordering AND metric. They correspond to a nu-
  meric quantity. Value axis have a real number quantity associated
  with it. The chart tells it where to go.
  The most basic axis divides the number line into equal spaces
  and has tickmarks and labels associated with each; later we
  will add variants where you can specify the sampling
  interval.

The charts using axis tell them where the labels should be placed.

Axes of complementary X/Y flavours can be connected to each other
in various ways, i.e. with a specific reference point, like an
x/value axis to a y/value (or category) axis. In this case the
connection can be either at the top or bottom of the former or
at any absolute value (specified in points) or at some value of
the former axes in its own coordinate system.
    )log10)	lru_cache)isNumberisNumberOrNoneisListOfStringsOrNoneisListOfNumbersisListOfNumbersOrNoneisColorOrNoneOneOf	isBoolean
SequenceOfisStringEitherOr	ValidatorNoneOrisNormalDateisNoneOrCallable)*)
normalDate)DrawingLinePolyLineRectGroupSTATE_DEFAULTS_textBoxLimits_rotatedBoxLimits)WidgetTypedPropertyCollection)LabelPMVLabelXLabelDirectDrawFlowable)nextRoundNumber)
ShadedRect)Color)isSeqNc                    [        U S   S   5      (       a.  U(       a  XU4S jnOU4S jn[        [        U4S jU 5      5      n [        [        [        U  Vs/ s H  o Vs/ s H	  oc  M  UPM     snPM     sn5      5      n [	        U 5      S:X  a  U$ U" [        [        X05      5      5      nU(       a  U" U" U5      U5      $ U$ s  snf s  snf )Nr   c                     U" XU5      $ N )Txspecialfuncs       P/var/www/html/env/lib/python3.13/site-packages/reportlab/graphics/charts/axes.py<lambda>"_findMinMaxValue.<locals>.<lambda>6   s    ga$6G    c                 
    X   $ r*   r+   )r,   r-   s     r0   r1   r2   8   s    ADr3   c                 *    [        [        X5      5      $ r*   )listmap)efs     r0   r1   r2   9   s    c!hr3   )r'   r6   r7   filterlen)Vr-   defaultr/   r.   extraMinMaxValuesr9   rs           r0   _findMinMaxValuer@   3   s    QqT!W~~GA A
sa/2
3VC!D!QQ8Q!Q8!DEFA
1vqy.T#d+A.?4&'*FQF 9Ds   	C!C+C1CCc           	      "    [        XU[        X4S9$ )zfind minimum over V[i][x]r.   r>   )r@   minr<   r-   r=   r.   r>   s        r0   _findMinrE   ?   s    AG``r3   c           	      "    [        XU[        X4S9$ )zfind maximum over V[i][x]rB   )r@   maxrD   s        r0   _findMaxrH   C   s    AGaar3   c                 J    U  H  n [        U5      U:w  a    gM     g!      g= f)ztrue if all values are intr      int)valuesvs     r0   _allIntrO   G   s/    	1vqyy 
 	s   "c                   $    \ rS rSrSrS rS rSrg)AxisLabelAnnotationP   a/  Create a grid like line using the given user value to draw the line
v       value to use
kwds may contain
scaleValue  True/not given --> scale the value
            otherwise use the absolute value
labelClass  the label class to use default Label
all Label keywords are acceptable (including say _text)
c                     Xl         X l        g r*   _v_kwdsselfrN   kwdss      r0   __init__AxisLabelAnnotation.__init__Y       
r3   c                    U R                   R                  5       nUR                  S[        5      nUR                  SS5      n[	        US5      (       d  UR                  5         U(       a  UR                  OS " U R                  5      nUR                  (       a  UR                  nUnOUnUR                  nXbS'   XrS'   U" S0 UD6$ )	N
labelClass
scaleValueT_tickValuesc                     U $ r*   r+   r-   s    r0   r1   .AxisLabelAnnotation.__call__.<locals>.<lambda>c   s    ar3   r-   yr+   )rV   copypopr    hasattr_pseudo_configurescalerU   isYAxis_x_y)rX   axisrY   r^   r_   svr-   rd   s           r0   __call__AxisLabelAnnotation.__call__]   s    zz XXl51
XXl40
tM**""$&djjK7A<<AAAAS	S	!D!!r3   rV   rU   N__name__
__module____qualname____firstlineno____doc__rZ   ro   __static_attributes__r+   r3   r0   rQ   rQ   P   s    "r3   rQ   c                   $    \ rS rSrSrS rS rSrg)AxisLineAnnotationn   aS  Create a grid like line using the given user value to draw the line
kwds may contain
startOffset if true v is offset from the default grid start position
endOffset   if true v is offset from the default grid end position
scaleValue  True/not given --> scale the value
            otherwise use the absolute value
lo          lowest coordinate to draw default 0
hi          highest coordinate to draw at default = length
drawAtLimit True draw line at appropriate limit if its coordinate exceeds the lo, hi range
            False ignore if it's outside the range
all Line keywords are acceptable
c                     Xl         X l        g r*   rT   rW   s      r0   rZ   AxisLineAnnotation.__init__{   r\   r3   c                 F  ^ U R                   R                  5       nUR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  (       a  UR                  nUR
                  nOUR
                  nUR                  nUR                  SS 5      nUR                  SS 5      n	Ub  U	cY  [        [        USS 5      S	S 5      n
U
(       a  [        U
S
5      (       a  U
" 5       n
U
(       a  Uc  U
S   nU	c  U
S   n	O
Uc  SnU	c  Sn	UR                  SUR                  5      U-   nUR                  SS5      U-   n[        X5      [        X5      pUR                  SS5      nUR                  nU(       d  S Ul         U R                  nU(       a  X-   nOU(       a  X-   nUR                  X-
  X-
  UR                  SS 5      5      n[        US5      (       d  UR                  5         UR                  U5      mTU:  d  TU:  a%  U(       d   Xl        g TU:  a  UmOUmU4S jUl        U" U5      nUR                  5        H  u  nn[!        UUU5        M     [        U SS5      (       a  [#        SU ST SU 35        Xl        U$ ! Xl        f = f)Nr_   T	endOffsetFstartOffsetstartendjoinAxisgetGridDimsro   r   rJ   hilodrawAtLimitc                     U $ r*   r+   rb   s    r0   r1   -AxisLineAnnotation.__call__.<locals>.<lambda>   s    1r3   parentr`   c                    > T$ r*   r+   )r-   ds    r0   r1   r      s    qr3   _dbgzv=z --> d=z L=)rV   re   rf   rj   rk   rl   getattrrg   _lengthrC   rG   _get_line_posrU   _getLineFuncrh   itemssetattrprint)rX   rm   rY   r_   r   r   offsd0sr8   dimr   r   r   oaglprN   r/   Lkr   s                      @r0   ro   AxisLineAnnotation.__call__   sa   zz XXl40
HH[/	hh}U3<<77DB77DBHHWT"HHU4 9	'$z$7dKCws:..e9#a&a9#a&a9!a9!aXXd4<<(+XXd1b "jR2hh}U3""!,D	'AFF$$QVAF488HT3JKD4..&&(""1%Atqt"4 "' R4AA%0"QAzz|!!A $tF1%%1#WQCs1#./!& "'s   BJ %A+J J rq   Nrr   r+   r3   r0   rz   rz   n   s    6r3   rz   c                   $    \ rS rSrSrS rS rSrg)AxisBackgroundAnnotation   zCreate a set of coloured bars on the background of a chart using axis ticks as the bar borders
colors is a set of colors to use for the background bars. A colour of None is just a skip.
Special effects if you pass a rect or Shaded rect instead.
c                     Xl         X l        g r*   _colorsrV   )rX   colorsrY   s      r0   rZ   !AxisBackgroundAnnotation.__init__   s    
r3   c           
      2   U R                   nU(       d  g U R                  R                  5       nUR                  nU(       a  UR                  nUR
                  nOUR
                  nUR                  nUR                  SS 5      nUR                  SS 5      nUb  UcY  [        [        USS 5      SS 5      n	U	(       a  [        U	S5      (       a  U	" 5       n	U	(       a  Uc  U	S   nUc  U	S   nO
Uc  SnUc  Sn[        US5      (       d  UR                  5         [        USS 5      n
U
(       d  g [        5       n[        U5      nUR                  U
S   5      n[        S[        U
5      5       GH(  nUR                  X   5      nX.S-
  U-     nU(       a  U(       a  UnUnX-
  nX-
  nOUnUnX-
  nX-
  n[        U[        5      (       a  [!        UUUUUS S	9nO[        U[         5      (       aA  [!        UUUU5      nUR"                   H"  nUS
;  d  M  [%        UU[        UU5      5        M$     OS[        U[&        5      (       a>  ['        UUUUS
9nUR"                   H"  nUS
;  d  M  [%        UU[        UU5      5        M$     UR)                  W5        UnGM+     U$ )Nr   r   r   r   ro   r   rJ   r`   )	fillColorstrokeColor)r-   rd   widthheight)r   rV   re   rj   rk   rl   rf   r   rg   rh   r   r;   r   range
isinstancer&   r   __dict__r   r%   add)rX   rm   r   rY   rj   r   r   r   r8   r   tvGncolorsv0iv1crd   r-   r   r   r?   r   s                          r0   ro   !AxisBackgroundAnnotation.__call__   s[   vzz ,,77DB77DBHHWT"HHU4 9	'$z$7dKCws:..e9#a&a9#a&a9!a9!atM**""$T--6Gf+1&qR!A##BE*B!W}%AAAUFCEAAEESFa&&QqvdKA$''Qqv.AZZ$>>#Aa!5 (  *--"QfEAZZ$>>#Aa!5 ( aB7 "8 r3   r   Nrr   r+   r3   r0   r   r      s    :r3   r   c                   *    \ rS rSrSrS rS rS rSrg)TickLU   z$lookup special cases for tick valuesc                 >    UR                  SS5      U l        Xl        g )Naccuracy:0yE>)rf   r   r,   )rX   r,   rY   s      r0   rZ   TickLU.__init__   s    D1r3   c                 l    U R                   nU R                   H  u  p4[        X1-
  5      U:  d  M    g   gNTF)r   r,   absrX   tr   r-   rN   s        r0   __contains__TickLU.__contains__  s1    ==66CA13x   r3   c                     U R                   nU R                   H$  u  p4[        X1-
  5      U R                   :  d  M"  Us  $    [        SU-  5      e)Nzcannot locate index %r)r   r,   r   
IndexErrorr   s        r0   __getitem__TickLU.__getitem__  sE    ==66CA13x%  1A566r3   )r,   r   N)	rs   rt   ru   rv   rw   rZ   r   r   rx   r+   r3   r0   r   r      s    .7r3   r   c                       \ rS rSrS rS rS rS rS rSS jr	S/ 0 4S	 jr
SS/ 4S
 jrSS/ 4S jrSS jrS r\" \5      rS r\" \5      rSS jrS rS rSrg)_AxisGi  c                 D    U R                  U5      n US   nU$ !    U$ = fNr   )ri   )rX   rN   s     r0   r   _AxisG._get_line_pos  s3    JJqM	!A 	s    c                 p    U R                  U5      n[        XR                  U-   XR                  U-   5      $ r*   )r   r   rl   )rX   r-   r   r   s       r0   _cxLine_AxisG._cxLine  s/    q!Aww77S=99r3   c                 r    U R                  U5      n[        U R                  U-   XR                  U-   U5      $ r*   )r   r   rk   )rX   rd   r   r   s       r0   _cyLine_AxisG._cyLine  s1    q!DGGeOQ#q99r3   c           	          U R                  U5      nU R                  U-   nU R                  U-   n[        Xg5      [        Xg5      pvX-   n[	        XXU-   XU-   /SS9$ NrJ   )strokeLineJoin)r   rl   rC   rG   r   )	rX   r-   r   r   _3d_dx_3d_dyy0y1x1s	            r0   	_cxLine3d_AxisG._cxLine3d  s^    q!WWu_WWs]RCJBZbF2i8JJr3   c                     U R                  U5      nU R                  U-   nU R                  U-   n[        Xg5      [        Xg5      pvX-   n[	        XaXd-   XU-   U/SS9$ r   )r   rk   rC   rG   r   )	rX   rd   r   r   r   r   x0r   r   s	            r0   	_cyLine3d_AxisG._cyLine3d'  s^    q!WWu_WWs]RCJBZbif9R8JJr3   Nc                 "   [        USS 5      nUbG  [        USS 5      nU R                  =(       a    U R                  =(       d    U R                  nXXdU4S j$ U R                  =(       a    U R                  =(       d    U R
                  nXU4S j$ )Nr   r   c                     U" XX$US9$ )N)r   r   r+   )rN   r   r8   r9   r   r   s         r0   r1   %_AxisG._getLineFunc.<locals>.<lambda>4  s    aPQTUkqNrr3   c                     U" XU5      $ r*   r+   )rN   r   r8   r9   s       r0   r1   r   7  s
    !A(r3   )r   rj   r   r   r   r   )rX   r   r   r   r   r   r9   s          r0   r   _AxisG._getLineFunc/  sr    .VHT2F/A4>>A$qfrr-=A$q::r3   c                    ^ U R                  X#U
5      n[        U S5      (       d  U R                  5         T(       a'  U R                  =(       a    U4S j=(       d    U4S jnOS nU R                   H  nU" U5      nU(       a  U" U5      (       a  M!  UUl        UUl        UUl        UUl        UUl	        U	Ul
        X;   a)  X   R                  5        H  u  nn[        UUU5        M     UR                  U5        M     g )Nr`   c                 "   > U R                   T;   $ r*   )r   lexcludes    r0   r1   #_AxisG._makeLines.<locals>.<lambda>>  s    addgor3   c                 "   > U R                   T;   $ r*   )r   r   s    r0   r1   r   >  s    QTTU\_r3   )r   rg   rh   rj   r`   r   strokeWidthstrokeDashArrayr   strokeLineCapstrokeMiterLimitr   r   r   )rX   gr   r   r   r   r   r   r   r   r   r   specialsr/   exfr   r   arN   s              `       r0   
_makeLines_AxisG._makeLines9  s      62tM**""$,,>$=]C\CC!!AG3q668 + +$3!#1 "/%5"='{002!!A  3a "r3   c                 r   U R                   nU R                  =(       d    SnU(       a  U(       a  U R                  (       a  U R                  nU R                  nUb  UcA  U(       a  [        US5      (       a  U" 5       nU(       a  Uc  US   nUc  US   nO
Uc  SnUc  SnU(       d  U(       ay  U R                  (       a  U R                  n	OU R                  n	U R                  XU	-
  X-
  XVU R                  U R                  U R                  U R                  X4[        U S0 5      S9  U R                  XU/ S9  g))this is only called by a container objectr   Nro   rJ   _gridSpecials)r   r   r   )r   )gridStrokeColorgridStrokeWidthvisibleGrid	gridStartgridEndrg   rj   rk   rl   r   gridStrokeDashArraygridStrokeLineJoingridStrokeLineCapgridStrokeMiterLimitr   _makeSubGrid)
rX   r   r   r   r   r   wr   r8   r   s
             r0   makeGrid_AxisG.makeGridO  s0       %At''AAyAI73z22%Cyc!f!yc!f!ya!ya!A<<!WWdD&D4L4LTMdMdeie{e{  }A  }V  }V  ^d  ~E  FJ  KZ  []  ~^  _!r2r3   c                    [        U SS5      (       a  U R                  S:  d  gU R                  nU R                  =(       d    SnU(       a  U(       d  gU R                  nU R
                  nUb  UcA  U(       a  [        US5      (       a  U" 5       nU(       a  Uc  US   nUc  US   nO
Uc  SnUc  SnU(       d  U(       a  U R                  (       a  U R                  n	OU R                  n	U R                  5       n
 U R                  XU	-
  X-
  XVU R                  U R                  U R                  U R                  X4S9  Xl        gg! Xl        f = f)r   visibleSubGridr   Nro   rJ   )r   r   )r   
subTickNumsubGridStrokeColorsubGridStrokeWidthsubGridStart
subGridEndrg   rj   rk   rl   _calcSubTicksr   subGridStrokeDashArraysubGridStrokeLineJoinsubGridStrokeLineCapsubGridStrokeMiterLimitr`   )rX   r   r   r   r   r   r  r   r8   r   otvs              r0   r  _AxisG._makeSubGride  sB   -a00T__Q5F####(qQOO9	ws:..e9#a&a9#a&a9!a9!a||DGGT$$$&C'D&D4O4OPTPjPjko  lE  lE  FJ  Fb  Fb  jp  A#&   $' s   <AE Ec                 z    Uc%  U R                   U R                  4U R                     nUc  XR                  -   nX4$ r*   )rk   rl   rj   r   )rX   r   r   s      r0   r   _AxisG.getGridDims  s9    =477477"3DLL"A%;eLL0yr3   c                     [        U SS 5      S:X  a  gU R                  R                  nUS   S:H  =(       d    US S S:H  $ )N
_dataIndexrJ   Tr   Y   AdjYr   	__class__rs   rX   acns     r0   rj   _AxisG.isYAxis  sA    4T*A-dnn%%1vs{-c"1gvo-r3   c                     [        U SS 5      S:X  a  gU R                  R                  nUS   S:H  =(       d    US S S:H  $ )Nr  r   TX   NormalDateXr  r  s     r0   isXAxis_AxisG.isXAxis  sB    4T*A-dnn%%1vs{5c#2h55r3   c                 d    Uc  [        U S/ 5        U H  nUR                  U" U 5      5        M     g )Nannotations)r   r   )rX   r   Ar-   s       r0   addAnnotations_AxisG.addAnnotations  s+    9gd=4AEE!D'N r3   c                    [        U S/ 5      S S  n0 nS Hd  n/ R                  n/ R                  nU H&  n[        XcS5      (       a
  U" U5        M  U" U5        M(     UR                  X#'   UR                  US S & Mf     US==   U-  ss'   U$ )Nr(  )early
beforeAxis	afterAxisbeforeTicks
afterTicksbeforeTickLabelsafterTickLabelslater   r4  )r   append__self__)rX   r)  DrN   RPr   s          r0   _splitAnnotations_AxisG._splitAnnotations  s    Dr*1-*A 		A		A1q>>aDaD	 
 ::AD::AaD* 	
&	Q	r3   c                 V   [        5       nU R                  5       nU R                  XS   5        U R                  (       a  U R                  XS   5        UR	                  U R                  5       5        U R                  XS   5        U R                  XS   5        UR	                  U R                  5       5        U R                  XS   5        U R                  XS   5        UR	                  U R                  5       5        U R                  XS   5        U R                  XS   5        U$ )	Nr-  r.  r/  r0  r1  r2  r3  r4  )r   r:  r*  visibler   makeAxis	makeTicksmakeTickLabels)rX   r   r)  s      r0   draw_AxisG.draw  s    G""$Aj)<<L/2EE$--/"K.1M"23EE$.."#L/2$6"78EE$%%'($5"67Ai(r3   )r`   r*   NN)rs   rt   ru   rv   r   r   r   r   r   r   r   r  r  r   rj   propertyr%  r*  r:  rA  rx   r+   r3   r0   r   r     s    ::KK; BF  OQ  [] , !R 3, !%D '4
. wG6 wG
$r3   r   c                   2    \ rS rSr\" \\" \SS9S9rS r	Sr
g)CALabeli  z?where in the category range [0,1] the labels should be anchoreddesc)BASElabelPosFracc                 P    [         R                  " U 40 UD6  U R                  SS9  g )N      ?)rJ  )r!   rZ   _setKeywordsrX   kws     r0   rZ   CALabel.__init__  s+    $$$" 	 	r3   r+   N)rs   rt   ru   rv   AttrMapr!   AttrMapValuer   _attrMaprZ   rx   r+   r3   r0   rF  rF    s    H#H3tu
Hr3   rF  c                   "   \ rS rSrSrSr\" Se0 S\" \SS9_S\" \SS9_S	\" \S
S9_S\" \SS9_S\" \SS9_S\" \	SS9_S\" \
SS9_S\" \SS9_S\" \" SSS5      SS9_S\" \" SSS5      SS9_S\" \	SS9_S\" \	SS9_S\" \
S S9_S!\" \S"S9_S#\" \" SSS5      S$S9_S%\" \" SSS5      S&S9_S'\" \	S(S9_S)\" \S*S9_S+\" \S,S9_S-\" \S.S9_S/\" S0S1S9_S2\" \S3S9_S4\" S0S5S9_S6\" \S7S9_S8\" \S9S9_S:\" \" S;S<S=5      S>5      _S?\" \" S@SASBSC5      SDS9_SE\" \SFS9_SG\" \SHS9_SI\" \
SJS9_SK\" \	SLS9_SM\" \	SNS9_SO\" S0SPS9_SQ\" \	SRS9_SS\" \	STS9_SU\" \" SVSWSXSY5      SZ5      _S[\" \S\S9_6rS] rS^ rSfS_ jrS` rSa rSb rSc rSdrg0)gCategoryAxisi  z+Abstract category axis, unusable in itself.rJ   r=  Display entire object, if true.rG  visibleAxisDisplay axis line, if true.visibleTicksDisplay axis ticks, if true.visibleLabelsDisplay axis labels, if true.r   Display axis grid, if true.r   Width of axis line and ticks.r   Color of axis line and ticks.r   Dash array used for axis line.r   r      #Line cap 0=butt, 1=round & 2=squarer   $Line join 0=miter, 1=round & 2=bevelr   $miter limit control miter line joinsr   Width of grid lines.r   Color of grid lines.r   Dash array used for grid lines.r  (Grid Line cap 0=butt, 1=round & 2=squarer   )Grid Line join 0=miter, 1=round & 2=bevelr  )Grid miter limit control miter line joinsr   #Start of grid lines wrt axis originr   !End of grid lines wrt axis origindrawGridLast-if true draw gridlines after everything else.labelsNHandle of the axis labels.categoryNameszList of category names.r   Join both axes if true.joinAxisPos*Position at which to join with other axis.reverseDirection#If true reverse category direction.styleparallelstackedparallel_3dz$How common category bars are plottedlabelAxisModehighlowrm   axispmv*Like joinAxisMode, but for the axis labels	tickShiftzTick shift typicallytickStrokeWidthWidth of ticks if specified.tickStrokeColorColor of ticks if specified.loPadz*extra inner space before start of the axishiPadz'extra inner space after end of the axisr(  list of annotationsloLLen*extra line length before start of the axishiLLen'extra line length after end of the axisskipGridnonetopbothbottom'grid lines to skip top bottom both noneinnerTickDraw#Callable to replace _drawInnerTicksc                 *   U R                   R                  S:w  d   S5       eSU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        SU l
        SU l        SU l        [        S   U l        [        S	   U l        [        S
   =U l        U l        [        S   =U l        U l        [        S   =U l        U l        SU l        [        S   U l        [        S	   U l        S =U l        U l        [        S
   U l        [        S   U l        [        S   U l        [7        [8        5      U l        S U l        S U l        S U l         S U l!        SU l"        SU l#        SU l$        S U l%        SU l&        SU l'        SU l(        SU l)        SU l*        g )NrU  z(Abstract Class CategoryAxis Instantiated2   d   r   rJ   Fr   r   r   r   r         ?rm   rx  )+r  rs   rk   rl   r   	_catCountr=  rW  rY  r[  r   rm  r   r   r   r   r   r   r  r   r  r   r   r   r   r   r   r   rF  ro  rq  r   rs  joinAxisModer{  ru  rw  _labelTextFormatr  r  r  r  r  rX   s    r0   rZ   CategoryAxis.__init__  s   ~~&&6b8bb6  !)-8-.?@8FGW8XX$"56D_6UU!3<JK]<^^!D$9#-m<#12C#D (,,,-=>+O< ./A B-g6 " # !
 !%

r3   c                 d    [        U5      U l        [        U5      U l        [        U5      U l        g r*   floatrk   rl   r   rX   r-   rd   lengths       r0   setPositionCategoryAxis.setPosition&  #    ((V}r3   c                    [        [        [        [        U5      5      5      U l        U=(       dE    U R
                  U R                  -
  U R                  -
  [        U R                  =(       d    S5      -  U l	        U R                  5         U R                  S:X  aJ  [        U R                  5       VVs/ s H!  n[        U Vs/ s H  oDU   PM	     sn5      PM#     snnU l        g g s  snf s  snnf )NrJ   r~  )rG   r6   r7   r;   r  r   r  r  r  	_barWidth_calcTickmarkPositionsr{  r   sum_pmv)rX   multiSeriesbarWidthr   seriess        r0   	configureCategoryAxis.configure,  s    T#c+"678!ft||DJJ'>tzz'I5QUQ_Q_QdcdKe&e##%*MRSWSaSaMbcMbkBkFQikBCMbcDI +Bcs   3C+C&C+&C+c                     U R                   nU R                  (       a$  [        U5       Vs/ s H  o"S-   PM	     snU l        g U R                  (       a  [        [        SU5      5      U l        g [        [        US-   5      5      U l        g s  snf )NrL  rJ   )r  r  r   r`   ru  r6   )rX   nr   s      r0   r  #CategoryAxis._calcTickmarkPositions3  se    NN>>/4Qx8x!#x8D$$#'b#4 #'ac
#3   9s   Bc                 L    U R                   (       a  U R                  U-
  S-
  nU$ NrJ   )ru  r  rX   idxs     r0   _scaleCategoryAxis._scale=  s"      s(:1(<#
r3   c                 <    U R                  U5      U R                  4$ )z/Returns the position and width in drawing unitsloScaler  r  s     r0   ri   CategoryAxis.scaleA  s    S!4>>22r3   c                 D    U R                  U5      SU R                  -  -   $ )z-Returns the bar mid position in drawing unitsrL  r  r  s     r0   midScaleCategoryAxis.midScaleE  s    ||C 3t~~#555r3   ))r  r  r  r   r  r`   rk   rl   rq  rm  r   r   r   r   r  r   r  r   r  r  r   r  rs  r{  ro  r  r  ru  r   r   r   r   r   r   rw  r  r=  rW  r   r[  rY  r+   r*   )rs   rt   ru   rv   rw   _nodocrQ  rR  r   r   r
   r	   r   r   r   r   rS  rZ   r  r  r  r  ri   r  rx   r+   r3   r0   rU  rU    s   1F &
y/PQ&
"93PQ&
 $I4RS&
 %Y5TU	&

 #93PQ&
 #82QR&
 #=7VW&
 ''<Ccd&
 %U1Qq\7\]&
 &eAal8^_&
 (6\]&
 'x6LM&
 '};QR&
 ++@Ghi&
 )q1;ef&
  *%!A,<gh!&
"  ,H:ef#&
$ !6[\%&
& ~4WX'&
( $I4cd)&
* d)EF+&
, %%:AZ[-&
.  +DE/&
0 #>8de1&
2 (	8]^3&
4 U:iFGmn5&
6 %U6%	%JQ}~7&
8 !1GH9&
: '~<Z[;&
< '};YZ=&
> X,XY?&
@ X,UVA&
B #4-BCC&
D h-YZE&
F h-VWG&
H  fU6( CDmnI&
J %%5<abK&
HP4l%d436r3   rU  c                 b    U R                   (       d   SU R                  R                  -  5       eg )Nz/Cannot connect to other axes (%s), but Y- ones.)rj   r  rs   rm   s    r0   _assertYAxisr  I  #    <<dJT^^MdMddd<r3   c                 b    U R                   (       d   SU R                  R                  -  5       eg )Nz/Cannot connect to other axes (%s), but X- ones.)r%  r  rs   r  s    r0   _assertXAxisr  K  r  r3   c                   ^    \ rS rSrSr\S 5       r\S 5       rS rSS jr	S r
S	 rSS
 jrSrg)_XTicksiN  r   c                 0    [        U SU R                  5      $ )Nr  )r   r   r  s    r0   actualTickStrokeWidth_XTicks.actualTickStrokeWidthQ      t-d.>.>??r3   c                 0    [        U SU R                  5      $ )Nr  )r   r   r  s    r0   actualTickStrokeColor_XTicks.actualTickStrokeColorU  r  r3   c                 z   [        U SS 5      nU(       a
  U" XX#5        g U(       d  U(       a  U R                  nU R                  nU(       a%  U(       a  U(       d  Xe-  nOU(       a  U(       d  Xe-  nU R                  X1U* U R                  XPR
                  U R                  U R                  U R                  5	        g g )Nr  )	r   r  _tickTweaksr   r  r   r   r   r   )rX   tUtDr   itdsWtWs          r0   _drawTicksInner_XTicks._drawTicksInnerY  s    d?402++B!!BbBBOOA"T%?%?CWCWX\XkXklpl~l~  @D  @U  @U  V r3   Nc                 r    U=(       d
    [        5       nU R                  (       a  U R                  XU5        U$ r*   )r   rY  r  )rX   r  r  r   s       r0   
_drawTicks_XTicks._drawTicksg  s+    L  q)r3   c                     [        U SS5      (       aD  U R                  S:  a3  U R                  5       n SU l        U R	                  XU5        U ?X@l        g g g ! U ?X@l        f = f)NvisibleSubTicksr   rJ   )r   r	  r  _subTickingr  r`   )rX   r  r  r   r  s        r0   _drawSubTicks_XTicks._drawSubTicksm  sm    4)!,,1B$$&C'#$ $$R1-$#&  2C, $#& s   A 
A"c                 "   U R                   n U R                  [        U SS5      5      U l         U R                  U R                  U R
                  5      nU R                  [        U SS5      [        U SS5      U5        UXl         $ ! Xl         f = fNtickAxisModerm   	subTickHir   	subTickLo)rl   _labelAxisPosr   r  tickUptickDownr  )rX   yoldr   s      r0   r?  _XTicks.makeTicksw  sw    WW	((nV)LMDGDMM:AwtK:74TU;VWXYGdG   A1B Bc                     U R                   nU(       aF  U=(       d    U R                  nUS:X  a  UR                  $ US:X  a  UR                  UR                  -   $ U R                  $ Nr}  r|  )r   r{  rl   r   rX   moderm   s      r0   r  _XTicks._labelAxisPos  Q    }}-4--Du}wwww--wwr3   )r  r`   rl   r*   )rs   rt   ru   rv   r  rD  r  r  r  r  r  r?  r  rx   r+   r3   r0   r  r  N  sK    K@ @ @ @V'r3   r  c                   $    \ rS rSrSS jrS rSrg)_YTicksi  Nc                     U R                   nU(       aF  U=(       d    U R                  nUS:X  a  UR                  $ US:X  a  UR                  UR                  -   $ U R                  $ r  )r   r{  rk   r   r  s      r0   r  _YTicks._labelAxisPos  r  r3   c                 "   U R                   n U R                  [        U SS5      5      U l         U R                  U R                  U R
                  5      nU R                  [        U SS5      [        U SS5      U5        UXl         $ ! Xl         f = fr  )rk   r  r   r  	tickRighttickLeftr  )rX   xoldr   s      r0   r?  _YTicks.makeTicks  sw    WW	((nV)LMDGt}}=AwtK:74TU;VWXYGdGr  )rk   r*   )rs   rt   ru   rv   r  r?  rx   r+   r3   r0   r  r    s    r3   r  c                       \ rS rSrSr\" \\" \SS9\" \SS9\" \	" SSSS	S
5      SS9S9r
SrS rS rSS jrS rS rS rS rSrg
)XCategoryAxisi  zX/category axisTick length up the axis.rG  Tick length down the axis.r  r  valuepointsNIMode used for connecting axis ('bottom', 'top', 'value', 'points', None).)rI  r  r  r  r   c                     [         R                  U 5        SU R                  l        SU R                  l        SU l        SU l        g )Nr  r      )rU  rZ   ro  	boxAnchordyr  r  r  s    r0   rZ   XCategoryAxis.__init__  s7    d# # r3   c                    U R                  SSS5        U R                  S/5        / SQU l        SU R                  l        SU R                  S   l        S	U R                  S   l        [        S
S5      nUR                  U 5        U$ )N   F      
      r	  (   r  )OneTwoThreeFourFiver  r8   r  Z      r  r  r  rq  ro  r  angler   r   rX   r   s     r0   demoXCategoryAxis.demo  st    R%()*@ ##&A !AC	dr3   c                     [        U5        US:X  a  UR                  U l        gUS:X  a  UR                  UR                  -   U l        gUS:X  a  UR                  U5      U l        gUS:X  a  X0l        gg)!Join with y-axis using some mode.r  r  r  r   Nr  rl   r   ri   rX   yAxisr  poss       r0   
joinToAxisXCategoryAxis.joinToAxis  sa    U8hhDGU]hh.DGW_kk#&DGXG r3   c                     U R                   nU(       aD  U R                  nUS;   a  U R                  XS9  g US;   a  U R                  XU R                  S9  g g g )Nr  r  r  r  r   r  r!  r   r  r"  rs  rX   jajams      r0   _joinToAxisXCategoryAxis._joinToAxis  Y    ]]##C''-++$2B2BC ,	 r3   c                 r    U R                   U R                  -   U R                  U5      U R                  -  -   $ )z'returns the x position in drawing units)rk   r  r  r  r  s     r0   r  XCategoryAxis.loScale  s,    ww#dkk#&6t~~&EEEr3   c                    [        5       nU R                  5         U R                  (       d  U$ [        U R                  U R
                  -
  U R                  U R                  U R                  -   U R                  -   U R                  5      nU R                  Ul	        U R                  Ul
        U R                  Ul        UR                  U5        U$ r*   r   r-  rW  r   rk   r  rl   r   r  r   r   r   r   rX   r   rm   s      r0   r>  XCategoryAxis.makeAxis      GDGGDKK'$''DLL2H2TVZV]V]^++++#33	dr3   c                    [        5       nU R                  (       d  U$ U R                  nUGbG  U R                  n[	        U5      nU R
                  nU R                  nU R                  5       nU R                  nU R                  S:X  a  U R                  OS n	[        U5       H  n
U(       a  X:-
  S-
  nOU
nX:  a  M  X-
  nXR                  ;   a  U R                  U   nOU R                  U
   nU	(       a"  UR                  nX   =ol
        US:  a  US-  nOSnUR                  nXU-   U-  -   nUR                  UX}-   5        UR!                  X+   =(       d    S5        UR#                  U5        M     U$ Nr~  rJ   r    )r   r[  rq  r  r;   ru  r  r  rk   r{  r  r   ro  r  rJ  	setOriginsetTextr   )rX   r   rq  catCountr  ru  r  rl   rk   pmvr   iclabel_dyrN   lpfr-   s                    r0   r@  XCategoryAxis.makeTickLabels  sP   G!!!8**$~~HM"A#44~~H##%BB#119<$))$C8_#(*Q,Rb5(jKK' KK.E KKNE((C%(W,A
sC2ICC((C%8++"&)m/526e' %* r3   )rl   rq  r  r  r  Nrs   rt   ru   rv   rw   rQ  rU  rR  r   r   rS  r  rZ   r  r"  r-  r  r>  r@  rx   r+   r3   r0   r  r    sr    Lh+--/#E(E7Hd$S\^
H J
DF$r3   r  c            
           \ rS rSrSr\" \\" \SS9\" \SS9\" \	" S5      SS9S9r
S	rS
 rS rSS jrS rS rS rS rSrg)YCategoryAxisi  zY/category axisTick length left of the axis.rG  Tick length right of the axis.leftrightr  r   NIMode used for connecting axis ('left', 'right', 'value', 'points', None).)rI  r  r  r  rJ   c                     [         R                  U 5        SU R                  l        SU R                  l        SU l        SU l        g )Nr8   r  r  r   )rU  rZ   ro  r  dxr  r  r  s    r0   rZ   YCategoryAxis.__init__   s7    d# # r3   c                    U R                  SSS5        U R                  S/5        / SQU l        SU R                  l        SU R                  S   l        S	U R                  S   l        [        S
S5      nUR                  U 5        U$ )Nr  r  rR   )r  r  r	  )r  r  r  r8   r   ra  r  r  r  r  r  s     r0   r  YCategoryAxis.demo)  sr    R$
|$2 ##&A !AC	dr3   Nc                    [        U5        US:X  a  UR                  S-  U l        gUS:X  a"  UR                  UR                  -   S-  U l        gUS:X  a  UR                  U5      S-  U l        gUS:X  a  US-  U l        ggz!Join with x-axis using some mode.rK        ?rL  r  r   Nr  rk   r   ri   rX   xAxisr  r!  s       r0   r"  YCategoryAxis.joinToAxis6  sv     	U6>hhnDGW_xx%--/36DGW_kk#&,DGXCiDG r3   c                     U R                   nU(       aD  U R                  nUS;   a  U R                  XS9  g US;   a  U R                  XU R                  S9  g g g N)rK  rL  r&  r'  r(  r)  r*  s      r0   r-  YCategoryAxis._joinToAxisC  r/  r3   c                 X    U R                   U R                  U5      U R                  -  -   $ )z'Returns the y position in drawing units)rl   r  r  r  s     r0   r  YCategoryAxis.loScaleL  s#    wwS)$..888r3   c                    [        5       nU R                  5         U R                  (       d  U$ [        U R                  U R
                  U R                  -
  U R                  U R
                  U R                  -   U R                  -   5      nU R                  Ul	        U R                  Ul
        U R                  Ul        UR                  U5        U$ r*   r   r-  rW  r   rk   rl   r  r   r  r   r   r   r   r4  s      r0   r>  YCategoryAxis.makeAxisP  s    GDGGTWWT[[0$''477T\\;QRVR]R];]^++++#33	dr3   c                 
   [        5       nU R                  (       d  U$ U R                  nUGbU  U R                  n[	        U5      nU R
                  nU R                  nU R                  nU R                  5       nU R                  n	U R                  S:X  a  U R                  OS n
[        U5       H  nU(       a  X;-
  S-
  nOUnX:  a  M  X-
  nXR                  ;   a  U R                  U   nOU R                  U   nUR                  nXU-   U-  -   nU
(       a#  UR                  nX   =nUl        US:  a  US-  nOSnUR                  UU-   U5        UR!                  X,   =(       d    S5        UR#                  U5        M     U$ r8  )r   r[  rq  r  r;   ru  r  ro  r  rl   r{  r  r   rJ  rO  r;  r<  r   )rX   r   rq  r=  r  ru  r  ro  rk   rl   r>  r   r?  r@  rB  rd   _dxrN   s                     r0   r@  YCategoryAxis.makeTickLabels]  s]   G!!!8**$~~HM"A#44~~H[[F##%BB#119<$))$C8_#(*Q,Rb5(jKK' KK.E KKNE((C%8++((C%(W,A
sC2ICC3*m/526e' %( r3   )rk   rq  r  r  rK  NrE  r+   r3   r0   rG  rG    sj    L02 13#E*T$U\^
H J D9$r3   rG  c                       \ rS rSrSrS rSrg)TickLabelleri  zlAbstract base class which may be used to indicate a change
in the call signature for callable label formats
c                     g)NzAbstract class instance calledr+   )rX   rm   r  s      r0   ro   TickLabeller.__call__  s    /r3   r+   Nrs   rt   ru   rv   rw   ro   rx   r+   r3   r0   rg  rg    s    0r3   rg  c                     SU -  $ )Nz%.12gr+   rb   s    r0   r1   r1     s    7Q;r3   c                   N   \ rS rSrSr\" S0 S\" \" \\	" S5      45      SS9_S\" \SS9_S	\" \S
S9_S\" \SS9_S\" \SS9_S\" \SS9_S\" \
SS9_S\" \SS9_S\" \SS9_S\" \	" SSS5      SS9_S\" \	" SSS5      SS9_S\" \
SS9_S \" \
S!S9_S"\" \S#S9_S$\" \S%S9_S&\" \	" SSS5      S'S9_S(\" \	" SSS5      S)S9_S*\" \
S+S9_S,\" \S-S9_S.\" \S/S9_S0\" \S1S9_S2\" \
S3S9_S4\" \
S5S9_S6\" S7S8S9_S9\" \	" S:S;S<5      S=S9_S>\" S7S?S9_S@\" S7SAS9_SB\" \SCS9_SD\" \SES9_SF\" \SGS9_SH\" \SIS9_SJ\" \SKS9_SL\" \" \\" \
SSSSM945      SNS9_SO\" \" \\" \
SSSSM945      SPS9_SQ\" \" \" \5      \" \SSSSM945      SRS9_SS\" \	" STSUSVSW5      SX5      _SY\" \SZS9_S[\" \	" S\S]S^5      S_5      _S`\" \	" STSaSbSU5      ScS9_Sd\" \SeS9_Sf\" \SgS9_Sh\" \SiS9_Sj\" \	" S:S;S<5      SkS9_Sl\" \SmS9_Sn\" S7SoS9_Sp\" \
SqS9_Sr\" \
SsS9_St\" \
SuS9_Sv\" \
SwS9_Sx\" \
SyS9_Sz\" \S{S9_S|\" \S}S9_S~\" \
S!S9_S\" \S#S9_S\" \S%S9_S\" \	" SSS5      S'S9_S\" \	" SSS5      S)S9_S\" \
S+S9_S\" \S-S9_S\" \S/S9_S\" \
SS9_S\" \
SS9_S\" \SS9_S\" \SS9_S\" \SS9_S\" \	" STSSUS5      S5      _S\" \SS9_S\" \SS9_S\" \SS9_6rS rS rS rS r\" 5       S 5       rS rS rS rS rS rS rS rS rS r S r!S r"S r#S r$S r%Sr&g7)	ValueAxisi  z(Abstract value axis, unusable in itself.	forceZeronearzEnsure zero in range if true.rG  r=  rV  rW  rX  r[  r\  rY  rZ  r   r]  r   r^  r   r_  r   r`  r   r   rJ   ra  rb  r   rc  r   rd  r   re  r   rf  r   rg  r  rh  r   ri  r  rj  r   rk  r   rl  rm  rn  minimumTickSpacingz)Minimum value for distance between ticks.maximumTickszMaximum number of ticks.ro  Nrp  r{  r|  r}  rm   r  labelTextFormatz3Formatting string or function used for axis labels.labelTextPostFormatzExtra Formatting string.labelTextScalezScaling for label tick values.valueMinzMinimum value on axis.valueMaxzMaximum value on axis.	valueStepzStep size used between ticks.
valueStepsz&List of step sizes used between ticks.avoidBoundFracemptyOKr   r   z.Fraction of interval to allow above and below.avoidBoundSpacezSpace to allow above and below.abf_ignore_zerozMSet to True to make the avoidBoundFrac calculations treat zero as non-special
rangeRoundr  r  ceilingfloorzHow to round the axis limits
zrangePrefz!Zero range axis limit preference.rw  normalry  rz  zHow values are plotted!skipEndLr   r   zSkip high/low tick labelsorigShiftIPC"Lowest label shift interval ratio.origShiftMinMinimum amount to shift.origShiftSpecialValuezspecial value for shiftr  z$Like joinAxisMode, but for the ticksru  rv  r(  r  r  r  r  r  r	  zNumber of axis sub ticks, if >0r  zsub tick down or leftr  zsub tick up or rightr  z Display axis sub ticks, if true.r  zDisplay axis sub grid, if true.r  r
  r  r  r  r  r  r  r  r  subTickStrokeWidthz Width of sub ticks if specified.subTickStrokeColorz Color of sub ticks if specified.r  r  keepTickLabelsInsidez?Ensure tick labels do not project beyond bounds of axis if truer  r  r  r  requiredRangezMinimum required value range.r  r  r>   z*extra values to use in min max calculationc                 $   U R                   R                  S:w  d   S5       eU R                  " SP0 UD6  U R                  " SP0 SS_SS_SS_SS	_S
S_SS_SS_SS_SS_SS_SS_S[        S   _S[        S   _S[        S   _S[        S   _S[        S   _SS_S[        S   _S[        S   _S[        S   _S[        S   _S[        S   _SS _SS _S S!_S"S_S#S_S$S_S%S_S&S_S'[        S   _S([        S   _S)[        S   _S*S_S+[        S   _S,[        S   _S-S _S.S _S/[	        [
        5      _S0S_S1S2_S3S4_S5S _S6S7_S8S _S9S _S:S _S;S _S<S _S=S _S>S _S?S _S@S!_SASB_SCS_SDSE_SFSB_SGS _SHS _SIS _SJS7_SKS_SLS_SMS_SNS_SOS _6  SU R                  l        g )QNrm  z%Abstract Class ValueAxis Instantiated_configuredr   rk   r  rl   r   r  r=  rJ   rW  r[  rY  r   rn  r   r   r   r   r   r   r   r  r   r   r   r  r  r   r   rm  Fr  r  r	  r  r  r  r  r  r  r
  r  r  r  ro  r  rp  r  rq     r  r{  rm   rr  rs  rt  ru  rv  rw  ry  r|  r}  r~  r  r  rw  r  r  r  r  r  r  ru  r  r  r  r>   r+   )r  rs   rM  r   r   r    ro  r  rN  s     r0   rZ   ValueAxis.__init__  s   ~~&&3\5\\3B R	&'R	
  R	  R	 #&R	 #$R	 '(R	 )*R	 ()R	 '(R	 %&R	" '(#R	$ '5]&C%R	& +99J*K'R	( +99I*J)R	* )7(G+R	, ,::L+M-R	. +//R	0 +9*G1R	2 /==N.O3R	4 /==M.N5R	6 -;?,K7R	8 0>>P/Q9R	: %);R	< #'=R	> (-?R	@ *+AR	B +,CR	D &'ER	F %&GR	H %&IR	J 1??O0PKR	L 0>o/NMR	N 3AAS2TOR	P .2QR	R .<M-JSR	T 2@@Q1RUR	V (,WR	X &*YR	Z "9!?[R	\ 01]R	b .0cR	d ()eR	l ,0mR	n )/oR	p +/qR	r /3sR	t *.uR	~ $(R	@ $(AR	B %)CR	D *.ER	F +/GR	H +0IR	J &,KR	L &'MR	N !)OR	P "(QR	R (,SR	T (,UR	V 15WR	X (.YR	Z *+[R	\  !]R	^  !_R	` '(aR	b +/cR	f r3   c                 d    [        U5      U l        [        U5      U l        [        U5      U l        g r*   r  r  s       r0   r  ValueAxis.setPosition1  r  r3   c                 F    U R                  U5        U R                  5         g)a  Let the axis configure its scale and range based on the data.

Called after setPosition. Let it look at a list of lists of
numbers determine the tick mark intervals.  If valueMin,
valueMax and valueStep are configured then it
will use them; if any of them are set to None it
will look at the data and make some sensible decision.
You may override this to build custom axes with
irregular intervals.  It creates an internal
variable self._values, which is a list of numbers
to use in plotting.
N)	_setRange_configure_end)rX   
dataSeriess     r0   r  ValueAxis.configure7  s     	z"r3   c                 R    U R                  5         U R                  5         SU l        g r  )r  _calcScaleFactorr  r  s    r0   r  ValueAxis._configure_endG  s"    ##%r3   c                 L    Xl         X l        U R                  5       u  p4X4US-  4$ )Nr   )	_valueMin	_valueMax_calcStepAndTickPositions)rX   ru  rv  rw  r,   s        r0   _getValueStepAndTicksValueAxis._getValueStepAndTicksL  s+    !!446	Yt^++r3   c                     U R                   nUS:  aj  X!-
  nXC:  aa  SX!-   -  nUS-  n[        XS-
  U5      n[        XS-   U5      nUS:  a  US:  a  US-   U-
  nSnOUS:  a  US:  a  Xv-
  nSnU=ol        U=o l        X4$ )Nr   rL  r  )r  rC   rG   
_cValueMin
_cValueMax)rX   ru  rv  rrr?   mr   y2s           r0   _preRangeAdjustValueAxis._preRangeAdjustS  s    a4#At*+c	h'h'S=RVcBBBq[RTBB-//?-//?  r3   c                 v
   U R                   =p#U R                  =pEUc'  [        XR                  SU R                  5      =o0l        Uc'  [        XR                  SU R                  5      =oPl        X5:X  a\  US:X  aA  Uc+  Uc(  [        U SS5      nUS:  a  UnSnO8US:  a  SnUnO-SnSnO(U R                   c  SnOSnOUS:  a  SU-  nSnOSnSU-  n[        U SS5      (       a  [        [        US	S5      5      nS
nXU-
  -  n	Xl
        Xpl        XR                  -  U l        X4S jn
Uc%  [        XR                  SXR                  S9=o0l        Uc%  [        XR                  SXR                  S9=oPl        U R                  X55      u  p5U R                  nUnUnU R                   nU(       aD  US:X  a&  [#        [%        U5      [%        U5      5      SXS-
  -  :*  nU(       a  US:  a  SnOUS:  a  SnU R&                  n[        U SS5      (       + nU=(       a    Un[)        U5      (       d  X4n[        U SS5      n[)        U5      (       d  UU4nUS:g  =(       a    UnU(       a  US;   nUS;   nOS=nnU R*                  nUnU(       a  [)        U5      (       d  UU4n[        U R                  5      nU=(       d    U=(       d    UnSnU(       Ga{  US::  Gat  US-  nSnU(       d  U(       a  U R-                  X55      u  nnnU(       a  UUS   -  nUUS   -  nOS=nnU(       a+  XS-
  U-  n[/        UUS   U-  5      n[/        UUS   U-  5      nU(       a  US   n OUn UU-
  n!US   (       d  [%        U 5      U:  a  U U!U-   :  a  U!nSnU(       a  US   n OUn UU-   n!US   (       d  [%        U 5      U:  a  U U!U-
  ::  a  U!nSnU(       aq  U R-                  X55      u  nnnU(       a'  UUS   U-
  :  a  US   U-
  nSnOUUS   U-   :  nUS   nU(       a'  UUS   U-   :  a  US   U-   nSnOUUS   U-
  :*  nUS   nU(       a	  US::  a  GMt  U(       a  U(       d  WU l        OSU l        X0l        XPl        U R6                  n"U R8                  n#U#c  U"b  U R:                  n$U R=                  5         U R4                  U R2                  p5U$b  [%        U$U-
  5      S:  aS  U"(       a  U"U R>                  -  n%OSn%U#(       a  [/        U%XS-
  U#-  U R                  -  5      n%U =R2                  U%-  sl        U RA                  5         g)zSet minimum and maximum axis values.

The dataSeries argument is assumed to be a list of data
vectors. Each vector is itself a list or tuple of numbers.

Returns a min, max tuple.
Nr   r  g{Gz?g{Gz333333?        _bubblePlotra  r  c                 z     U S   nX5U-  S-  -  nU" X   U-   X   U-
  5      $ ! [          a    [        S-  n N2f = f)Nra  皙?rL  )r   	bubbleMAx)r,   r-   r/   bubbleV	bubbleMaxrN   s         r0   r.   $ValueAxis._setRange.<locals>.special  sV    &!A iK#--ADLg66 " &!#A&s   $ ::rB   ro  r  rx  r}  Fr  r  r  r  r  r  rJ   r  ư>)!ru  rv  rE   r  r>   r  rH   r  r   r  _bubbleV
_bubbleMaxr   _bubbleRadiusr  r~  rn  rC   r   ry  r'   r|  r  rG   _computedValueStepr  r  r  r  r  _calcValueStep
_valueStep_rangeAdjust)&rX   r  oMinru  oMaxrv  zrpr  fracr  r.   r~  cMincMaxrn  abfdo_rrdo_abfabfizrrnrrxabSdo_absaLgoiterrw  r,   fuzzi0i1sfrN   ur  r  r  r  s&                                         r0   r  ValueAxis._setRangeg  sn    --'--'(:oo^_aeawaw:xxX(:oo^_aeawaw:xxX{<DL!$|A6C1u#&#$Q#$#&#'#(]]*$H#HA:"8|H"H"H"8|H4d++hz!A67ID8+,G#M'O!%ll!2D)0 7 |(:oo^_ho  CY  CY  ;Z  ZX|(:oo^_ho  CY  CY  ;Z  ZX!11(D__
NN	& Hc(m<8CT@UU	A:xaZA!!Dd33Szz(C.6U||5LEf$. 00C 22CMC#""::3h4<< &f&T2XAIDB%)%?%?%S"	1d"3q6)B"3q6)BKB"+R/BRAr	*BRAr	*BAaD"aG!HAtAdF HBAbE"aG!HAtAdF HB%)%?%?%S"	1d!T	)#$Q4	>%qtDy0#$Q4"d
*#$R5?%quTz1#$R5U T2XV &/D#&*D#!!((((#|'?$($>$>!!!%h$,4I(4R0STX0X$T__4AAAx0,>t||KLA!#r3   c                     U R                   U l        U R                  U l        [	        U S5      (       a  U ?U R                  5         g )N_subTickValues)ru  r  rv  r  rg   r  r  r  s    r0   rh   ValueAxis._pseudo_configure  s7    4())t/Br3   c                     g)zOverride this if you want to alter the calculated range.

E.g. if want a minumamum range of 30% or don't want 100%
as the first point.
Nr+   r  s    r0   r  ValueAxis._rangeAdjust  s     	r3   c                     g)zuOverride if you want to put slack at the ends of the axis
eg if you don't want the last tick to be at the bottom etc
Nr+   r  s    r0   _adjustAxisTicksValueAxis._adjustAxisTicks  s     	r3   c                     U R                   [        U R                  U R                  -
  5      -  U l        U R                  $ zoCalculate the axis' scale factor.
This should be called only *after* the axis' range is set.
Returns a number.
)r   r  r  r  _scaleFactorr  s    r0   r  ValueAxis._calcScaleFactor  s3    
 !LL5$..1P+QQ   r3   c                    [        U SS 5      nU(       a	  U ?Xl        OU R                  5         U R                  nU R                  nU R
                  nSU-  nU R                  n[        [        U5      U-  5      nXa-  nUS;   a  XrU-   :  a  US-  nOXrU-
  :  a  US-  n[        [        U5      U-  5      nX-  nUS;   a  XsU-
  :  a  US-  nOXsU-   :  a  US-  nU[        XhS-   5       V	s/ s H  oU-  PM	     sn	4$ s  sn	f )Nr  r   r  rJ   r  )
r   r  r  r  r  r  r~  rL   r  r   )
rX   rw  ru  rv  r  r~  r  rN   r  r   s
             r0   r  #ValueAxis._calcStepAndTickPositions$  s   D!5d;	''O!I>>>>I~__
x*+L))$a}_bAgbx*+L++$a}_bAgbuR1~>~!I+~>>>>s   ,C>c                 (    U R                  5       S   $ r  )r  r  s    r0   _calcTickPositionsValueAxis._calcTickPositions<  s    --/22r3   c                    [        U S5      (       d  U R                  5         U R                  n[        U S5      (       Gd  U R                  R                  nUS S S:X  a	  Sn[
        nOSnS nU Vs/ s H  n[        USS	5      (       d  M  UPM     nn/ R                  n[        U R                  5      n[        U5      n	U	S
:  a	  / U l
        GOU	S
:X  a  US	   US   -
  n
O6U	S:X  a  [        US	   US   -
  US
   US	   -
  5      n
OU	S	-  n	XiS	-      Xi   -
  n
X-  nU R                  U-   nU R                  U-
  nUS   U:  a  UR                  SUS   U
-
  5        US   U:  a  UR                  US   U
-   5        U
[        US	-   5      -  n
[!        US S 5       H=  u  p[#        U5       H)  nX" US	-   U
-  5      -   nUU::  d  UU:  a  M!  U" U5        M+     M?     UR$                  U l
        U R                  U l        U$ s  snf )Nr`   r  r#  r$  r   r   c                     U $ r*   r+   rb   s    r0   r1   )ValueAxis._calcSubTicks.<locals>.<lambda>J  s    r3   _doSubTicksrJ   ra     r  )rg   rh   r`   r  rs   rL   r   r5  r	  r;   r  rG   r  r  insertr  	enumerater   r6  )rX   r  r  iFuzzdCnvr   OTVr,   nstr   dstr  vnvxr-   jr   s                    r0   r  ValueAxis._calcSubTicks?  s   tM**""$t,--..))C3Bx&! #C"wr-'B2CC		Adoo&CCAs&(#a4a&Q-CTc!fSVmCF3q6M:C!GAc(SV+Cy^^D(^^D(q6"9cjj3q6#:6r72:szz#b'#+6uSU|#$S"X.CA"3ZdAaC9o-b5ArE8! ( /
 '(jj#..
7 Ds   1G=G=c                     [        U SS5      U l        U R                  (       a  U R                  $ U R                  5       U l        U R                  5         U R                  $ )zKCalculate a list of tick positions on the axis.  Returns a list of numbers.rx  N)r   r`   r  r  r  s    r0   r   ValueAxis._calcTickmarkPositionsi  sP    "4T:D$4$44224r3   c                    U R                   co  U R                  U R                  -
  nU[        [	        U R
                  S-
  5      [	        U R                  5      U R                  -  5      -  n[        U5      U l	        gU R                   U l	        g)8Calculate _valueStep for the axis or get from valueStep.NrJ   )
rw  r  r  rC   r  rq  r   rp  r$   r  )rX   rawRangerawIntervals      r0   r  ValueAxis._calcValueStepq  sk    >>!~~6H"St/@/@/B)CU4<<EXY]YpYpEp%rrK-k:DO"nnDOr3   c                 ,    [        U R                  5      $ r*   )rO   r`   r  s    r0   _allIntTicksValueAxis._allIntTicksz  s    t''((r3   c                    [        5       nU R                  (       d  U$ U R                  nUc:  U R                  =(       d&    U R	                  5       =(       a    S=(       d    [
        nOMU[        L a  U R	                  5       (       a  SnO,[        US5      (       a  UR                  U R                  5        U R                  nU R                  nU R                  U R                  /nU R                  nU R                  5       USU-
  '   U R                   nU R"                  S:w  ab  U R$                  (       a  U R                  nOU R                  nU R"                  S:X  a  U/nO&XU R&                  -   /nU R"                  S:X  a  US	 O/ n[)        U R                  5      n	U	S-
  n
[+        U R                  5       GH  u  pX-
  nX;   a  X}   nOX{   nU(       d  M!  UR,                  (       d  M4  U R/                  U5      nU(       a  U H  n[1        X-
  5      S:  d  M  S n  O   Uc  Mo  Ub  X-  nOUn[3        U[        5      (       a  UU-  nOn[5        U5      (       a  U[)        U5      :  a  X+   nOJS	nOG[        US
5      (       a(  [3        U[6        5      (       a
  U" U U5      nOU" U5      nO[9        SU-  5      eU(       a  UU-  nXU'   UR:                  " U6   UR=                  U5        U R>                  (       a  [3        U [@        5      (       a  U R                  nU(       d:  URC                  5       u  nnnnUU:  a  URE                  URF                  U-   U-
  S9nX:X  aI  UU R&                  -   nURC                  5       u  nnnnUU:  a  URE                  URF                  U-
  U-   S9nURI                  U5        GM     U$ )Nz%.0f
calcPlacesrJ   r  r   r   r   r  r:  ro   zInvalid labelTextFormat %s)rO  )%r   r[  r  rr  r  _defaultLabelFormatterstrrg   r   r`   rs  rt  rk   rl   r  r  ro  r  r%  r   r;   r  r=  ri   r   r   r'   rg  
ValueErrorr;  r<  r  
XValueAxis	getBoundsclonerO  r   )rX   r   r9   postsclr!  r   ro  sknticksnticks1r   tickr@  rN   skvr   txta_xr   r   r   r   a_x1s                           r0   r@  ValueAxis.makeTickLabels}  s+   G!!!8!!9$$b):):)<)G)aKaA#X$++--6qQ|$$LL))*''!!ww OO%%'AaC==& ||WWWW}}g%TDLL)==%'1BT%%&1* 0 01FAHE	qU]]]JJt$!su:d? $A!  " = H !!S))Q3qs1v:"#$C"$C :..%a55"#D)C"#A$C()E)IJJ4#:SFOOS)MM#& 00%dJ77"&''C#$161BBB#%8,1KK588c>B;NK,OE z'*DLL'8161BBB#%9*/++"T9I+*JEEE%Le 2h r3   c                    U R                   (       d   S5       eUc  SnU R                  U R                  4U R                     nU R                  nU R
                  (       a  U* nX R                  -  nX#XR                  -
  -  -   $ )zfConverts a numeric value to a plotarea position.
The chart first configures the axis, then asks it to
1Axis cannot scale numbers before it is configuredr   )r  rk   rl   r  r  ru  r   r  )rX   r  orgr  s       r0   ri   ValueAxis.scale  s{     T!TT=!% ww 1  B<<C/000r3   )r  r  r  r  r  r  r  r   r  r  r`   r  r  r  rk   rl   r+   )'rs   rt   ru   rv   rw   rQ  rR  r   r   r   r   r
   r	   r   r   r   r   rS  rZ   r  r  r  r   r  r  r  rh   r  r  r  r  r  r  r  r  r  r@  ri   rx   r+   r3   r0   rm  rm    s   . F
 9U6]*C!DKjkF
y/PQF
 #93PQF
 %Y5TU	F

 $I4RSF
 #93PQF
 #82QRF
 #=7VWF
 ''<CcdF
 %U1Qq\7\]F
 &eAal8^_F
 (6\]F
 'x6LMF
 '};QRF
 ++@GhiF
  )q1;ef!F
" *%!A,<gh#F
$  ,H:ef%F
& !6[\'F
( ~4WX)F
* $I4cd+F
, *(9de-F
. $H3MN/F
0 d)EF1F
2 %U6%%?Frs3F
4 't2gh5F
6 +46PQ7F
8 &n;[\9F
:  5MN;F
<  5MN=F
> !6UV?F
@ ""7>fgAF
B &hz([\`aef?g/h&i  qa  bCF
D 'x
8\]abfg@h0i'j  rS  TEF
F 'x	1B:i`aefjkCl0m'n  vE  FGF
H  fVIg FGefIF
J ".7Z[KF
L U8ImDE^_MF
N  fWU6 BIdeOF
P $N9]^QF
R $N9STSF
T !-^B[ \UF
V $E&v$>EklWF
X (	8]^YF
Z #4-BC[F
\ h-YZ]F
^ h-VW_F
` "(1RSaF
b !0GHcF
d !0FGeF
f 'y7YZgF
h &i6WXiF
j *(9OPkF
l *->TUmF
n "..CJk!loF
p  ,E!AaL>hiqF
r !-U1Qq\?j ksF
t #/x=h"iuF
v $N9^_wF
x ".7Z[yF
z 'x6TU{F
| *(9[\}F
~ *->`aF
@ '};YZAF
B  ,I<}~CF
D  fU6( CDmnEF
F %^:YZGF
H %%5<abIF
J ))>EqrKF
HPVp% 
 [, ,!(_B!?03(T -)Tl1r3   rm  c                       \ rS rSrSr\" \\" \SS9\" \SS9\" SSS9\" \	" SS	S
SS5      SS9\" \
SS9S9rSrS rS rSS jrS rS rSrg)r  i  zX/value axisr  rG  r  Nrr  r  r  r  r   r  rt  )rI  r  r  r   r  rs  r   c                     [         R                  " U 40 UD6  SU R                  l        SU R                  l        SU R                  l        SU l        SU l        S U l        S U l	        S U l
        g )Nr  r   r  r  )rm  rZ   ro  r  rO  r  r  r  r   r  rs  rN  s     r0   rZ   XValueAxis.__init__  s\    4%"% # r3   c                     U R                  SSS5        U R                  S/5        [        SS5      nUR                  U 5        U$ )Nr  r     r  r  r  r  r  r   r   r  s     r0   r  XValueAxis.demo  s@    R%()*C	dr3   c                    [        U5        US:X  a  UR                  S-  U l        gUS:X  a"  UR                  UR                  -   S-  U l        gUS:X  a  UR                  U5      S-  U l        gUS:X  a  US-  U l        gg)r  r  rU  r  r  r   Nr  r  s       r0   r"  XValueAxis.joinToAxis  su    U8hhnDGU]xx%--/36DGW_kk#&,DGXCiDG r3   c                     U R                   nU(       aM  U R                  =(       d    SnUS;   a  U R                  XS9  g US;   a  U R                  XU R                  S9  g g g )Nr  r%  r&  r'  r(  r)  r*  s      r0   r-  XValueAxis._joinToAxis  s^    ]]##/xC''-++$2B2BC ,	 r3   c                    [        5       nU R                  5         U R                  (       d  U$ [        U R                  U R
                  -
  U R                  U R                  U R                  -   U R                  -   U R                  5      nU R                  Ul	        U R                  Ul
        U R                  Ul        UR                  U5        U$ r*   r3  r4  s      r0   r>  XValueAxis.makeAxis   r6  r3   )rl   r   r  rs  r  r  rD  rs   rt   ru   rv   rw   rQ  rm  rR  r   r   r   rS  r  rZ   r  r"  r-  r>  rx   r+   r3   r0   r  r    s    Ih+--/*,#E(E7Hd$S\^">=?
H J 
 Dr3   r  )janfebmaraprmayjunjulaugsepoctnovdec)      r0  r	  r0  r	  r0  r0  r	  r0  r	  r0  c                     U R                  S5      u  p[        U5      nUR                  5       n[        R	                  U5      S-   nU[
        US-
     ::  d   eX44$ )zThis accepts and validates strings like "31-Dec" i.e. dates
of no particular year.  29 Feb is allowed.  These can be used
for recurring dates.  It returns a (dd, mm) pair where mm is the
month integer.  If the text is not valid it raises an error.
-rJ   )splitrL   lower_monthsindex_maxDays)dmstrdstrmstrddmms        r0   parseDayAndMonthr>  9  sX     S!JD	TB::<D	t	q	 B"Q$8Or3   c                   $    \ rS rSrSrS rS rSrg)_isListOfDaysAndMonthsiG  zThis accepts and validates lists of strings like "31-Dec" i.e. dates
of no particular year.  29 Feb is allowed.  These can be used
for recurring dates.
c                 n    [        U5      (       a  SnU H  n [        U5      u  pEM     U$ g!   Sn M  = fr   )r'   r>  )rX   r-   answerelementr<  r=  s         r0   test_isListOfDaysAndMonths.testL  sC    88F#-g6FB 
 M	#"Fs   -4c                     U$ r*   r+   )rX   r-   s     r0   	normalize _isListOfDaysAndMonths.normalizeX  s    r3   r+   N)rs   rt   ru   rv   rw   rD  rG  rx   r+   r3   r0   r@  r@  G  s    
r3   r@  )rJ   ra  r           <   x         i,  ih  i  i  i  iX  i  iH  i  i8  i  i`	  c                   @   \ rS rSrSr\" \\" \SS9\" \	SS9\" \	SS9\" \	SS9\" \
SS9\" S	S
S9\" \" \SSSS9SS9\" \" \SSSS9SS9\" \	SS9\" \" \" \5      5      SS9\" \	SS9\" \" SSSS5      S5      S9r\R$                  rS rS rS rS rS rS rS  rS!rg	)"NormalDateXValueAxisi_  zAn X axis applying additional rules.

Depending on the data and some built-in rules, the axis
displays normalDate values as nicely formatted dates.

The client chart should have NormalDate X values.
z.Fractional amount used to adjust label spacingrG  z$Flag for displaying months 'nicely'.z0Flag for enforced displaying of last date value.z1Flag for enforced displaying of first date value.zList of dates in format "31-Dec","1-Jan".  If present they will always be used for tick marks in the current year, rather than the dates chosen by the automatic algorithm. Hyphen compulsory, case of month optional.Nz3Label format string (e.g. '{mm}/{yy}') or function.r   r  rz  zWeekday names.rJ  zMonth names.zATrue if we are to assume daily data to be ticked at end of month.z/Actual tick values to use; no calculations donez@clear rather than delete close ticks when forced first/end datesr  r  r  r  r  )rI  bottomAxisLabelSlack	niceMonthforceEndDateforceFirstDateforceDatesEachYearxLabelFormatdayOfWeekName	monthName	dailyFreqspecifiedTickDatesspecialTickClearr  c                     [         R                  " U 40 UD6  SU l        SU l        SU l        SU l        / U l        SU l        SU l        / SQU l	        / SQU l
        SU l        S =U l        U l        g )Nr  rJ   r   z	{mm}/{yy})MondayTuesday	WednesdayThursdayFridaySaturdaySunday)JanuaryFebruaryMarchAprilMayJuneJulyAugust	SeptemberOctoberNovemberDecember)r  rZ   rR  rS  rT  rU  rV  rZ  rW  rX  rY  r\  rx  r[  rN  s     r0   rZ   NormalDateXValueAxis.__init__{  sv    D&2& %(!"$'kV !488$1r3   c                 H    U R                  5       nUR                  U5        U$ )z'Convert a scalar to a NormalDate value.)_valueClassrG  )rX   r-   r   s      r0   
_scalar2NDNormalDateXValueAxis._scalar2ND  s     	Ar3   c                    [        U[        R                  5      (       d  U R                  U5      n[        R                  [        R
                  p2 U R                  U R                  s[        l        [        l        UR                  U R                  5      X#s[        l        [        l        $ ! X#s[        l        [        l        f = f)z(Create a formatted label for some value.)
r   r   
NormalDatert  _dayOfWeekName
_monthNamerX  rY  formatMSrW  )rX   rN   r   r  s       r0   _dateFormatter#NormalDateXValueAxis._dateFormatter  s    !J1122"A((**?*?1	D?C?Q?QSWSaSa<J%z'<::d//0?@<J%z'<q<J%z'<s   AB- -Cc                   ^  T R                   nT R                  nT R                  n[        U[        5      (       a  U 4S jnT R
                  (       d  US   OU" T R
                  5      nT R                  (       d  US   OU" T R                  5      nT R                  nUR                  UR                  UR                  pnUR                  UR                  UR                  pn[        U" U5      R                  S5      UX=(       d    SU	-  X5      n[!        US   US   US   US   U5      nUS   US   -
  nUS   US   -
  n[#        XR$                  =(       d    ST R&                  5      nUUT R(                  -  -   n/ n/ nT R*                  nT R,                  (       a  T R,                   Vs/ s H  nU" U5      PM     nnU Vs/ s H  nU" U5      PM     nnT R.                  (       aM  UUS   :X  aD  U[1        US   US   -
  5      -  US   US   -
  -  U::  a  T R2                  (       a  S	US'   OUS	 US	 T R4                  (       aP  UUS   :X  aG  U[1        US   US   -
  5      -  US   US
   -
  -  U::  a   T R2                  (       a	  S	US
'   UU4$ US
	 US
	 UU4$ T R6                  (       Ga  [9        [;        [<        T R6                  5      5      nUR?                  5       nUR?                  5       n/ n/ nUnUU::  aj  U HW  u  nn[@        RB                  " UUU45      nUU:  d  M'  UU::  d  M/  URE                  U5        URE                  U" U5      5        MY     US-  nUU::  a  Mj  T R.                  (       aw  UUS   :w  an  URG                  SU5        URG                  SU" U5      5        U[1        US   US   -
  5      -  US   US   -
  -  U::  a  T R2                  (       a  S	US'   OUS	 US	 T R4                  (       ax  UUS   :w  ao  URE                  U5        URE                  U" U5      5        U[1        US   US   -
  5      -  US   US
   -
  -  U::  a   T R2                  (       a	  S	US
'   UU4$ US
	 US
	 UU4$ XUU4S jn[I        U5      n[J         GH  nUU-  n U U::  d  M  U U-  U::  d  M  US-
  n!T RL                  (       aW  URO                  5       US:*  =(       a    U=(       d    S-  n"U"(       a(  T R4                  (       a  U" U!5        SUS   l(        U!U"-  n! URO                  5       US   RO                  5       :H  n#U!U#:  a  U" U!5        U!U-  n!U!U#:  a  M  T R.                  (       a_  US   U:w  aV  U" S5        SUS   l(        U[1        US   US   -
  5      -  US   US   -
  -  U::  a  T R2                  (       a  S	US'   OUS	 US	 T R4                  (       a\  T RL                  (       aK  W"(       aD  U[1        US   US   -
  5      -  US   US
   -
  -  U::  a  T R2                  (       a  S	US
'   OUS
	 US
	  US   (       a  US   US   :X  a  US	 US	 UU4s  $    [U        S5      es  snf s  snf !   Sn# GN9= f! [R         a     N3f = f)zComplex stuff...

Needs explanation...

Yes please says Andy :-(.  Modified on 19 June 2006 to attempt to allow
a mode where one can specify recurring days and months.
c                 (   > TR                  TU 5      $ r*   )r{  )r  rX   s    r0   	formatter4NormalDateXValueAxis._xAxisTicker.<locals>.formatter  s    **455r3   r   r  
r  rJ   ra  r  r:  r9  c                 `    UR                  SX   5        UR                  SU" X   5      5        g r   )r  )r   xValsr  ticksro  s        r0   addTick2NormalDateXValueAxis._xAxisTicker.<locals>.addTick  s'    LL58$MM!Ieh/0r3   rJ  z6Problem selecting NormalDate value axis tick positions)+rs  r   r{  r   rg  ru  rv  ro  fontNamefontSizeleading
textAnchorr  r  r   r4  r   rG   r   rp  rR  rq  r[  rU  r  r\  rT  rV  r6   r7   r>  yearr   NDr5  r  r;   _NDINTMrS  monthr  r   r  )$rX   r  VC
axisLengthr  	firstDateendDatero  r  r  r  r  r  r  RBLxLabelWxLabelHr  Wr  rq  r-   r   forcedPartialDates	firstYearlastYearyyyyr<  r=  theDater  r  r   r   r  wfds$   `                                   r0   _xAxisTicker!NormalDateXValueAxis._xAxisTicker  s    \\
''	i--6$(MME!Hr$--7H	#'==%)b6G&,oovG'-'8'8&:J:JFLLu
Yy177=h4HZKAs1vc!fSVUCa&Q-a&Q-)$*A*ABa))))((""$($;$;<$;qRU$;E<,12EqilEF2""y%(':
5QVWYQZ[`ab[cQcKd@dglmngopuvwpxgx?y{|?|(( "F1Ia&)  WeBi%7ZeTViX]^_X`N`Ha=adijldmnstvnwdw<xz{<{((!#F2J &=  b	6":&= 
 """!%c*:D<S<S&T!U "(I||~HEFD (" 2HR(mmT2rN;G)+70BW-i&89	 !3
 	 (" ""y%(':Q	*a	) 45uU2YuQx%78858E!H;LMqP,,$&q	!!HfQi  WeBi%7W%i01uU2YuQx%78859U2Y;NOQRR,,%'r

 &=  ""Ivbz &= "uV 	1 J A!A,1Q3*#4aC>>1b5;Q+<"=A,,#AJ12E!H0Q#//+uQx~~/??C fAJFA f &&58Y+>AJ)*E!H("5r58);#<<uQxa?PQSTT00(*F1I %a&)$$A"5r58);#<<uRyr?RSUVV00)+F2J %b	6":ayVAYq	%9!!HfQi f}$U V QRRW =2\C. " s*   -Y+Y0$Y5<Y?5Y<?
ZZc                     U R                   nU HB  n[        [        U5      5       H'  nX4   u  pV[        XR5      (       a  M  U" U5      U4X4'   M)     MD     g)z1Convert all XValues to a standard normalDate typeN)rs  r   r;   r   )rX   datar  r7  r   r-   rd   s          r0   
_convertXVNormalDateXValueAxis._convertXV*  sN     A3q6]t!!''qE!9AD # r3   c                 @   U R                   (       ax  / nSnUS   nU H4  nUR                  5       nX6:w  a  U(       a  UR                  U5        UnUnM6     US   nUS   W:w  a  UR                  U5        U R                  U5      u  pxXx4$ U R                  U5      u  pxXx4$ )Nr   r  )rZ  r  r5  r  )	rX   r  xEOMpmpxr-   r  stepsro  s	            r0   _getStepsAndLabels'NormalDateXValueAxis._getStepsAndLabels4  s    >>DBqBGGI54;;r?B  rBBx{DKKO --d3ME } !--e4ME}r3   c                    U R                  U5        [        5       nU H   nU H  nUR                  US   5        M     M"     [        U5      nUR	                  5         U R
                  nU R                  U5      u  pgU R                  U R                  pUc  US   OU" U5      nU	c  US   OU" U	5      n	XsU l	        U l
        X`l        Xpl        U R                  [        X-
  5      -  U l        X`l        SU l        g )Nr   r  rJ   )r  setr   r6   sortrs  r  ru  rv  r  r  r`   r  r   r  r  r  )
rX   r  r  r-   dvr  r  ro  ru  rv  s
             r0   r  NormalDateXValueAxis.configureF  s    A		"Q%    U

..u5!]]DMM( ( 058bl ( 059bl)1&  & LL51D+EE r3   )r  r  r  r`   r  r  rR  rZ  rX  rV  rT  rU  rY  rS  r\  r[  rx  rW  )rs   rt   ru   rv   rw   rQ  r  rR  r   r   isListOfDaysAndMonthsr   r   r   r   r   rS  r   r  rs  rZ   rt  r{  r  r  r  r  rx   r+   r3   r0   rQ  rQ  _  s    j+H;kl 1WX#I4fg%i6ij)*? Gk l $D/de$Za1%MTde HQ"!KR`a 1tu)&L1I*J  RC  D'	8z{fU6( CDmn
H" --K9"	DKSZ%$r3   rQ  c                       \ rS rSrSr\" \\" \SS9\" \SS9\" SSS9\" \	" S5      S	S9\" \
S
S9S9rSrS rS rSS jrS rS rSrg)
YValueAxisi[  zY/value axisrH  rG  rI  Nrr  rJ  rM  rt  )rI  r  r  r   r  rs  rJ   c                     [         R                  U 5        SU R                  l        SU R                  l        SU R                  l        SU l        SU l        S U l        S U l	        S U l
        g )Nr8   r  r   r  )rm  rZ   ro  r  rO  r  r  r  r   r  rs  r  s    r0   rZ   YValueAxis.__init__n  sW    4  # r3   c                     S/nU R                  SSS5        U R                  U5        [        SS5      nUR                  U 5        U$ )N)r  r  r	  *   r  r  rR   r  r  )rX   r  drawings      r0   r  YValueAxis.demo|  sE     !b"%t#s#Dr3   c                    [        U5        US:X  a  UR                  S-  U l        gUS:X  a"  UR                  UR                  -   S-  U l        gUS:X  a  UR                  U5      S-  U l        gUS:X  a  US-  U l        ggrT  rV  rW  s       r0   r"  YValueAxis.joinToAxis  st    U6>hhnDGW_xx%--/36DGW_kk#&,DGXCiDG r3   c                     U R                   nU(       aD  U R                  nUS;   a  U R                  XS9  g US;   a  U R                  XU R                  S9  g g g r[  r)  r*  s      r0   r-  YValueAxis._joinToAxis  r/  r3   c                    [        5       nU R                  5         U R                  (       d  U$ [        U R                  U R
                  U R                  -
  U R                  U R
                  U R                  -   U R                  -   5      nU R                  Ul	        U R                  Ul
        U R                  Ul        UR                  U5        U$ r*   r`  r4  s      r0   r>  YValueAxis.makeAxis  s    GDGGTWWT[[0$''477T\\;QRVR]R];]^++++#33	dr3   )rk   r   r  rs  r  r  re  r#  r+   r3   r0   r  r  [  sz    I02 13*,#E*T$U\^">=?
H J 
 D
r3   r  c                   >    \ rS rSrSrS\-  rS\-  rS rS rS r	Sr
g)	TimeValueAxisi  rL  rK  c                 V    U R                   (       d  U R                  U l         0 U l        g r*   )rr  timeLabelTextFormatter_saved_tickInforX   argsrY   s      r0   rZ   TimeValueAxis.__init__  s!    ###'#>#>D !r3   c                 :   U R                   c  U R                  U R                  -
  nU[        [	        U R
                  S-
  5      [	        U R                  5      U R                  -  5      -  nX R                  :  a  U R                  nSU l	        OOX R                  :  a  U R                  nSU l	        O,X R                  :  a  U R                  nSU l	        O	SnSU l	        X0l        US:  a  [        X#-  5      n[        U5      U-  U l        gU R                   U l        g)r  NrJ   dayshoursminutesseconds)rw  r  r  rC   r  rq  r   rp  _dc_unit_hc_mc_unitdrL   r$   r  )rX   r  r  r   s       r0   r  TimeValueAxis._calcValueStep  s    >>!~~6H"St/@/@/B)CU4<<EXY]YpYpEp%rrKhh&HH#
(HH$
(HH&
&
Ks!+-0-k:Q>DO"nnDOr3   c                    U R                   nU[        U R                  5      4nX0R                  ;   a  U R                  U   nGO[	        U5      nU R                   Vs/ s H  ofU-  PM	     nnU R
                  S   n[        U5      (       a  XX4S jnOU Vs/ s H  nSU-  PM
     n	n[        S U	 5       5      n
US:X  a  USU
-  4S jnO~X R                  :X  a  SOS	nU Vs/ s H  of[        U5      -
  U-  PM     nn[        U5      (       a0  X R                  :X  a  S
OX R                  :X  a  SOSnX[SX4-  4S jnOUSX4-  4S jnX@R                  U'   U" U5      $ s  snf s  snf s  snf )Nr   c                     SX-  U4-  $ )Nz%.0f%sr+   )r-   ufr   s      r0   r1   6TimeValueAxis.timeLabelTextFormatter.<locals>.<lambda>  s    HQx,?r3   z%.10fc              3      #    U  H4  n[        UR                  S 5      5      UR                  S5      -
  S-
  v   M6     g7f)0.rJ   N)r;   rstripr7  ).0rN   s     r0   	<genexpr>7TimeValueAxis.timeLabelTextFormatter.<locals>.<genexpr>  s/     L1C.qwws|;A=s   <>rJ   z%%.%dfsc                     X U-  -  $ r*   r+   r-   r  fmts      r0   r1   r    s
    sd|r3   rK  rL  hr  r   z%%d%s%%d%%sc           	      ^    U[        X-  5      [        X-  [        X-  5      -
  U-  5      4-  $ r*   rK   )r-   r  fmr  s       r0   r1   r    s8    PSWZ[\[_W`adfgfjmpqrqumvfvxzeza{V|P|r3   z%%.%df%sc                     X U-  -  $ r*   r+   r  s      r0   r1   r    s    QStr3   )r  tupler`   r  r  r  rO   rG   r  rL   r  )rX   valr  r   r  r  rN   r   r   stvstvlr  fvs1s                 r0   r  $TimeValueAxis.timeLabelTextFormatter  sX   KKuT%%&'$$$&&q)CqB $ 0 01 01B$ 0B1

1Ar{{#%?,./Bqw{B/LLLa4&(Y-=KC  !(({B3562as1v:r/2B6r{{$%xxKSQ[cc*,8N|*,th1FT&)  #3x) 2
 0 7s   EE$"E))r  r  r  r  rr  N)rs   rt   ru   rv   r  r  r  rZ   r  r  rx   r+   r3   r0   r  r    s(    
C
S&C
S&C"
-2r3   r  c                       \ rS rSrS rSrg)XTimeValueAxisi  c                 l    [         R                  " U /UQ70 UD6  [        R                  " U /UQ70 UD6  g r*   )r  rZ   r  r  s      r0   rZ   XTimeValueAxis.__init__  s2    D.$..t1T1D1r3   r+   Nrs   rt   ru   rv   rZ   rx   r+   r3   r0   r  r    s    2r3   r  c                   |    \ rS rSrSr\" \\" \SS9\" \	SS9\" \	SS9\" \
" \\45      SS9\" \	SS9S	9rS
 rS rSrg)AdjYValueAxisi  zA Y-axis applying additional rules.

Depending on the data and some built-in rules, the axis
may choose to adjust its range and origin.
z+When true add percent sign to label values.rG  r  r  z8Skip/Keep lowest tick label when true/false.
Or skiplistzadd this to the labels)rI  leftAxisPercentleftAxisOrigShiftIPCleftAxisOrigShiftMinleftAxisSkipLL0labelVOffsetc                     [         R                  " U 40 UD6  SU l        SU l        SU l        SU l        S=U l        U l        S U l        g )Nr	  rJ   g333333?rJ  r   )	r  rZ   r  r  r  r  r  r  rx  rN  s     r0   rZ   AdjYValueAxis.__init__  sL    D&2& $(!$&!344t0r3   c           
      R   SSK JnJn  U R                  U R                  pCU R
                  n[        [        U4S j/ SQ5      5      nU(       d  U/nU R                  U R                  pU(       a|  XC-
  U:  at  U" X4XgS9SS u  pX-
  U:  aR  X-   S-  n[        XS-  -
  U5      n	[        XS-  -   U5      n
US	:  a  U	S	:  a  U
S	-   U	-
  n
S	n	OUS:  a  U	S:  a  X-
  n
Sn	XsU l        U l        U" U R                  U R                  S
X`R                  XpR                  S9u  pU R                  nU(       a  US
   US   -
  n[        U5      (       d  X-  =nnOXS   -  nXS
   -  n[!        U SUS   5      n[!        U SUS   5      nUUS   -
  U:  a  U R                  U-
  U l        US   U-
  U:  a  U R                  U-   U l        U" U R                  U R                  S
X`R                  XpR                  S9u  pUS   U l        US   U l        Xl        U R$                  c  Xl        OU R$                  U l        [)        U R                  S	-
  5      S:  a|  U R+                  5         U R                  U R                  nn[        U R,                  U R.                  -  UU-
  U R0                  -  U R2                  -  5      nU R                  U-
  U l        U R4                  (       a9  [        U R4                  5      (       a  U R4                   H	  n SUU'   M     SUS'   gg! [6         a     M!  f = f)z$Adjusts the value range of the axis.r   )find_good_gridr  c                 
    X:*  $ r*   r+   )r-   r  s     r0   r1   ,AdjYValueAxis._rangeAdjust.<locals>.<lambda>
  s    adr3   )r  r  rI  r     	   )r  gridNra  rL  r  rJ   )r4  r  percentr  r  r  r  r  r  r:  )reportlab.graphics.charts.utilsr  r  r  r  rq  r6   r:   rw  r  rC   rG   r  r  ry  r'   r   r`   rr  r  r   r  r  r  r  r   r  r   )rX   r  r  y_miny_maxr  r  rw  r  r   r  ymr,   r   r  r  r  _nrk   vMaxvMinr-   s                         r0   r  AdjYValueAxis._rangeAdjust  s    	J~~t~~u1*=9:qc!#'>>43E3E=U]]:#E1DRaHFBw&eS[#--e4#--e4#:"S&cBBBAX"Q$BB-/*DNDNT^^T^^1K_K_en  ~O  ~O  P!!A$qt)B::& RAYAYl1Q40Bl1R51BAaDy2~0Ct~uRx"}t~~/BdnqAOcOcir  BS  BS  TDA12'$%!$($8$8D!t~~c!"4'!$DD--doo=$Y 9 99$,,FHA!^^a/DNT))**--A!! .
 AaD  
 & s   L
L&%L&)r  r`   r  r  r  r  r  r  r  r  rx  N)rs   rt   ru   rv   rw   rQ  r  rR  r   r   r   r   rS  rZ   r  rx   r+   r3   r0   r  r    sg    
 j&y7de+H;_`+H;UV&x?0K'L  TO  P#H3KL
H=r3   r  c                   ,    \ rS rSrS rS rS rS rSrg)LogValueAxisiC  c                     U R                   [        [        U R                  5      [        U R                  5      -
  5      -  U l        U R
                  $ r  )r   r  
math_log10r  r  r  r  s    r0   r  LogValueAxis._calcScaleFactorE  sD    
 !LL5t~~&DNN)CC,E E   r3   c                    U R                   nU R                  n[        XR                  SU R                  S9n[        XR                  SU R                  S9nUc  UnUc  UnX#:  a$  [        SU R                  R                  U4-  5      eUS::  a'  [        U R                  R                  < SU< S35      eU R                  nU(       a  [        U5      n[        U5      n[        U5      (       d  Xf4nUS   =(       d    Sn	US   =(       d    Sn
U R                  X-   -
  nX-
  [        U5      -  nXyU-  -  nXU-  -  n[        USU-  5      n[!        USU-  5      nX l        X0l        g )Nr   )r>   z7%s: valueMin=%r should not be greater than valueMax=%r!z: valueMin=z! negative values are not allowed!rJ   r  )ru  rv  rE   r  r>   rH   r  r  _LogValueAxis__name__valueMinrs   r|  r  r'   r   r  rC   rG   r  r  )rX   r  ru  rv  aMinaMaxr  lMinlMaxa0a1r   r  s                r0   r  LogValueAxis._setRangeO  sc   ====
??1tG]G]^
??1tG]G]^XXVZ^ZhZhZyZy  |D  ZE  E  F  FQ;SWSaSaSjSjkstuu""d#Dd#D::SXsQ1BQ1B(A)U1X%BrEMDrEMD8BH-H8BH-H!!r3   c                 b   [        U R                  5      =p[        U R                  5      =p4U R                  nU(       a:  US;   a  [	        U5      nXc:  a  US-   OUnUS;   a  [	        U5      nXa:  a  US-
  OUn/ R
                  n[	        U5      nX:  a  US-  n[	        U5      U-
  S-   n	[        [	        XR                  -  5      S5      nXi-  U R                  :  a  US-  nX`l         X:  a  OX:  a  U" SU-  5        X-  nM  X:w  a
  SU-  U l        X4:w  a
  SU-  U l        UR                  $ )Nr  rJ   r  r  )
r  r  r  r~  rL   r5  rG   rq  	_powerIncr6  )
rX   ru  r  rv  r  r  r   r,   r   r  s
             r0   r  LogValueAxis._calcTickPositionsj  s*   $T^^44$T^^44__''M%&ZAEQ%%M%&ZAEQII];aMB"A'''(+3t   !q&!{E|Qr2vYGB  >BL4>>BL4>zzr3   c                 v   [        U S5      (       d  U R                  5         U R                  n[        U S5      (       Gdh  / R                  n[	        U R
                  5      n[	        U R                  5      S-   n[        U5      nU R                  nUS:X  a  S[        U R                  5      -  nSnU R                  S:X  a  SnXT:  a[  [        XR                  5       H7  n	Xy-  SU-  -  n
XR
                  :  d  M  XR                  :  d  M/  U" U
5        M9     XV-  nXT:  a  M[  Ot[        U R                  S-   US-
  5      nU(       a  Xk-  S:X  a  Xk-  nOUS-  nU(       a  M  Sn[        U5      n SU-  n
XR                  :  a  OX;  a  U" U
5        XV-  nM(  UR                  U l        U R                  U l        U$ )Nr`   r  rJ   r  ra  r   )rg   rh   r`   r5  r  r  r  roundr  r  r	  r   rC   r6  r  )rX   r  r,   ru  rv  r   r   facr   r  rN   ngs               r0   r  LogValueAxis._calcSubTicks  s   tM**""$t,--		A!$..1H!$..1!3HxBA!t511??b(!%m"59E2r6N~~-!nn2DaD : GB m *1Q3/{!GB	 b A8_BANN*E|!GB  #$**D..
r3   )r  r  r  r`   r  r  N)	rs   rt   ru   rv   r  r  r  r  rx   r+   r3   r0   r	  r	  C  s    !"68&r3   r	  c                       \ rS rSrS rSrg)LogAxisTickLabelleri  c                 p    [        U5      n[        US:  a  US-
  OUS-   5      nUS:X  a  gUS:X  a  gSU-  $ )Nr   MbP?1rJ   10z10<sup>%s</sup>)r  rL   )rX   rm   r  r8   s       r0   ro   LogAxisTickLabeller.__call__  sC    u1Q3%AeG,a4a4 1$$r3   r+   N)rs   rt   ru   rv   ro   rx   r+   r3   r0   r  r    s    %r3   r  c                       \ rS rSrSrS rSrg)LogAxisTickLabellerSi  zVsimple log axis labeller tries to use integers
and short forms else exponential formatc                     [        U5      n[        US:  a  US-
  OUS-   5      nUS:X  a  gUS:  a  SUS-  -   OSSU-   * S-  -   S-   nSU-  n[        U5      [        U5      :  a  U$ U$ )Nr   r!  r"  r  z0.rJ   z%.0e)r  rL   r;   )rX   rm   r  r8   pr   ses          r0   ro   LogAxisTickLabellerS.__call__  sz    u1Q3%AeG,a41C#I$!A#s
"3C"7e^WSV^r**r3   r+   Nrj  r+   r3   r0   r&  r&    s    /+r3   r&  c                       \ rS rSrS rSrg)LogAxisLabellingSetupi  c                 f   [         b  [        [        5      U l        U R                  S:X  a4  SU R                  l        SU R                  l        SU R                  l        O3SU R                  l        SU R                  l        SU R                  l        [        5       U l	        g [        5       U l	        g )NrJ   r8   r  r   r  )r#   r   r"   ro  r  r  rO  r  r  rr  r&  r  s    r0   rZ   LogAxisLabellingSetup.__init__  sz    )1&9DK!(+%!#!"(+%!"!##6#8D #7#9D r3   )rr  ro  Nr  r+   r3   r0   r,  r,    s    :r3   r,  c                   ,    \ rS rSr\" \S9rS rS rSr	g)LogXValueAxisi  rI  c                 X    [         R                  U 5        [        R                  U 5        g r*   )r  rZ   r,  r  s    r0   rZ   LogXValueAxis.__init__      D!&&t,r3   c                     SnU R                   (       d   U5       eUc  SnUS:X  a/  U R                  U R                  [        U R                  5      -  -
  $ U R                  U R                  [        U5      [        U R                  5      -
  -  -   $ zConverts a numeric value to a Y position.

The chart first configures the axis, then asks it to
work out the x value for each point when plotting
lines or bars.  You could override this to do
logarithmic axes.
r  r   r  )r  rk   r  r  r  rX   r  msgs      r0   ri   LogXValueAxis.scale       B$$=EB;77T..DNN1KKKKww**j.?*T^^B\.\]]]r3   r+   N)
rs   rt   ru   rv   rQ  r  rS  rZ   ri   rx   r+   r3   r0   r0  r0    s    J'H-^r3   r0  c                   ,    \ rS rSr\" \S9rS rS rSr	g)LogYValueAxisi  r1  c                 X    [         R                  U 5        [        R                  U 5        g r*   )r  rZ   r,  r  s    r0   rZ   LogYValueAxis.__init__  r4  r3   c                     SnU R                   (       d   U5       eUc  SnUS:X  a/  U R                  U R                  [        U R                  5      -  -
  $ U R                  U R                  [        U5      [        U R                  5      -
  -  -   $ r6  )r  rl   r  r  r  r7  s      r0   ri   LogYValueAxis.scale  r:  r3   r+   N)
rs   rt   ru   rv   rQ  r  rS  rZ   ri   rx   r+   r3   r0   r<  r<    s    J'H-^r3   r<  rC  )Y__version__rw   mathr   r  	functoolsr   reportlab.lib.validatorsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   reportlab.lib.attrmapreportlab.libr   reportlab.graphics.shapesr   r   r   r   r   r   r   r   reportlab.graphics.widgetbaser   r   $reportlab.graphics.charts.textlabelsr    r!   r"   r#   r   r$    reportlab.graphics.widgets.gridsr%   reportlab.lib.colorsr&   reportlab.lib.utilsr'   r@   rE   rH   rO   rQ   rz   r   r   r   rF  rU  r  r  r  r  r  rG  rg  r  rm  r  r6  r8  r>  r@  r  r  rQ  r  r  r  r  r	  r  r&  r,  r0  r<  r+   r3   r0   <module>rM     s   	< % G G G G G $ $ } } } I ] ] ; 7 & %
Gab" "<G GRC CJ7 7$jV jXh B66 B6Hee; ;zg ,oGL oboGL ob0 0 / R	1 R	1hI Ij T;Y * /0 
Yz: zxI IV> >D2]: 2
TJ Tli9 iX%, %	+< 	+: : ^L!6z ^0^L!6z ^r3   