
    kfi                    *   d Z dZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ ddlT ddlmZ ddlmZmZmZmZmZmZmZm Z  ddl!m"Z"m#Z# dd	l$m%Z%m&Z&m'Z'm(Z( dd
l)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 dNdZ1dNdZ2dNdZ3d Z4 G d d          Z5 G d d          Z6 G d d          Z7 G d d          Z8 G d de"          Z9 G d de&          Z: G d d e9          Z;d! Z<d" Z= G d# d$          Z> G d% d&e>          Z? G d' d(e>e;          Z@ G d) d*e?e;          ZA G d+ d,          ZBd- ZC G d. d/e9          ZD G d0 d1e>eD          ZEg d2ZFg d3ZGd4 ZH G d5 d6e          ZI eI            ZJd7ZK G d8 d9eE          ZL G d: d;e?eD          ZM G d< d=          ZN G d> d?eNeE          ZO G d@ dAeM          ZP G dB dCeD          ZQ G dD dEeB          ZR G dF dGeB          ZS G dH dI          ZT G dJ dKeQeTeE          ZU G dL dMeQeTeM          ZVdS )Oz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)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                    t          | d         d                   r/|r|||fd}n|fd}t          t          |fd|                     } t          t          t          d | D                                 } t	          |           dk    r|S  |t          t          ||                               }|r | ||          |          n|S )Nr   c                      || ||          S N )Txspecialfuncs       ^/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/reportlab/graphics/charts/axes.py<lambda>z"_findMinMaxValue.<locals>.<lambda>5   s    gga$6G6G     c                     | |         S r)   r*   )r+   r,   s     r/   r0   z"_findMinMaxValue.<locals>.<lambda>7   s
    AaD r1   c                 <    t          t          ||                     S r)   )listmap)efs     r/   r0   z"_findMinMaxValue.<locals>.<lambda>8   s    c!Ahh r1   c                 &    g | ]}d  |D             S )c                     g | ]}||S r)   r*   .0r,   s     r/   
<listcomp>z/_findMinMaxValue.<locals>.<listcomp>.<listcomp>9   s    888!-!---r1   r*   r:   s     r/   r<   z$_findMinMaxValue.<locals>.<listcomp>9   s'    DDDQ88Q888DDDr1   )r&   r4   r5   filterlen)Vr,   defaultr.   r-   extraMinMaxValuesr7   rs           r/   _findMinMaxValuerC   2   s    QqT!W~~ 4 	!7GGGAA   A
sa///22
3
3VCDD!DDDEEFFA
1vvqyy.T#d1++A.?F44&''***QFr1   c                 6    t          | ||t          ||          S )zfind minimum over V[i][x]r-   rA   )rC   minr?   r,   r@   r-   rA   s        r/   _findMinrH   >   s    AaGN_````r1   c                 6    t          | ||t          ||          S )zfind maximum over V[i][x]rE   )rC   maxrG   s        r/   _findMaxrK   B   s    AaGO`aaaar1   c                 P    | D ]"}	 t          |          |k    r dS #  Y  dS xY wdS )ztrue if all values are intr      int)valuesvs     r/   _allIntrR   F   sD      	1vvqyyy	1111s   #c                       e Zd ZdZd Zd ZdS )AxisLabelAnnotationaK  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                 "    || _         || _        d S r)   _v_kwdsselfrQ   kwdss      r/   __init__zAxisLabelAnnotation.__init__X       


r1   c                 j   | j                                         }|                    dt                    }|                    dd          }t	          |d          s|                                  |r|j        nd | j                  }|j        r
|j	        }|}n	|}|j
        }||d<   ||d<    |di |S )	N
labelClass
scaleValueT_tickValuesc                     | S r)   r*   r,   s    r/   r0   z.AxisLabelAnnotation.__call__.<locals>.<lambda>b   s    a r1   r,   yr*   )rX   copypopr   hasattr_pseudo_configurescalerW   isYAxis_x_y)rZ   axisr[   r_   r`   svr,   rd   s           r/   __call__zAxisLabelAnnotation.__call__\   s    z  XXl511
XXl400
tM** 	%""$$$7J7djjKKAA< 	AAAAAS	S	z!!D!!!r1   N__name__
__module____qualname____doc__r\   ro   r*   r1   r/   rT   rT   O   s<           " " " " "r1   rT   c                       e Zd ZdZd Zd ZdS )AxisLineAnnotationa  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                 "    || _         || _        d S r)   rV   rY   s      r/   r\   zAxisLineAnnotation.__init__z   r]   r1   c                 
   | j                                         }|                    dd          }|                    dd          }|                    dd          }|j        r|j        }|j        }n|j        }|j        }|                    dd           }|                    dd           }	||	[t          t          |dd           d	d           }
|
rt          |
d
          r
 |
            }
|
r||
d         }|	|
d         }	n|d}|	d}	|                    d|j                  |z   }|                    dd          |z   }t          ||          t          ||          }}|                    dd          }|j        }|sd |_        	 | j        }|r||z   }n|r||z   }|                    ||z
  |	|z
  |                    dd                     }t          |d          s|                                 |                    |          |k     s|k    r!|s
	 ||_        d S |k     r|n|fd|_         ||          }|                                D ]\  }}t!          |||           	 ||_        n# ||_        w xY w|S )Nr`   T	endOffsetFstartOffsetstartendjoinAxisgetGridDimsro   r   rM   hilodrawAtLimitc                     | S r)   r*   rc   s    r/   r0   z-AxisLineAnnotation.__call__.<locals>.<lambda>   s    1 r1   parentra   c                     S r)   r*   )r,   ds    r/   r0   z-AxisLineAnnotation.__call__.<locals>.<lambda>   s    q r1   )rX   re   rf   rj   rk   rl   getattrrg   _lengthrF   rJ   _get_line_posrW   _getLineFuncrh   itemssetattr)rZ   rm   r[   r`   ry   rz   offsd0sr6   dimr   r   r   oaglprQ   r.   Lkr   s                      @r/   ro   zAxisLineAnnotation.__call__~   s   z  XXl400
HH[//	hh}U33< 	7DBB7DBHHWT""HHU4  9	'$z$77dKKC ws:.. cee $9#a&a9#a&a9!a9!aXXd4<((+XXd1b "RjjR2hh}U33" 	-!,D	'A F F$$QtVAdF488HT3J3JKKD4.. )&&(((""1%%Attqtt"/4 "'D R44AAA%0[[["QAzz||  !!A "'DD&&&&s   BI7 #AI7 7	J Nrp   r*   r1   r/   rv   rv   m   s<           4 4 4 4 4r1   rv   c                       e Zd ZdZd Zd ZdS )AxisBackgroundAnnotationa  Create 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                 "    || _         || _        d S r)   )_colorsrX   )rZ   colorsr[   s      r/   r\   z!AxisBackgroundAnnotation.__init__   s    


r1   c           
      D   | j         }|sd S | j                                        }|j        }|r|j        }|j        }n|j        }|j        }|                    dd           }|                    dd           }||[t          t          |dd           dd           }	|	rt          |	d          r
 |	            }	|	r||	d         }||	d         }n|d}|d}t          |d          s|	                                 t          |dd           }
|
sd S t                      }t          |          }|                    |
d                   }t          dt          |
                    D ]:}|                    |
|                   }||dz
  |z           }|r	|r|}|}||z
  }||z
  }n|}|}||z
  }||z
  }t          |t                    rt!          |||||d 	          }nt          |t                     r@t!          ||||          }|j        D ]%}|d
vrt%          ||t          ||                     &nUt          |t&                    r@t'          ||||
          }|j        D ]%}|d
vrt%          ||t          ||                     &|                    |           |}<|S )Nr{   r|   r}   r~   ro   r   rM   ra   )	fillColorstrokeColor)r,   rd   widthheight)r   rX   re   rj   rk   rl   rf   r   rg   rh   r   r>   r   range
isinstancer%   r   __dict__r   r$   add)rZ   rm   r   r[   rj   r   r   r   r6   r   tvGncolorsv0iv1crd   r,   r   r   rB   r   s                          r/   ro   z!AxisBackgroundAnnotation.__call__   s   vvz  , 	7DBB7DBHHWT""HHU4  9	'$z$77dKKC ws:.. cee $9#a&a9#a&a9!a9!atM** 	%""$$$T---66GGf++1&&qR!! 	 	A##BqE**B!W}%A  	!AAUFaCEEAArEEqSFa&& 6QqvdKKKAA$'' 	6Qqv..AZ 6 6$>>>#Aa!5556  *-- 6"QfEEEAZ 6 6$>>>#Aa!555aBBr1   Nrp   r*   r1   r/   r   r      s<           : : : : :r1   r   c                   $    e Zd ZdZd Zd Zd ZdS )TickLUz$lookup special cases for tick valuesc                 J    |                     dd          | _        || _        d S )Naccuracy:0yE>)rf   r   r+   )rZ   r+   r[   s      r/   r\   zTickLU.__init__   s"    D11r1   c                 `    | j         }| j        D ]\  }}t          ||z
            |k     r dS dS NTF)r   r+   absrZ   tr   r,   rQ   s        r/   __contains__zTickLU.__contains__   sD    =6 	 	CAa1Q3xx  tt !ur1   c                     | j         }| j        D ]$\  }}t          ||z
            | j         k     r|c S %t          d|z            )Nzcannot locate index %r)r   r+   r   
IndexErrorr   s        r/   __getitem__zTickLU.__getitem__  sW    =6 	 	CAa1Q3xx%% &1A5666r1   N)rq   rr   rs   rt   r\   r   r   r*   r1   r/   r   r      sG        ..    7 7 7 7 7r1   r   c                       e Zd Zd Zd Zd Zd Zd ZddZdg i fdZ	ddg fd	Z
ddg fd
ZddZd Z ee          Zd Z ee          ZddZd Zd ZdS )_AxisGc                 R    |                      |          }	 |d         }n#  Y nxY w|S Nr   )ri   )rZ   rQ   s     r/   r   z_AxisG._get_line_pos  s4    JJqMM	!AA	Ds     $c                 p    |                      |          }t          || j        |z   || j        |z             S r)   )r   r   rl   )rZ   r,   r{   r|   s       r/   _cxLinez_AxisG._cxLine  s5    q!!Atw47S=999r1   c                 p    |                      |          }t          | j        |z   || j        |z   |          S r)   )r   r   rk   )rZ   rd   r{   r|   s       r/   _cyLinez_AxisG._cyLine  s5    q!!DGeOQ#q999r1   c           	          |                      |          }| j        |z   }| j        |z   }t          ||          t          ||          }}||z   }t	          |||||z   |||z   gd          S NrM   )strokeLineJoin)r   rl   rF   rJ   r   )	rZ   r,   r{   r|   _3d_dx_3d_dyy0y1x1s	            r/   	_cxLine3dz_AxisG._cxLine3d  su    q!!Wu_Ws]RC2JJBZ2bF2bi8JJJJr1   c                     |                      |          }| j        |z   }| j        |z   }t          ||          t          ||          }}||z   }t	          ||||z   |||z   |gd          S r   )r   rk   rF   rJ   r   )	rZ   rd   r{   r|   r   r   x0r   r   s	            r/   	_cyLine3dz_AxisG._cyLine3d$  su    q!!Wu_Ws]RC2JJBZAbi2f9R8JJJJr1   Nc                     t          |dd           }|/t          |dd           }| j        r| j        p| j        }|||||fdS | j        r| j        p| j        }|||fdS )Nr   r   c                 "     || ||||          S )N)r   r   r*   )rQ   r   r6   r7   r   r   s         r/   r0   z%_AxisG._getLineFunc.<locals>.<lambda>1  s     aaPQRSTU]ckqNrNrNr r1   c                      || ||          S r)   r*   )rQ   r   r6   r7   s       r/   r0   z%_AxisG._getLineFunc.<locals>.<lambda>4  s    !!Aa(( r1   )r   rj   r   r   r   r   )rZ   r{   r|   r   r   r   r7   s          r/   r   z_AxisG._getLineFunc,  s~    ..VHT22F/A4>A$qfrrrr-=A$q::::r1   c                    |                      |||
          }t          | d          s|                                  r| j        rfdpfd}nd }| j        D ]} ||          }|r ||          r||_        ||_        ||_        ||_        ||_	        |	|_
        ||v r1||                                         D ]\  }}t          |||           |                    |           d S )Nra   c                     | j         v S r)   )r   lexcludes    r/   r0   z#_AxisG._makeLines.<locals>.<lambda>;  s    adgo r1   c                     | j         v S r)   )r   r   s    r/   r0   z#_AxisG._makeLines.<locals>.<lambda>;  s    QTU\_ r1   )r   rg   rh   rj   ra   r   strokeWidthstrokeDashArrayr   strokeLineCapstrokeMiterLimitr   r   r   )rZ   gr{   r|   r   r   r   r   r   r   r   r   specialsr.   exfr   r   arQ   s              `       r/   
_makeLinesz_AxisG._makeLines6  s+     s622tM** 	%""$$$ 	,>$=$=$=$=]C\C\C\C\CCC! 	 	ADGG+33q66+8 + +$3!#1 "/%5"=='{0022 ' '!!Aa	 	r1   c                    | j         }| j        pd}|r|r| j        r| j        }| j        }||;|rt          |d          r
 |            }|r||d         }||d         }n|d}|d}|s|r`| j        r| j        }	n| j        }	| 	                    |||	z
  ||	z
  ||| j
        | j        | j        | j        ||t          | di                      |                     |||g            dS ))this is only called by a container objectr   Nro   rM   _gridSpecials)r   r   r   )r   )gridStrokeColorgridStrokeWidthvisibleGrid	gridStartgridEndrg   rj   rk   rl   r   gridStrokeDashArraygridStrokeLineJoingridStrokeLineCapgridStrokeMiterLimitr   _makeSubGrid)
rZ   r   r   r   r   r   wr   r6   r   s
             r/   makeGridz_AxisG.makeGridL  ss     %A 	_ 	_t' 	_AAyAI  73z22  #%%C (yc!f!yc!f!ya!ya! _A _< %!Wd!D&4!D4LTMdeie{  }A  }V  ^d  mt  ~E  FJ  KZ  []  ~^  ~^  _  _  _!Cr22222r1   c                    t          | dd          r| j        dk    sdS | j        }| j        pd}|r|sdS | j        }| j        }||;|rt          |d          r
 |            }|r||d         }||d         }n|d}|d}|s|rz| j        r| j        }	n| j	        }	| 
                                }
	 |                     |||	z
  ||	z
  ||| j        | j        | j        | j        ||           |
| _        dS # |
| _        w xY wdS )r   visibleSubGridr   Nro   rM   )r   r   )r   
subTickNumsubGridStrokeColorsubGridStrokeWidthsubGridStart
subGridEndrg   rj   rk   rl   _calcSubTicksr   subGridStrokeDashArraysubGridStrokeLineJoinsubGridStrokeLineCapsubGridStrokeMiterLimitra   )rZ   r   r   r   r   r   r   r   r6   r   otvs              r/   r   z_AxisG._makeSubGridb  s   -a00OT_Q5F5F##(qQO9	 ws:.. cee $9#a&a9#a&a9!a9!a 	' 	'| !DGTT$$$&&C'!D&4!D4OPTPjko  lE  FJ  Fb  jp  y@  A  A  A#&   3 &&&&	' 	's   1:C4 4	C=c                 X    || j         | j        f| j                 }|
|| j        z   }||fS r)   )rk   rl   rj   r   )rZ   r{   r|   s      r/   r~   z_AxisG.getGridDims|  s5    =4747"3DL"A%;eDL0Syr1   c                 |    t          | dd           dk    rdS | j        j        }|d         dk    p|d d         dk    S )N
_dataIndexrM   Tr   Y   AdjYr   	__class__rq   rZ   acns     r/   rj   z_AxisG.isYAxis  sF    4T**A--ddn%1vs{-c"1"gvo-r1   c                 |    t          | dd           dk    rdS | j        j        }|d         dk    p|d d         dk    S )Nr   r   TX   NormalDateXr   r   s     r/   isXAxisz_AxisG.isXAxis  sG    4T**A--ddn%1vs{5c#2#h55r1   c                 r    |t          | dg            |D ] }|                     ||                      !d S )Nannotations)r   r   )rZ   r   Ar,   s       r/   addAnnotationsz_AxisG.addAnnotations  sJ    9gd=444 	 	AEE!!D''NNNN	 	r1   c                    t          | dg           d d          }i }dD ]S}g j        }g j        }|D ]*}t          ||d          r ||            ||           +|j        ||<   |j        |d d <   T|dxx         |z  cc<   |S )Nr  )early
beforeAxis	afterAxisbeforeTicks
afterTicksbeforeTickLabelsafterTickLabelslater   r  )r   append__self__)rZ   r	  DrQ   RPr   s          r/   _splitAnnotationsz_AxisG._splitAnnotations  s    Dr**111-* 	 	A 	A	A  1Qq>> AaDDDDAaDDDD:AaD:AaaaDD	&			Q			r1   c                    t                      }|                                 }|                     ||d                    | j        r|                     ||d                    |                    |                                            |                     ||d                    |                     ||d                    |                    |                                            |                     ||d                    |                     ||d                    |                    |                                            |                     ||d                    |                     ||d                    |S )	Nr  r  r  r  r  r  r  r  )r   r  r
  visibler   makeAxis	makeTicksmakeTickLabels)rZ   r   r	  s      r/   drawz_AxisG.draw  sT   GG""$$Aaj)))< 		8!L/222EE$--//"""!K.111!M"2333EE$..""###!L/222!$6"7888EE$%%''(((!$5"6777Aai(((r1   r)   NN)rq   rr   rs   r   r   r   r   r   r   r   r   r   r~   rj   propertyr  r
  r  r  r*   r1   r/   r   r     sb         : : :: : :K K KK K K; ; ; ; BF  OQ  []    , !R 3 3 3 3, !%D ' ' ' '4   
. . . hwG6 6 6 hwG   
  $    r1   r   c                   D    e Zd Z ee eed                    Zd ZdS )CALabelz?where in the category range [0,1] the labels should be anchoreddesc)BASElabelPosFracc                 V    t          j        | fi | |                     d           d S )N      ?)r'  )r    r\   _setKeywordsrZ   kws     r/   r\   zCALabel.__init__  sE    $$$$$$" 	 	 	 	 	 	r1   N)	rq   rr   rs   AttrMapr    AttrMapValuer   _attrMapr\   r*   r1   r/   r#  r#    sN        wH#|H3tuuu
 
 
H    r1   r#  c                      e Zd ZdZdZ edci d eed          d eed          d eed	          d
 eed          d eed          d eed          d ee	d          d ee
d          d e eddd          d          d e eddd          d          d eed          d eed          d ee	d          d  ee
d!          d" e eddd          d#          d$ e eddd          d%          d& eed'          d( eed)          d* eed+          d, eed-          d. ed/d0          d1 eed2          d3 ed/d4          d5 eed6          d7 eed8          d9 e ed:d;d<          d=          d> e ed?d@dAdB          dC          dD eedE          dF eedG          dH ee	dI          dJ eedK          dL eedM          dN ed/dO          dP eedQ          dR eedS          dT e edUdVdWdX          dY          dZ eed[          Zd\ Zd] Zddd^Zd_ Zd` Zda Zdb Zd/S )eCategoryAxisz+Abstract category axis, unusable in itself.rM   r  Display entire object, if true.r$  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                 x   | j         j        dk    s
J d            d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        t          d         | _        t          d	         | _        t          d
         x| _        | _        t          d         x| _        | _        t          d         x| _        | _        d| _        t          d         | _        t          d	         | _        d x| _        | _        t          d
         | _        t          d         | _        t          d         | _        t7          t8                    | _        d | _        d | _        d | _         d | _!        d| _"        d| _#        d| _$        d | _%        d| _&        d| _'        d| _(        d| _)        d| _*        d S )Nr1  z(Abstract Class CategoryAxis Instantiated2   d   r   rM   Fr   r   r   r   r         ?rm   rT  )+r   rq   rk   rl   r   	_catCountr  r3  r5  r7  r   rI  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#  rK  rM  r}   rO  joinAxisModerW  rQ  rS  _labelTextFormatr\  ra  rb  rd  rf  rZ   s    r/   r\   zCategoryAxis.__init__  s   ~&6668b666  !)-8-.?@8FGW8XX$"56D_6UU!3<JK]<^^!D$9#-m<#12C#D (,,,-=>+O< ./A B-g66 " # !
 !%

r1   c                 ~    t          |          | _        t          |          | _        t          |          | _        d S r)   floatrk   rl   r   rZ   r,   rd   lengths       r/   setPositionzCategoryAxis.setPosition#  -    ((((V}}r1   c                 f   t          t          t          t                                        | _        |p-| j        | j        z
  | j        z
  t          | j        pd          z  | _	        | 
                                 | j        dk    r'fdt          | j                  D             | _        d S d S )NrM   rZ  c                 H    g | ]t          fd D                       S )c                      g | ]
}|         S r*   r*   )r;   seriesr   s     r/   r<   z5CategoryAxis.configure.<locals>.<listcomp>.<listcomp>.  s    BBBFfQiBBBr1   )sum)r;   r   multiSeriess    @r/   r<   z*CategoryAxis.configure.<locals>.<listcomp>.  s7    cccBBBBkBBBCCcccr1   )rJ   r4   r5   r>   rt  r   ra  rb  rz  	_barWidth_calcTickmarkPositionsrW  r   _pmv)rZ   r  barWidths    ` r/   	configurezCategoryAxis.configure)  s    T#c+"6"67788!ft|DJ'>tz'I5QUQ_QdcdKeKe&e##%%%**ccccUSWSaMbMbcccDIII +*r1   c                     | j         }| j        r d t          |          D             | _        d S | j        r$t          t          d|                    | _        d S t          t          |dz                       | _        d S )Nc                     g | ]}|d z   S )r)  r*   )r;   r   s     r/   r<   z7CategoryAxis._calcTickmarkPositions.<locals>.<listcomp>3  s    888!#888r1   rM   )rt  r\  r   ra   rQ  r4   )rZ   ns     r/   r  z#CategoryAxis._calcTickmarkPositions0  s~    N> 	488uQxx888D$ 4#'b#4#4   #'ac

#3#3   r1   c                 .    | j         r| j        |z
  dz
  }|S NrM   )rQ  rt  rZ   idxs     r/   _scalezCategoryAxis._scale:  s      <s(:1(<#
r1   c                 :    |                      |          | j        fS )z/Returns the position and width in drawing unitsloScaler  r  s     r/   ri   zCategoryAxis.scale>  s    S!!4>22r1   c                 B    |                      |          d| j        z  z   S )z-Returns the bar mid position in drawing unitsr)  r  r  s     r/   midScalezCategoryAxis.midScaleB  s     ||C  3t~#555r1   r*   r)   )rq   rr   rs   rt   _nodocr-  r.  r   r   r	   r   r
   r   r   r   r/  r\   r}  r  r  r  ri   r  r*   r1   r/   r1  r1    s>       11Fw &
 &
 &
,y/PQQQQ&
"l93PQQQQ&
 $|I4RSSSS&
 %Y5TUUUU	&

 #l93PQQQQ&
 #l82QRRRR&
 #l=7VWWWW&
 ','<Ccdddd&
 %UU1Qq\\7\]]]]&
 &eeAall8^____&
 (<6\]]]]&
 ',x6LMMMM&
 ',};QRRRR&
 +l+@Ghiiii&
 )Lq1;effff&
  *\%%!A,,<ghhhh!&
"  ,|H:effff#&
$ !L6[\\\\%&
& ,~4WXXXX'&
( $|I4cdddd)&
* d)EFFFF+&
, %%:AZ[[[[-&
.  <+DEEEE/&
0 #l>8deeee1&
2 (<	8]^^^^3&
4 UU:iFFGmnnn5&
6 %UU6%	%J%JQ}~~~~7&
8 !L1GHHHH9&
: ',~<Z[[[[;&
< ',};YZZZZ=&
> X,XYYYY?&
@ X,UVVVVA&
B #l4-BCCCCC&
D h-YZZZZE&
F h-VWWWWG&
H  <fU6( C CDmnnnI&
J %%5<abbbbK&
HP4 4 4l% % %d d d d4 4 4  3 3 36 6 6 6 6r1   r1  c                 B    | j         sJ d| j        j        z              d S )Nz/Cannot connect to other axes (%s), but Y- ones.)rj   r   rq   rm   s    r/   _assertYAxisr  F  )    <ddJT^Mdddddddr1   c                 B    | j         sJ d| j        j        z              d S )Nz/Cannot connect to other axes (%s), but X- ones.)r  r   rq   r  s    r/   _assertXAxisr  H  r  r1   c                   `    e Zd ZdZed             Zed             Zd Zd
dZd Z	d Z
d
d	ZdS )_XTicksr   c                 .    t          | d| j                  S )Nr]  )r   r   rw  s    r/   actualTickStrokeWidthz_XTicks.actualTickStrokeWidthN      t-d.>???r1   c                 .    t          | d| j                  S )Nr_  )r   r   rw  s    r/   actualTickStrokeColorz_XTicks.actualTickStrokeColorR  r  r1   c                    t          | dd           }|r || |||           d S |s|r\| j        }| j        }|r|r|s||z  }n	|r|s||z  }|                     ||| | j        || j        | j        | j        | j        	  	         d S d S )Nrn  )	r   r  _tickTweaksr   r  r   r   r   r   )rZ   tUtDr   itdsWtWs          r/   _drawTicksInnerz_XTicks._drawTicksInnerV  s    d?400 
	VCR1 	V2 	V+B!B  b BBB  BBOOAb"T%?4CWX\Xklpl~  @D  @U  V  V  V  V  V	V 	Vr1   Nc                 b    |pt                      }| j        r|                     |||           |S r)   )r   r5  r  )rZ   r  r  r   s       r/   
_drawTicksz_XTicks._drawTicksd  s7    L 	*  Bq)))r1   c                     t          | dd          rW| j        dk    rN|                                 }	 d| _        |                     |||           | `|| _        d S # | `|| _        w xY wd S d S )NvisibleSubTicksr   rM   )r   r   r   _subTickingr  ra   )rZ   r  r  r   r   s        r/   _drawSubTicksz_XTicks._drawSubTicksj  s    4)!,, 	'1B1B$$&&C'#$ $$R1---$#&    $#& &&&&	' 	'1B1Bs   A A&c                 8   | j         }	 |                     t          | dd                    | _         |                     | j        | j                  }|                     t          | dd          t          | dd          |           ||| _         S # || _         w xY wNtickAxisModerm   	subTickHir   	subTickLo)rl   _labelAxisPosr   r  tickUptickDownr  )rZ   yoldr   s      r/   r  z_XTicks.makeTickst  s    W	((nV)L)LMMDGDM::AwtK::74TU;V;VWXYYYDGGdDGNNNN   A?B 	Bc                 x    | j         }|r+|p| j        }|dk    r|j        S |dk    r|j        |j        z   S | j        S NrY  rX  )r}   rW  rl   r   rZ   moderm   s      r/   r  z_XTicks._labelAxisPos~  M    } 	.-4-Du}}ww--wr1   r)   )rq   rr   rs   r  r!  r  r  r  r  r  r  r  r*   r1   r/   r  r  K  s        K@ @ X@ @ @ X@V V V   ' ' '       r1   r  c                       e Zd ZddZd ZdS )_YTicksNc                 x    | j         }|r+|p| j        }|dk    r|j        S |dk    r|j        |j        z   S | j        S r  )r}   rW  rk   r   r  s      r/   r  z_YTicks._labelAxisPos  r  r1   c                 8   | j         }	 |                     t          | dd                    | _         |                     | j        | j                  }|                     t          | dd          t          | dd          |           ||| _         S # || _         w xY wr  )rk   r  r   r  	tickRighttickLeftr  )rZ   xoldr   s      r/   r  z_YTicks.makeTicks  s    W	((nV)L)LMMDGt}==AwtK::74TU;V;VWXYYYDGGdDGNNNNr  r)   )rq   rr   rs   r  r  r*   r1   r/   r  r    s7               r1   r  c                       e Zd ZdZ ee eed           eed           e eddddd	          d
                    Z	dZ
d Zd ZddZd Zd Zd Zd Zd	S )XCategoryAxiszX/category axisTick length up the axis.r$  Tick length down the axis.rl  rj  valuepointsNIMode used for connecting axis ('bottom', 'top', 'value', 'points', None).)r&  r  r  ru  r   c                     t                               |            d| j        _        d| j        _        d| _        d| _        d S )Nr  r      )r1  r\   rK  	boxAnchordyr  r  rw  s    r/   r\   zXCategoryAxis.__init__  s=    d### # r1   c                    |                      ddd           |                     dg           g d| _        d| j        _        d| j        d         _        d	| j        d         _        t          d
d          }|                    |            |S )N   F      
      r  (   rq  )OneTwoThreeFourFiver  r6   r   Z      rr  r}  r  rM  rK  r  angler   r   rZ   r   s     r/   demozXCategoryAxis.demo  s    R%%%()***@@@ ##&A !AC	dr1   c                     t          |           |dk    r|j        | _        dS |dk    r|j        |j        z   | _        dS |dk    r|                    |          | _        dS |dk    r	|| _        dS dS )!Join with y-axis using some mode.rl  rj  r  r  Nr  rl   r   ri   rZ   yAxisr  poss       r/   
joinToAxiszXCategoryAxis.joinToAxis  s    U8hDGGGU]]h.DGGGW__kk#&&DGGGXDGGG r1   c                     | j         }|rG| j        }|dv r|                     ||           d S |dv r!|                     ||| j                   d S d S d S )Nrl  rj  r  r  r  r  r  r}   ru  r  rO  rZ   jajams      r/   _joinToAxiszXCategoryAxis._joinToAxis      ] 	D#C'''-----+++$2BCCCCC	D 	D ,+r1   c                 \    | j         | j        z   |                     |          | j        z  z   S )z'returns the x position in drawing units)rk   ra  r  r  r  s     r/   r  zXCategoryAxis.loScale  s)    w#dkk#&6&6t~&EEEr1   c                 J   t                      }|                                  | j        s|S t          | j        | j        z
  | j        | j        | j        z   | j        z   | j                  }| j	        |_	        | j
        |_
        | j        |_        |                    |           |S r)   r   r  r3  r   rk   rd  rl   r   rf  r   r   r   r   rZ   r   rm   s      r/   r  zXCategoryAxis.makeAxis      GG)DGDK'$'DL2H2TVZV]^^++#3	dr1   c                    t                      }| j        s|S | j        }|%| j        }t	          |          }| j        }| j        }|                                 }| j        }| j	        dk    r| j
        nd }	t          |          D ]}
|r	||
z
  dz
  }n|
}||k    r|
|z
  }|| j        v r| j        |         }n| j        |
         }|	r"|j        }|	|         x}|_
        |dk     r|dz  }nd}|j        }||
|z   |z  z   }|                    |||z              |                    ||         pd           |                    |           |S NrZ  rM   r    )r   r7  rM  rt  r>   rQ  r  r  rk   rW  r  r   rK  r  r'  	setOriginsetTextr   )rZ   r   rM  catCountr  rQ  r  rl   rk   pmvr   iclabel_dyrQ   lpfr,   s                    r/   r  zXCategoryAxis.makeTickLabels  s   GG!+!8*$~HM""A#4~H##%%BB#19<<$))$C8__  # (1*Q,RRbq55(jDK'' K.EE KNE (C%(W,A
ssC2ICC(!C%8++"S&)))mB/52666er1   rl  Nrq   rr   rs   rt   r-  r1  r.  r   r
   r/  r   r\   r  r  r  r  r  r  r*   r1   r/   r  r    s       wLh+- - -<-/ / /#|EE(E7Hd$S$S\^ ^ ^
 
 
H J    
 
 
 
D D DF F F  $ $ $ $ $r1   r  c            
           e Zd ZdZ ee eed           eed           e ed          d                    Z	dZ
d	 Zd
 ZddZd Zd Zd Zd ZdS )YCategoryAxiszY/category axisTick length left of the axis.r$  Tick length right of the axis.leftrightr  r  NIMode used for connecting axis ('left', 'right', 'value', 'points', None).)r&  r  r  ru  rM   c                     t                               |            d| j        _        d| j        _        d| _        d| _        d S )Nr6   r  r  r   )r1  r\   rK  r  dxr  r  rw  s    r/   r\   zYCategoryAxis.__init__  s=    d### # r1   c                    |                      ddd           |                     dg           g d| _        d| j        _        d| j        d         _        d	| j        d         _        t          d
d          }|                    |            |S )Nrq  r  P   )r  r  r  )r  r  r  r6   r   r=  r  r  rr  r  r  s     r/   r  zYCategoryAxis.demo&  s    R$$$
|$$$222 ##&A !AC	dr1   r  Nc                     t          |           |dk    r|j        dz  | _        dS |dk    r|j        |j        z   dz  | _        dS |dk    r|                    |          dz  | _        dS |dk    r|dz  | _        dS dS z!Join with x-axis using some mode.r        ?r  r  r  Nr  rk   r   ri   rZ   xAxisr  r  s       r/   r  zYCategoryAxis.joinToAxis3  s     	U6>>hnDGGGW__x%-/36DGGGW__kk#&&,DGGGXCiDGGG r1   c                     | j         }|rG| j        }|dv r|                     ||           d S |dv r!|                     ||| j                   d S d S d S N)r  r  r  r  r  r  r  s      r/   r  zYCategoryAxis._joinToAxis@  r  r1   c                 L    | j         |                     |          | j        z  z   S )z'Returns the y position in drawing units)rl   r  r  r  s     r/   r  zYCategoryAxis.loScaleI  s"    wS))$.888r1   c                 J   t                      }|                                  | j        s|S t          | j        | j        | j        z
  | j        | j        | j        z   | j        z             }| j	        |_	        | j
        |_
        | j        |_        |                    |           |S r)   r   r  r3  r   rk   rl   rd  r   rf  r   r   r   r   r  s      r/   r  zYCategoryAxis.makeAxisM  s    GG)DGTWT[0$'47T\;QRVR];]^^++#3	dr1   c                    t                      }| j        s|S | j        }|,| j        }t	          |          }| j        }| j        }| j        }|                                 }| j	        }	| j
        dk    r| j        nd }
t          |          D ]}|r	||z
  dz
  }n|}||k    r||z
  }|| j        v r| j        |         }n| j        |         }|j        }|	||z   |z  z   }|
r"|j        }|
|         x}|_        |dk     r|dz  }nd}|                    ||z   |           |                    ||         pd           |                    |           |S r  )r   r7  rM  rt  r>   rQ  r  rK  r  rl   rW  r  r   r'  r  r  r  r   )rZ   r   rM  r  r  rQ  r  rK  rk   rl   r  r   r  r	  r  rd   _dxrQ   s                     r/   r  zYCategoryAxis.makeTickLabelsZ  s   GG!+!8*$~HM""A#4~H[F##%%BB#19<<$))$C8__  # (1*Q,RRbq55(jDK'' K.EE KNE(!C%8++ (C%(W,A
ssC2ICC3***mB/52666er1   r  Nr  r*   r1   r/   r  r    s       wL<02 2 2 L13 3 3#|EE*T$U$U\^ ^ ^
 
 
H J           D D D9 9 9  $ $ $ $ $r1   r  c                       e Zd ZdZd ZdS )TickLabellerztAbstract base class which may be used to indicate a change
    in the call signature for callable label formats
    c                     dS )NzAbstract class instance calledr*   )rZ   rm   r  s      r/   ro   zTickLabeller.__call__  s    //r1   Nrq   rr   rs   rt   ro   r*   r1   r/   r)  r)    s-         0 0 0 0 0r1   r)  c                     d| z  S )Nz%.12gr*   rc   s    r/   r0   r0     s
    7Q; r1   c                   	   e Zd ZdZ edi d e ee ed          f          d          d eed          d eed	          d
 eed          d eed          d eed          d ee	d          d ee
d          d eed          d e eddd          d          d e eddd          d          d ee	d          d ee	d           d! ee
d"          d# eed$          d% e eddd          d&          d' e eddd          d(          d) ee	d*          d+ eed,          d- eed.          d/ eed0          d1 ee	d2          d3 ee	d4          d5 ed6d7          d8 e ed9d:d;          d<          d= ed6d>          d? ed6d@          dA eedB          dC eedD          dE eedF          dG eedH          dI eedJ          dK e ee ee	dddL          f          dM          dN e ee ee	dddL          f          dO          dP e e ee           eedddL          f          dQ          dR e edSdTdUdV          dW          dX eedY          dZ e ed[d\d]          d^          d_ e edSd`dadT          db          dc eedd          de eedf          dg eedh          di e ed9d:d;          dj          dk eedl          dm ed6dn          do ee	dp          dq ee	dr          ds ee	dt          du ee	dv          dw ee	dx          dy eedz          d{ eed|          d} ee	d           d~ ee
d"          d eed$          d e eddd          d&          d e eddd          d(          d ee	d*          d eed,          d eed.          d ee	d          d ee	d          d ee
d          d ee
d          d eed          d e edSddTd          d          d eed          d eed          d eed          Zd Zd Zd Zd Zi fdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d6S )	ValueAxisz(Abstract value axis, unusable in itself.	forceZeronearzEnsure zero in range if true.r$  r  r2  r3  r4  r7  r8  r5  r6  r   r9  r   r:  r   r;  r   r<  r   r   rM   r=  r>  r   r?  r   r@  r   rA  r   rB  r   rC  r   rD  r   rE  r   rF  r   rG  r   rH  rI  rJ  minimumTickSpacingz)Minimum value for distance between ticks.maximumTickszMaximum number of ticks.rK  NrL  rW  rX  rY  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
rangeRoundri  rk  ceilingfloorzHow to round the axis limits
zrangePrefz!Zero range axis limit preference.rS  normalrU  rV  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 ticksrQ  rR  r  rc  rd  re  rf  rg  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 truerh  rj  rl  rm  requiredRangezMinimum required value range.rn  ro  rA   z*extra values to use in min max calculationc                 |   | j         j        dk    s
J d             | j        dPi |  | j        dPi dddddddd	d
ddddddddddddddt          d         dt          d         dt          d         dt          d         dt          d         dddt          d         dt          d         dt          d         dt          d         dt          d         dd dd d d!d"dd#dd$dd%dd&dd't          d         d(t          d         d)t          d         d*dd+t          d         d,t          d         d-d d.d d/t	          t
                    d0dd1d2d3d4d5d d6d7d8d d9d d:d d;d d<d d=d d>d d?d d@d!dAdBdCddDdEdFdBdGd dHd dId dJd7dKddLddMddNddOd  d| j        _        d S )QNr.  z%Abstract Class ValueAxis Instantiated_configuredr   rk   rq  rl   r   rr  r  rM   r3  r7  r5  r   r/  r   r   r   r   r   r   r   rs  r   r   r   r   r   r   r   rI  Fr   r  r   r  r  r   r   r   r   r   r   r   r   rK  rL  r1  r  r2     rv  rW  rm   r3  r4  r5  r6  r7  r8  r:  r=  r>  r?  ri  rB  rS  rC  rD  rE  rG  rI  r  rQ  rd  rf  rM  rA   r*   )r   rq   r*  r   r   r   rK  r  r+  s     r/   r\   zValueAxis.__init__  s   ~&3335\333B R	 R	 R	&'aR	
  RR	  RR	 #&#R	 #$!R	 '(aR	 )*R	 ()qR	 '(aR	 %&AR	" '(a#R	$ '5]&C&C%R	& +99J*K*K'R	( +99I*J*J)R	* )7(G(G+R	, ,::L+M+M-R	. +/$/R	0 +9*G*G1R	2 /==N.O.O3R	4 /==M.N.N5R	6 -;?,K,K7R	8 0>>P/Q/Q9R	: %)D;R	< #'$=R	> (-u?R	@ *+AR	B +,!CR	D &'QER	F %&AGR	H %&AIR	J 1??O0P0PKR	L 0>o/N/NMR	N 3AAS2T2TOR	P .2TQR	R .<M-J-JSR	T 2@@Q1R1RUR	V (,tWR	X &*TYR	Z "9!?!?!?[R	\ 01q]R	b .0RcR	d ()qeR	l ,04mR	n )/oR	p +/$qR	r /3dsR	t *.uR	~ $(4R	@ $(4AR	B %)DCR	D *.ER	F +/$GR	H +0%IR	J &,VKR	L &'QMR	N !)OR	P "(QR	R (,tSR	T (,tUR	V 15WR	X (.vYR	Z *+[R	\  !q]R	^  !q_R	` '(aaR	b +/$cR	 R	f r1   c                 ~    t          |          | _        t          |          | _        t          |          | _        d S r)   ry  r{  s       r/   r}  zValueAxis.setPosition.  r~  r1   c                 X    |                      |           |                                  dS )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)rZ   
dataSeriess     r/   r  zValueAxis.configure4  s.     	z"""r1   c                 d    |                                   |                                  d| _        d S r  )r  _calcScaleFactorrO  rw  s    r/   rT  zValueAxis._configure_endD  s4    ##%%%r1   c                     	 ||f}||         }n9#  || _         || _        |                                 \  }}|||dz  fx}||<   Y nxY w|S )Nr   )	_valueMin	_valueMax_calcStepAndTickPositions)rZ   r6  r7  cacheKrB   r8  r+   s           r/   _getValueStepAndTickszValueAxis._getValueStepAndTicksI  sj    	8(#AaAA	8%DN%DN88::KIa$a477Aas	    4Ac                    | j         }|dk    rz||z
  }||k     rod||z   z  }|dz  }t          ||z
  |          }t          ||z   |          }|dk    r|dk     r|dz   |z
  }d}n|dk    r|dk     r||z
  }d}|x}| _        |x}| _        ||fS )Nr   r)  rr  )rM  rF   rJ   
_cValueMin
_cValueMax)rZ   r6  r7  rrrB   mr   y2s           r/   _preRangeAdjustzValueAxis._preRangeAdjustT  s    a448#Att(*+c	2h''2h''S==RVVcBBBBq[[RTTbBB-//4?-//4?  r1   c                 	   | j         x}}| j        x}}|#t          || j        d| j                  x}| _        |#t          || j        d| j                  x}| _        ||k    rX|dk    r=|.|,t          | dd          }|dk    r|}d}n2|dk     rd}|}n'd}d}n"| j         d}nd}n|dk    rd|z  }d}nd}d|z  }t          | dd          rt          t          |d	d                    }d
}|||z
  z  }	|	| _
        || _        || j        z  | _        |	|fd}
|%t          || j        d|
| j                  x}| _        |%t          || j        d|
| j                  x}| _        |                     ||          \  }}| j        }|}|}| j        }|rM|dk    r4t#          t%          |          t%          |                    d||z
  z  k    }|r|dk     rd}n|dk    rd}| j        }t          | dd           }|o|}t)          |          s||f}t          | dd          }t)          |          s||f}|dk    o|}|r	|dv }|dv }ndx}}| j        }|}|rt)          |          s||f}t          | j                  }|p|p|}i }d}|r|dk    r|dz  }d}|s|r|                     |||          \  }}}|r||d         z  }||d         z  }ndx}}|r:||z
  |z  } t/          ||d         | z            }t/          ||d         | z            }|r	|d         }!n|}!||z
  }"|d         st%          |!          |k    r|!|"|z   k    r|"}d}|r	|d         }!n|}!||z   }"|d         st%          |!          |k    r|!|"|z
  k    r|"}d}|r|                     |||          \  }}}|r4||d         |z
  k     r|d         |z
  }d}n||d         |z   k    }|d         }|r4||d         |z   k    r|d         |z   }d}n||d         |z
  k    }|d         }|r|dk    |r
|s|| _        nd| _        || _        || _        | j        }#| j        }$|$|#| j        }%|                                  | j        | j        }}|%t%          |%|z
            dk     r?|#r|#| j        z  }&nd}&|$rt/          |&||z
  |$z  | j        z            }&| xj        |&z  c_        |                                   dS )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   rB  g{Gz?g{Gz333333?        _bubblePlotr=  rs  c                     	 | d         }n# t           $ r t          dz  }Y nw xY w|||z  dz  z  } || |         |z   | |         |z
            S )Nr=  皙?r)  )r   	bubbleMAx)r+   r,   r.   bubbleV	bubbleMaxrQ   s         r/   r-   z$ValueAxis._setRange.<locals>.special  so    &!AA! & & &!#AAA&AiK#--tAaDL1g666s    ""rE   r0  r  r9  r>  Fri  rk  rA  rk  r@  r  rM   r  ư>)!r6  r7  rH   r   rA   r`  rK   ra  r   rz  _bubbleV
_bubbleMaxr   _bubbleRadiusre  r?  r/  rF   r   r:  r&   r=  r^  rJ   _computedValueSteprY  rZ  rE  rG  rI  _calcValueStep
_valueStep_rangeAdjust)'rZ   rU  oMinr6  oMaxr7  zrprn  fracrm  r-   r?  cMincMaxr/  abfdo_rrdo_abfabfizrrnrrxabSdo_absaLgor\  iterr8  r+   fuzzi0i1sfrQ   urE  rG  rI  rc  s'                                          r/   rS  zValueAxis._setRangeh  s    -'x-'x(:do^_aeaw:x:xxX(:do^_aeaw:x:xxXx{{<DL!$|A66C1uu#&#$Q#$#&#'#(]*$HH#HHA::"8|H"HH"H"8|H4d++ 	Zhz!A6677ID(8+,G#DM'DO!%dl!2D)09 7 7 7 7 |(:do^_ho  CG  CY  ;Z  ;Z  ;Z  ZX|(:do^_ho  CG  CY  ;Z  ;Z  ;Z  ZX!11(8DD(_
N	 	.&  Hc(mm<<8HCT@UU	 .A::xxaZZA!Dd333Szz 	s(C.66U|| 	!5LEf$. 	 00C 22CCMC#" 	:: 3h4<  &f& *	)T2XXAIDB  %)%?%?(TY%Z%Z"	1d  "3q6)B"3q6)BBKB +"8+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 )%)%?%?(TY%Z%Z"	1d (!T	))#$Q4	>%qtDy0#$Q4 )"d
**#$R5?%quTz1#$R5U  *	)T2XXV  	+ 	+&/D##&*D#!!((#|'?$($>!!!!!%hH$,4I(4R0S0STX0X0X $T_4AAA MAx0,>t|KLLA!#r1   c                     | j         | _        | j        | _        t	          | d          r| `|                                  d S )N_subTickValues)r6  rY  r7  rZ  rg   r  rT  rw  s    r/   rh   zValueAxis._pseudo_configure
  sB    4())Bt/Br1   c                     dS )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*   rw  s    r/   rx  zValueAxis._rangeAdjust  s	     	r1   c                     dS )zOverride 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*   rw  s    r/   _adjustAxisTickszValueAxis._adjustAxisTicks  s	     	r1   c                 b    | j         t          | j        | j        z
            z  | _        | j        S zCalculate the axis' scale factor.
        This should be called only *after* the axis' range is set.
        Returns a number.
        )r   rz  rZ  rY  _scaleFactorrw  s    r/   rW  zValueAxis._calcScaleFactor  s-    
 !L5$.1P+Q+QQ  r1   c                    t          | dd           r
| `| _        n|                                  | j        | j        }| j        }dz  }| j        }t          t          |          z            }|z  }|dv r|||z   k    r|dz  }n|||z
  k     r|dz  }t          t          |          z            }|z  }|dv r|||z
  k     r|dz  }n|||z   k    r|dz  }fdt          ||dz             D             fS )Nru  r   ro  rM   rp  c                     g | ]}|z  S r*   r*   )r;   r   r8  s     r/   r<   z7ValueAxis._calcStepAndTickPositions.<locals>.<listcomp><  s    >>>!!I+>>>r1   )
r   ru  rw  rv  rY  rZ  r?  rO   rz  r   )	rZ   r6  r7  r  r?  r  rQ   r  r8  s	           @r/   r[  z#ValueAxis._calcStepAndTickPositions&  s?   D!5d;;	 	(''DOO!!!I>>I~_
x*++yL)))$ax}__bAgbx*++yL+++$ax}__bAgb>>>>uR1~~>>>>>r1   c                 6    |                                  d         S r  )r[  rw  s    r/   _calcTickPositionszValueAxis._calcTickPositions>  s    --//22r1   c                    t          | d          s|                                  | j        }t          | d          s| j        j        }|d d         dk    r
d}t
          }nd}d }d |D             }g j        }t          | j                  }t          |          }|d	k     r	g | _	        nP|d	k    r|d
         |d         z
  }	nN|dk    r/t          |d
         |d         z
  |d	         |d
         z
            }	n|d
z  }||d
z            ||         z
  }	|	|z  }
| j        |
z   }| j        |
z
  }|d         |k    r|                    d|d         |	z
             |d         |k     r|                    |d         |	z              |	t          |d
z             z  }	t          |d d                   D ]C\  }}t!          |          D ].}| ||d
z   |	z            z   }||k    s||k    r# ||           /D|j        | _	        | j	        | _        |S )Nra   r  r  r  r   r   c                     | S r)   r*   rc   s    r/   r0   z)ValueAxis._calcSubTicks.<locals>.<lambda>L  s     r1   c                 4    g | ]}t          |d d          |S )_doSubTicksrM   )r   )r;   r   s     r/   r<   z+ValueAxis._calcSubTicks.<locals>.<listcomp>N  s)    CCC"wr-'B'BC2CCCr1   r=  rM      r  )rg   rh   ra   r   rq   rO   r  r   r>   r  rJ   rY  rZ  insertrz  	enumerater   r  )rZ   r   r  iFuzzdCnvOTVr+   nstr   dstr  vnvxr,   jr   s                   r/   r   zValueAxis._calcSubTicksA  sC   tM** 	%""$$$t,-- "	1.)C3B3x&&!zCCCCCC	Ado&&CCAss&(##a44a&Q-CCTTc!fSVmCF3q6M::CC!GAac(SV+C5y^D(^D(q6"99cjj3q6#:666r72::szz#b'#+666uSU||#$S"X..  CAa"3ZZ  ddAaC9oo-b55ArEE8! '(j#.
r1   c                     t          | dd          | _        | j        r| j        S |                                 | _        |                                  | j        S )zKCalculate a list of tick positions on the axis.  Returns a list of numbers.r9  N)r   ra   r  r  rw  s    r/   r  z ValueAxis._calcTickmarkPositionsk  sV    "4T::4D$442244r1   c                     | j         g| j        | j        z
  }|t          t	          | j        dz
            t	          | j                  | j        z            z  }t          |          | _	        dS | j         | _	        dS )8Calculate _valueStep for the axis or get from valueStep.NrM   )
r8  rZ  rY  rF   rz  r2  r   r1  r#   rw  )rZ   rawRangerawIntervals      r/   rv  zValueAxis._calcValueSteps  so    >!~6H"St/@/B)C)CU4<EXEXY]YpEp%r%rrK-k::DOOO"nDOOOr1   c                 *    t          | j                  S r)   )rR   ra   rw  s    r/   _allIntTickszValueAxis._allIntTicks|  s    t'(((r1   c                    t                      }| j        s|S | j        }|%| j        p|                                 rdpt
          }nJ|t          u r|                                 rd}n*t          |d          r|                    | j	                   | j
        }| j        }| j        | j        g}| j        }|                                 |d|z
  <   | j        }| j        dk    r@| j        r| j        }n| j        }| j        dk    r|g}n||| j        z   g}| j        dk    r|d= ng }t)          | j	                  }	|	dz
  }
t+          | j	                  D ]\  }}||	z
  }||v r	||         }n||         }|r|j        r|                     |          }|r|D ]}t1          ||z
            dk     rd } n||||z  }n|}t3          |t                    r||z  }n~t5          |          r|t)          |          k     r	||         }nSd	}nPt          |d
          r.t3          |t6                    r || |          }n ||          }nt9          d|z            |r||z  }|||<    |j        |  |                    |           | j        rt3          | t@                    r| j        }|s@|!                                \  }}}}||k     r!|"                    |j#        |z   |z
            }||
k    rJ|| j        z   }|!                                \  }}}}||k    r!|"                    |j#        |z
  |z             }|$                    |           |S )Nz%.0f
calcPlacesrM   ri  r{   r|   r   rq  r  ro   zInvalid labelTextFormat %s)r  )%r   r7  rv  r3  r  _defaultLabelFormatterstrrg   r  ra   r4  r5  rk   rl   r   r  rK  rD  r  r   r>   r  r  ri   r   r   r&   r)  
ValueErrorr  r  rL  
XValueAxis	getBoundscloner  r   )rZ   r   r7   postsclr  r   rK  sknticksnticks1r   tickr	  rQ   skvr   txta_xr   r   r   r   a_x1s                           r/   r  zValueAxis.makeTickLabels  s   GG!+!8!9$b):):)<)<)G)aKaAA#XX$++--X6qqQ|$$ 	+LL)***'!w O%%''AaC=&  | WW}g%%TDL)=%''1BT%&&1* 011 2	! 2	!FAdfHEuq	 ,!U] ,!JJt$$ "! " "s1u::d?? $A!E + = H !!S)) KQ33q Ks1vv::"#A$CC"$CC :.. K%a55 '"#!D))CC"#!A$$CC()E)IJJJ-4#:SCF#EOS))MM#&&& 0 K%dJ77 
K"&'C#$ P161B1BBB#%88,1KK58c>B;NK,O,OE 'zz'*DL'8161B1BBB#%99*/++"T9I+*J*JEEE%LLLr1   c                     | j         s
J d            |d}| j        | j        f| j                 }| j        }| j        r| }|| j        z  }|||| j        z
  z  z   S )zvConverts a numeric value to a plotarea position.
        The chart first configures the axis, then asks it to
        1Axis cannot scale numbers before it is configuredNr   )rO  rk   rl   r   r  rQ  r   rY  )rZ   r  orgr  s       r/   ri   zValueAxis.scale  sy     TT!TTTT=!% w 1  	 B4<CR/000r1   r*   )$rq   rr   rs   rt   r-  r.  r   r   r
   r   r	   r   r   r   r   r   r/  r\   r}  r  rT  r^  re  rS  rh   rx  r  rW  r[  r  r   r  rv  r  r  ri   r*   r1   r/   r.  r.    s&       ..w F
 F
 F
 L9UU6]]*C!D!DKjkkkkF
,y/PQQQQF
 #l93PQQQQF
 %Y5TUUUU	F

 $|I4RSSSSF
 #l93PQQQQF
 #l82QRRRRF
 #l=7VWWWWF
 ','<CcddddF
 %UU1Qq\\7\]]]]F
 &eeAall8^____F
 (<6\]]]]F
 ',x6LMMMMF
 ',};QRRRRF
 +l+@GhiiiiF
  )Lq1;effff!F
" *\%%!A,,<ghhhh#F
$  ,|H:effff%F
& !L6[\\\\'F
( ,~4WXXXX)F
* $|I4cdddd+F
, *\(9deeee-F
. $|H3MNNNN/F
0 d)EFFFF1F
2 %UU6%%?%?Frssss3F
4 ',t2ghhhh5F
6 +l46PQQQQ7F
8 &n;[\\\\9F
:  <5MNNNN;F
<  <5MNNNN=F
> !L6UVVVV?F
@ "\"7>fggggAF
B &hhzz([\`aef?g?g?g/h&i&i  qa  b  b  b  bCF
D ',xx

8\]abfg@h@h@h0i'j'j  rS  T  T  T  TEF
F ',xx	1B1B::i`aefjkClClCl0m'n'n  vE  F  F  F  FGF
H  <fVIg F FGefffIF
J "\.7Z[[[[KF
L UU8ImDDE^___MF
N  <fWU6 B BIdeeeeOF
P $|N9]^^^^QF
R $|N9STTTTSF
T !-^B[ \ \ \ \UF
V $|EE&v$>$>EkllllWF
X (<	8]^^^^YF
Z #l4-BCCCC[F
\ h-YZZZZ]F
^ h-VWWWW_F
` "\(1RSSSSaF
b !L0GHHHHcF
d !L0FGGGGeF
f ',y7YZZZZgF
h &i6WXXXXiF
j *\(9OPPPPkF
l *\->TUUUUmF
n "..CJk!l!l!l!loF
p  ,|EE!AaLL>hiiiiqF
r !-UU1Qq\\?j k k k ksF
t #/,x=h"i"i"i"iuF
v $|N9^____wF
x "\.7Z[[[[yF
z ',x6TUUUU{F
| *\(9[\\\\}F
~ *\->`aaaaF
@ ',};YZZZZAF
B  ,|I<}~~~~CF
D  <fU6( C CDmnnnEF
F %^:YZZZZGF
H %%5<abbbbIF
J )L)>EqrrrrKF
HPV V Vp% % %     
 >@ 	 	 	 	! ! !(` ` `D      ! ! !? ? ?03 3 3( ( (T     - - -) ) )T T Tl1 1 1 1 1r1   r.  c                       e Zd ZdZ ee eed           eed           edd           e eddd	d
d          d           ee	d                    Z
dZd Zd ZddZd Zd ZdS )r  zX/value axisr  r$  r  NrN  rl  rj  r  r  r  rP  )r&  r  r  r}   ru  rO  r   c                     t          j        | fi | d| j        _        d| j        _        d| j        _        d| _        d| _        d | _        d | _	        d | _
        d S )Nr  r   r  r  )r.  r\   rK  r  r  r  r  r  r}   ru  rO  r+  s     r/   r\   zXValueAxis.__init__  sb    4%%"%%% # r1   c                     |                      ddd           |                     dg           t          dd          }|                    |            |S )Nr  rq     r  r  rr  r}  r  r   r   r  s     r/   r  zXValueAxis.demo  sS    R%%%()***C	dr1   c                     t          |           |dk    r|j        dz  | _        dS |dk    r|j        |j        z   dz  | _        dS |dk    r|                    |          dz  | _        dS |dk    r|dz  | _        dS dS )r  rl  r  rj  r  r  Nr  r  s       r/   r  zXValueAxis.joinToAxis  s    U8hnDGGGU]]x%-/36DGGGW__kk#&&,DGGGXCiDGGG r1   c                     | j         }|rI| j        pd}|dv r|                     ||           d S |dv r!|                     ||| j                   d S d S d S )Nrl  r  r  r  r  r  r  s      r/   r  zXValueAxis._joinToAxis  s    ] 	D#/xC'''-----+++$2BCCCCC	D 	D ,+r1   c                 J   t                      }|                                  | j        s|S t          | j        | j        z
  | j        | j        | j        z   | j        z   | j                  }| j	        |_	        | j
        |_
        | j        |_        |                    |           |S r)   r  r  s      r/   r  zXValueAxis.makeAxis"  r  r1   r  rq   rr   rs   rt   r-  r.  r.  r   r
   r   r/  r   r\   r  r  r  r  r*   r1   r/   r  r    s       NwIh+- - -<-/ / /<*, , ,#|EE(E7Hd$S$S\^ ^ ^"l>=? ? ?
 
 
H J       
  
  
  
 D D D    r1   r  )janfebmaraprmayjunjulaugsepoctnovdec)      r  r  r  r  r  r  r  r  r  r  c                     |                      d          \  }}t          |          }|                                }t                              |          dz   }|t
          |dz
           k    sJ ||fS )a  This 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.
    -rM   )splitrO   lower_monthsindex_maxDays)dmstrdstrmstrddmms        r/   parseDayAndMonthr  ;  si     S!!JD$	TB::<<D	t		q	 B"Q$8Or1   c                       e Zd ZdZd Zd ZdS )_isListOfDaysAndMonthszThis 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    t          |          r%d}|D ]}	 t          |          \  }}#  d}Y xY w|S dS r   )r&   r  )rZ   r,   answerelementr  r  s         r/   testz_isListOfDaysAndMonths.testN  sX    88 		F # ##-g66FB#"FFFM5s   *0c                     |S r)   r*   )rZ   r,   s     r/   	normalizez _isListOfDaysAndMonths.normalizeZ  s    r1   N)rq   rr   rs   rt   r  r  r*   r1   r/   r  r  I  s<         
 
 
    r1   r  )rM   r=  r           <   x         i,  ih  i  i  i  iX  i  iH  i  i8  i  i`	  c                      e Zd ZdZ ee eed           eed           eed           eed           ee	d           edd	           e e
ed
dd          d           e e
ed
dd          d           eed           e e e
e                    d           eed           e edddd          d                    Zej        Zd Zd Zd Zd Zd Zd Zd ZdS ) NormalDateXValueAxiszAn 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 spacingr$  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   rP  r;  zWeekday names.r  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 datesri  rj  rk  rl  rm  )r&  bottomAxisLabelSlack	niceMonthforceEndDateforceFirstDateforceDatesEachYearxLabelFormatdayOfWeekName	monthName	dailyFreqspecifiedTickDatesspecialTickClearrh  c                     t          j        | fi | d| _        d| _        d| _        d| _        g | _        d| _        d| _        g d| _	        g d| _
        d| _        d x| _        | _        d S )Nrk  rM   r   z	{mm}/{yy})MondayTuesday	WednesdayThursdayFridaySaturdaySunday)JanuaryFebruaryMarchAprilMayJuneJulyAugust	SeptemberOctoberNovemberDecember)r  r\   r  r  r  r  r  r  r   r  r  r  r9  r  r+  s     r/   r\   zNormalDateXValueAxis.__init__}  s    D&&2&&& %(!"$'kkkV V V !488$111r1   c                 X    |                                  }|                    |           |S )z'Convert a scalar to a NormalDate value.)_valueClassr  )rZ   r,   r   s      r/   
_scalar2NDzNormalDateXValueAxis._scalar2ND  s'    	Ar1   c                 z   t          |t          j                  s|                     |          }t          j        t          j        }}	 | j        | j        ct          _        t          _        |                    | j	                  ||ct          _        t          _        S # ||ct          _        t          _        w xY w)z(Create a formatted label for some value.)
r   r   
NormalDater  _dayOfWeekName
_monthNamer  r  formatMSr   )rZ   rQ   r   rc  s       r/   _dateFormatterz#NormalDateXValueAxis._dateFormatter  s    !J122 	#""A(**?1	D?C?QSWSa<J%z'<::d/00?@!<J%z'<'<q!<J%z'<CCCCs   	<B B:c                 P   !"  j         ! j        } j        "t          "t                    r fd" j        s|d         n ! j                  } j        s|d         n ! j                  } j        }|j        |j	        |j
        }}}|j        |j        |j        }}
}	t           "|                              d          |||pd|z  |	|
          }t!          |d         |d         |d         |d         |          }|d         |d         z
  }|d         |d         z
  }t#          ||j        pd j                  }|| j        z  z   }g }g } j        } j        r߈!fd	 j        D             }"fd
|D             } j        rV||d         k    rJ|t1          |d         |d         z
            z  |d         |d         z
  z  |k    r j        rd|d<   n|d= |d=  j        rV||d         k    rJ|t1          |d         |d         z
            z  |d         |d         z
  z  |k    r j        rd|d<   n|d= |d= ||fS  j        rt9          t;          t<           j                            }|                                }|                                }g }g }|}||k    ri|D ][\  }}tA          j!        |||f          }||k    r9||k    r3|"                    |           |"                     "|                     \|dz  }||k    i j        r||d         k    r|#                    d|           |#                    d "|                     |t1          |d         |d         z
            z  |d         |d         z
  z  |k    r j        rd|d<   n|d= |d=  j        r||d         k    r}|"                    |           |"                     "|                     |t1          |d         |d         z
            z  |d         |d         z
  z  |k    r j        rd|d<   n|d= |d= ||fS |"||fd}tI          |          }tJ          D ]}||z  }||k    r||z  |k    r|dz
  } j&        rE|'                                |dk    r|pdz  }|r$ j        r ||           d|d         _(        ||z  }	 |'                                |d         '                                k    } n	#  d} Y nxY w|| k    r ||           ||z  }|| k     j        rn|d         |k    rb |d           d|d         _(        |t1          |d         |d         z
            z  |d         |d         z
  z  |k    r j        rd|d<   n|d= |d=  j        rS j&        rL|rJ|t1          |d         |d         z
            z  |d         |d         z
  z  |k    r j        rd|d<   n|d= |d= 	 |d         r|d         |d         k    r|d= |d= n# tR          $ r Y nw xY w||fc S tU          d          )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                 0                         |           S r)   )r"  )r  rZ   s    r/   	formatterz4NormalDateXValueAxis._xAxisTicker.<locals>.formatter  s    **4555r1   r   r  
rg  rM   r=  r  c                 &    g | ]} |          S r*   r*   )r;   r,   VCs     r/   r<   z5NormalDateXValueAxis._xAxisTicker.<locals>.<listcomp>  s!    <<<qRRUU<<<r1   c                 &    g | ]} |          S r*   r*   )r;   r   r%  s     r/   r<   z5NormalDateXValueAxis._xAxisTicker.<locals>.<listcomp>  s!    222qiill222r1   r  r  c                     |                     d||                     |                     d |||                               d S r   )r  )r   xValsr%  ticksrK  s        r/   addTickz2NormalDateXValueAxis._xAxisTicker.<locals>.addTick  sB    LL58$$$MM!IIeAh//00000r1   r  z6Problem selecting NormalDate value axis tick positions)+r  r   r"  r   r)  r6  r7  rK  fontNamefontSizeleading
textAnchorr  r  r   r  r   rJ   r   r1  r  r2  r  r  rz  r  r  r  r4   r5   r  yearr   NDr  r  r>   _NDINTMr  monthr  r   r  )#rZ   r+  
axisLength	firstDateendDaterK  r.  r/  r0  r1  r  r  RBLxLabelWxLabelHr   Wr,  r2  forcedPartialDates	firstYearlastYearyyyyr  r  theDater-  r  r   r   r   r  wfdr(  r%  s#   `                                @@r/   _xAxisTickerz!NormalDateXValueAxis._xAxisTicker  s    \
'	i-- 	66 6 6 6 6$(MHE!HHrr$-7H7H	#'=G%))bb6G6G&,ovG('-'8&:JFLuI
YYy1177==hW4HZ	K KAs1vc!fSVUCCa&Q-a&Q-)$*ABBa)))(" 	!<<<<D$;<<<E2222E222F" ,y%(':':
5QVWYQZ[`ab[cQcKdKd@dglmngopuvwpxgx?y{|?|?|( , "F1IIa&)  .WeBi%7%7ZeTViX]^_X`N`HaHa=adijldmnstvnwdw<xz{<{<{( .!#F2JJb	6":&= 
 " &	!!%c*:D<S&T&T!U!U "((I||~~HEFD ("" 2 : :HR(mT2rN;;G)++70B0BW---ii&8&8999	 ("" " 0y%(':':Q	***a		) 4 4555uU2YuQx%788858E!H;LMqPP, 0$&q		!!HfQi  2WeBi%7%7W%%%ii00111uU2YuQx%788859U2Y;NOQRRR, 2%'r

!"Ivbz &= "iuV 	1 	1 	1 	1 JJ  *	% *	%A!A,1Q3*#4#4aC> 1b5;Q+<"=A , 3#GAJJJ12E!H0Q#//++uQx~~/?/??CCCCCffGAJJJFA ff & 458Y+>+>GAJJJ)*E!H("5r58);#<#<<uQxa?PQSTTT0 4(*F1II %a&)$ 6 6A 6"5r58);#<#<<uRyr?RSUVVV0 6)+F2JJ %b	6":ay 0VAYq	%9%9!!HfQi!   D f}$$$QRRRs   :0S++S1  X
XXc                     | j         }|D ]L}t          t          |                    D ]-}||         \  }}t          ||          s ||          |f||<   .MdS )z1Convert all XValues to a standard normalDate typeN)r  r   r>   r   )rZ   datar(  r  r   r,   rd   s          r/   
_convertXVzNormalDateXValueAxis._convertXV,  sz      	% 	%A3q66]] % %t1!!B'' %BqEE!9AaD%	% 	%r1   c                 X   | j         rg }d}|d         }|D ]7}|                                }||k    r|r|                    |           |}|}8|d         }|d         |k    r|                    |           |                     |          \  }}n|                     |          \  }}||fS )Nr   r  )r  r5  r  rC  )	rZ   r+  xEOMpmpxr,   rc  stepsrK  s	            r/   _getStepsAndLabelsz'NormalDateXValueAxis._getStepsAndLabels6  s    > 	5DBqB  GGIIq55*4;;r???BrBBx{{DKKOOO --d33ME66 --e44ME6f}r1   c                    |                      |           t                      }|D ]"}|D ]}|                    |d                    #t          |          }|                                 | j        }|                     |          \  }}| j        | j        }	}||d         n
 ||          }|	|d         n
 ||	          }	||	c| _	        | _
        || _        || _        | j        t          |	|z
            z  | _        || _        d| _        d S )Nr   r  rM   )rF  setr   r4   sortr  rL  r6  r7  rY  rZ  ra   rv  r   rz  r  rO  )
rZ   rE  r+  r,   dvr(  rK  rK  r6  r7  s
             r/   r  zNormalDateXValueAxis.configureH  s#    	! 	!A ! !		"Q%    !U

..u55f!]DM( ( 0588bbll ( 0599bbll)18&  & L5H1D+E+EE r1   )rq   rr   rs   rt   r-  r  r.  r   r   isListOfDaysAndMonthsr   r   r   r   r
   r/  r   r3  r  r\   r  r"  rC  rF  rL  r  r*   r1   r/   r  r  a  s         wj+|H;klll L1WXXX#|I4fggg%i6ijjj)\*? Gk l l l $|D/deee$ZZa1%M%M%MTdeee LHQ"!K!K!KR`aaa L1tuuu)\&&L1I1I*J*J  RC  D  D  D'<	8z{{{<fU6( C CDmnn
 
 
H" -K9 9 9"  	D 	D 	DKS KS KSZ% % %  $    r1   r  c                       e Zd ZdZ ee eed           eed           edd           e ed          d           ee	d	          
          Z
dZd Zd ZddZd Zd ZdS )
YValueAxiszY/value axisr  r$  r  NrN  r  r  rP  )r&  r  r  r}   ru  rO  rM   c                     t                               |            d| j        _        d| j        _        d| j        _        d| _        d| _        d | _        d | _	        d | _
        d S )Nr6   r  r   r  )r.  r\   rK  r  r  r  r  r  r}   ru  rO  rw  s    r/   r\   zYValueAxis.__init__p  s]    4    # r1   c                     dg}|                      ddd           |                     |           t          dd          }|                    |            |S )N)r  r  r  *   rr  r  r  r  r  )rZ   rE  drawings      r/   r  zYValueAxis.demo~  sZ     !b"%%%t#s##Dr1   r  c                     t          |           |dk    r|j        dz  | _        dS |dk    r|j        |j        z   dz  | _        dS |dk    r|                    |          dz  | _        dS |dk    r|dz  | _        dS dS r  r  r  s       r/   r  zYValueAxis.joinToAxis  s    U6>>hnDGGGW__x%-/36DGGGW__kk#&&,DGGGXCiDGGG r1   c                     | j         }|rG| j        }|dv r|                     ||           d S |dv r!|                     ||| j                   d S d S d S r!  r  r  s      r/   r  zYValueAxis._joinToAxis  r  r1   c                 J   t                      }|                                  | j        s|S t          | j        | j        | j        z
  | j        | j        | j        z   | j        z             }| j	        |_	        | j
        |_
        | j        |_        |                    |           |S r)   r$  r  s      r/   r  zYValueAxis.makeAxis  s    GG)DGTWT[0$'47T\;QRVR];]^^++#3	dr1   r'  r  r*   r1   r/   rS  rS  ]  s       NwI<02 2 2 L13 3 3<*, , ,#|EE*T$U$U\^ ^ ^"l>=? ? ?
 
 
H J       
  
  
  
 D D D
 
 
 
 
r1   rS  c                   8    e Zd ZdZdez  Zdez  Zd Zd Zd ZdS )TimeValueAxisr  r  c                 :    | j         s| j        | _         i | _        d S r)   )r3  timeLabelTextFormatter_saved_tickInforZ   argsr[   s      r/   r\   zTimeValueAxis.__init__  s&    # 	?#'#>D !r1   c                    | j         | j        | j        z
  }|t          t	          | j        dz
            t	          | j                  | j        z            z  }|| j        k    r| j        }d| _	        n=|| j
        k    r| j
        }d| _	        n#|| j        k    r| j        }d| _	        n	d}d| _	        || _        |dk    rt          ||z            }t          |          |z  | _        dS | j         | _        dS )r  NrM   dayshoursminutesseconds)r8  rZ  rY  rF   rz  r2  r   r1  _dc_unit_hc_mc_unitdrO   r#   rw  )rZ   r  r  r   s       r/   rv  zTimeValueAxis._calcValueStep  s    >!~6H"St/@/B)C)CU4<EXEXY]YpEp%r%rrKdh&&H#

((H$

((H&

&
DKss!+a-00-k::Q>DOOO"nDOOOr1   c                 L   | j         }|t          | j                  f}|| j        v r| j        |         }nt	          |          fd| j        D             }| j        d         }t          |          r|fd}nd |D             }t          d |D                       }|dk    r
d|z  fd}n`|| j        k    rd	nd
fd|D             }	t          |	          r)|| j        k    rdn|| j	        k    rdnd}
d||
fz  fd}nd||fz  fd}|| j        |<    ||          S )Nc                     g | ]}|z  S r*   r*   )r;   rQ   ufs     r/   r<   z8TimeValueAxis.timeLabelTextFormatter.<locals>.<listcomp>  s    1111!B$111r1   r   c                     d| |z  |fz  S )Nz%.0f%sr*   )r,   rn  r   s      r/   r0   z6TimeValueAxis.timeLabelTextFormatter.<locals>.<lambda>  s    H"Qx,? r1   c                     g | ]}d |z  S )z%.10fr*   r;   rQ   s     r/   r<   z8TimeValueAxis.timeLabelTextFormatter.<locals>.<listcomp>  s    ///qw{///r1   c              3      K   | ]?}t          |                    d                     |                    d          z
  dz
  V  @dS )0.rM   N)r>   rstripr  rq  s     r/   	<genexpr>z7TimeValueAxis.timeLabelTextFormatter.<locals>.<genexpr>  sH      LL1C..qwws||;A=LLLLLLr1   rM   z%%.%dfsc                     || |z  z  S r)   r*   r,   rn  fmts      r/   r0   z6TimeValueAxis.timeLabelTextFormatter.<locals>.<lambda>  s    sad| r1   r  r  c                 :    g | ]}|t          |          z
  z  S r*   rN   )r;   rQ   fms     r/   r<   z8TimeValueAxis.timeLabelTextFormatter.<locals>.<listcomp>  s'    666a1s1vv:r/666r1   hrc  r   z%%d%s%%d%%sc           	      |    |t          | |z            t          | |z  t          | |z            z
  |z            fz  S r)   rN   )r,   rn  r{  ry  s       r/   r0   z6TimeValueAxis.timeLabelTextFormatter.<locals>.<lambda>  sL    PSWZ[\]_[_W`W`adfghjfjmpqrsuqumvmvfvxzeza{a{V|P| r1   z%%.%df%sc                     || |z  z  S r)   r*   rx  s      r/   r0   z6TimeValueAxis.timeLabelTextFormatter.<locals>.<lambda>  s    qQSt r1   )
rk  tuplera   r_  rz  rh  rR   rJ   rg  rj  )rZ   valr  r   ry  r   r   stvstvlfvs1r{  rn  s              @@r/   r^  z$TimeValueAxis.timeLabelTextFormatter  s   KuT%&&'$$$&q)CCqB1111 0111B
1Ar{{ U#%???//B///LLLLLLLa44&(Y-=KKKCC  !$({{B66662666Br{{ U$%txKKSSQ[[ccc*,28N|||*,tAh1FTTT&)D #s3xxr1   N)	rq   rr   rs   rj  ri  rg  r\   rv  r^  r*   r1   r/   r\  r\    sX        
C
S&C
S&C" " "
- - -2    r1   r\  c                       e Zd Zd ZdS )XTimeValueAxisc                 Z    t          j        | g|R i | t          j        | g|R i | d S r)   )r  r\   r\  r`  s      r/   r\   zXTimeValueAxis.__init__  sJ    D.$......t1T111D11111r1   Nrq   rr   rs   r\   r*   r1   r/   r  r    s#        2 2 2 2 2r1   r  c                       e Zd ZdZ ee eed           eed           eed           e e	ee
f          d           eed                    Zd	 Zd
 ZdS )AdjYValueAxiszA 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.r$  rF  rH  z8Skip/Keep lowest tick label when true/false.
Or skiplistzadd this to the labels)r&  leftAxisPercentleftAxisOrigShiftIPCleftAxisOrigShiftMinleftAxisSkipLL0labelVOffsetc                     t          j        | fi | d| _        d| _        d| _        d| _        dx| _        | _        d | _        d S )Nr  rM   g333333?r  r   )	rS  r\   rM  r  r  r  r  r  r9  r+  s     r/   r\   zAdjYValueAxis.__init__  sV    D&&2&&& $(!$&!344t0r1   c           	         ddl m}m} | j        | j        }}| j        }t          t          |fdg d                    }|s|g}| j        | j	        }}|r||z
  |k     r |||||          dd         \  }	}
|
|	z
  |k     r^|	|
z   dz  }t          ||dz  z
  |          }	t          ||dz  z   |          }
|d	k    r|	d	k     r|
d	z   |	z
  }
d	}	n|dk    r|	dk     r|
|	z
  }
d}	|	|
c| _        | _         || j        | j        d
|| j        || j                  \  }}| j        }|r|d
         |d         z
  }t          |          s||z  x}}n||d         z  }||d
         z  }t!          | d|d                   }t!          | d|d                   }||d         z
  |k     r| j        |z
  | _        |d         |z
  |k     r| j        |z   | _         || j        | j        d
|| j        || j                  \  }}|d         | _        |d         | _        || _        | j        || _        n| j        | _        t)          | j        d	z
            dk     ra|                                  | j        | j        }}t          | j        | j        z  ||z
  | j        z  | j        z            }| j        |z
  | _        | j        r;t          | j                  r | j        D ]}	 d||<   	# t6          $ r Y w xY wd|d<   dS dS )z$Adjusts the value range of the axis.r   )find_good_gridr,  c                     | |k    S r)   r*   )r,   rc  s     r/   r0   z,AdjYValueAxis._rangeAdjust.<locals>.<lambda>  s
    ad r1   )r   r  r  rP     	   )r  gridNr=  r)  rr  rM   )r  r  percentr  r  r`  ra  r  rq  r  )reportlab.graphics.charts.utilsr  r,  rY  rZ  r2  r4   r=   r8  rM  rF   rJ   r  r  r:  r&   r   ra   r3  rv  r   rv  r  rw  r  r   r  r   )rZ   r  r,  y_miny_maxrc  r  r8  rM  r   rd  ymr+   r   r  r  r  _nrk   vMaxvMinr,   s                         r/   rx  zAdjYValueAxis._rangeAdjust  s    	JIIIIIII~t~u1***===99::qc!#'>43E=	 	4UU]]::#^E51)DDDRaRHFBBw&&eS[M#--e44M#--e44#::"S&&cBBBBAXX"Q$$bBB-/*DNDNuT^T^14K_en  ~B  ~O  P  P  P1! 	TA$qt)B:: S& RRAYAYl1Q400Bl1R511BAaDy2~~0Ct~uRx"}}t~/Bdn5qAtOcir  BF  BS  T  T  TDAq12'$%D!!$($8D!t~c!""4''!!!$DD-do=$Y 99$,FH HA!^a/DN 	T)** -  A!!%   AaDDD	 	s   K
K! K!N)rq   rr   rs   rt   r-  rS  r.  r   r   r   r   r/  r\   rx  r*   r1   r/   r  r    s         
 wj&,y7deee+|H;_```+|H;UVVV&,xx?0K'L'L  TO  P  P  P#|H3KLLL
 
 
H  = = = = =r1   r  c                   &    e Zd Zd Zd Zd Zd ZdS )LogValueAxisc                     | j         t          t          | j                  t          | j                  z
            z  | _        | j        S r  )r   rz  
math_log10rZ  rY  r  rw  s    r/   rW  zLogValueAxis._calcScaleFactorG  sG    
 !L5t~&&DN)C)CC,E ,E E  r1   c                    | j         }| j        }t          || j        d| j                  }t          || j        d| j                  }||}||}||k    rt          d| j        j        |fz            |dk    rt          | j        j	        d|d          | j
        }|rt          |          }t          |          }t          |          s||f}|d         pd}	|d         pd}
| j        |	|
z   z
  }||z
  t          |          z  }||	|z  z  }||
|z  z  }t          |d|z            }t!          |d|z            }|| _        || _        d S )Nr   )rA   z7%s: valueMin=%r should not be greater than valueMax=%r!z: valueMin=z! negative values are not allowed!rM   r  )r6  r7  rH   r   rA   rK   r  r   _LogValueAxis__name__valueMinrq   r=  r  r&   r   rz  rF   rJ   rY  rZ  )rZ   rU  r6  r7  aMinaMaxr  lMinlMaxa0a1r   r  s                r/   rS  zLogValueAxis._setRangeQ  s   ==
4?1tG]^^^
4?1tG]^^^XXHVZ^ZhZy  |D  ZE  E  F  F  FQ;;SWSaSjSjSjkskskstuuu" 	.d##Dd##D::-S#XsQ1BQ1BR(At)U1XX%BBrEMDBrEMD8BH--H8BH--H!!r1   c                 h   t          | j                  x}}t          | j                  x}}| j        }|r@|dv rt	          |          }||k     r|dz   n|}|dv rt	          |          }||k    r|dz
  n|}g j        }t	          |          }||k     r|dz  }t	          |          |z
  dz   }	t          t	          |	| j        z            d          }||	z  | j        k    r|dz  }|| _        	 ||k    rn||k    r |d|z             ||z  }!||k    r
d|z  | _        ||k    r
d|z  | _        |j	        S )Nrp  rM   ro  Tr  )
r  rY  rZ  r?  rO   r  rJ   r2  	_powerIncr  )
rZ   r6  r}  r7  r~  rb  r   r+   r   r  s
             r/   r  zLogValueAxis._calcTickPositionsl  sp   $T^4444$T^4444_ 	7'''MM%&xZZAEEQ%%%MM%&xZZAEEQI]]h;;aMMB"Ad''((++Q3t   !q&!	({{E8||QQr2vYYY!GB	 T>>BL4>T>>BL4>zr1   c                    t          | d          s|                                  | j        }t          | d          sAg j        }t	          | j                  }t	          | j                  dz   }t          |          }| j        }|dk    r|dt          | j
                  z  }d}| j
        dk    rd}||k     rOt          || j
                  D ].}	||	z  d|z  z  }
|
| j        k    r|
| j        k     r ||
           /||z  }||k     Onkt          | j
        dz   |dz
            }|r||z  dk    r||z  }n	|dz  }|d}t          |          }	 d|z  }
|
| j        k    rn|
|vr ||
           ||z  }&|j        | _        | j        | _        |S )Nra   r  rM   r  r=  r   )rg   rh   ra   r  r  rY  rZ  roundr  rz  r   r   rF   r  r  )rZ   r   r+   r6  r7  r   r   facr{   r  rQ   ngs               r/   r   zLogValueAxis._calcSubTicks  s   tM** 	%""$$$t,--  	-	A!$.11H!$.11!3HxBA!tt5111?b((!%8mm"599 ! !E2r6Nt~--!dn2D2DAaDDD!GB 8mm *1Q3// B{{R!GB	   A8__BADN**E||!!GB #$*D.
r1   N)rq   rr   rs   rW  rS  r  r   r*   r1   r/   r  r  E  sP        ! ! !" " "6  8& & & & &r1   r  c                       e Zd Zd ZdS )LogAxisTickLabellerc                     t          |          }t          |dk     r|dz
  n|dz             }|dk    rdS |dk    rdS d|z  S )Nr   MbP?1rM   10z10<sup>%s</sup>)r  rO   )rZ   rm   r  r6   s       r/   ro   zLogAxisTickLabeller.__call__  sU    u1Q33%AeG,,a44a44 1$$r1   N)rq   rr   rs   ro   r*   r1   r/   r  r    s#        % % % % %r1   r  c                       e Zd ZdZd ZdS )LogAxisTickLabellerSzZsimple log axis labeller tries to use integers
    and short forms else exponential formatc                     t          |          }t          |dk     r|dz
  n|dz             }|dk    rdS |dk    rd|dz  z   ndd|z    dz  z   dz   }d|z  }t          |          t          |          k     r|n|S )Nr   r  r  rs  z0.rM   z%.0e)r  rO   r>   )rZ   rm   r  r6   pr   ses          r/   ro   zLogAxisTickLabellerS.__call__  s    u1Q33%AeG,,a441C#II$!A#s
"3C"7e^WWSVV^^rr*r1   Nr+  r*   r1   r/   r  r    s-        / /+ + + + +r1   r  c                       e Zd Zd ZdS )LogAxisLabellingSetupc                 >   t           t          t                    | _        | j        dk    r%d| j        _        d| j        _        d| j        _        n$d| j        _        d| j        _        d| j        _        t                      | _	        d S t                      | _	        d S )NrM   r6   r  r   r  )r"   r   r!   rK  r   r  r  r  r  r3  r  rw  s    r/   r\   zLogAxisLabellingSetup.__init__  s    )1&99DK!!(+%!#!"(+%!"!##6#8#8D   #7#9#9D   r1   Nr  r*   r1   r/   r  r    s#        : : : : :r1   r  c                   2    e Zd Z ee          Zd Zd ZdS )LogXValueAxisr&  c                 n    t                               |            t                              |            d S r)   )r  r\   r  rw  s    r/   r\   zLogXValueAxis.__init__  0    D!!!&&t,,,,,r1   c                     d}| j         s
J |            |d}|dk    r$| j        | j        t          | j                  z  z
  S | j        | j        t          |          t          | j                  z
  z  z   S 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  Nr   rh  )rO  rk   r  r  rY  rZ   r  msgs      r/   ri   zLogXValueAxis.scale       B$$$$$=EB;;7T.DN1K1KKKKw*j.?.?*T^B\B\.\]]]r1   N)rq   rr   rs   r-  r  r/  r\   ri   r*   r1   r/   r  r    sI        wJ'''H- - -^ ^ ^ ^ ^r1   r  c                   2    e Zd Z ee          Zd Zd ZdS )LogYValueAxisr  c                 n    t                               |            t                              |            d S r)   )rS  r\   r  rw  s    r/   r\   zLogYValueAxis.__init__  r  r1   c                     d}| j         s
J |            |d}|dk    r$| j        | j        t          | j                  z  z
  S | j        | j        t          |          t          | j                  z
  z  z   S r  )rO  rl   r  r  rY  r  s      r/   ri   zLogYValueAxis.scale  r  r1   N)rq   rr   rs   r-  rS  r/  r\   ri   r*   r1   r/   r  r    sI        wJ'''H- - -^ ^ ^ ^ ^r1   r  r   )W__version__rt   mathr   r  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&   rC   rH   rK   rR   rT   rv   r   r   r   r#  r1  r  r  r  r  r  r  r)  r  r.  r  r  r  r  r  rQ  r4  r  rS  r\  r  r  r  r  r  r  r  r  r*   r1   r/   <module>r     si   	< % $ $ $ $ $G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G $ # # # $ $ $ $ $ $ } } } } } } } } } } } } } } } } } } } } I I I I I I I I ] ] ] ] ] ] ] ] ] ] ] ] ; ; ; ; ; ; 7 7 7 7 7 7 & & & & & & % % % % % %
G 
G 
G 
Ga a a ab b b b  " " " " " " " "<E E E E E E E ENC C C C C C C CJ7 7 7 7 7 7 7 7$j j j j jV j j jX    h   B6 B6 B6 B6 B66 B6 B6 B6He e ee e e; ; ; ; ; ; ; ;z    g   ,o o o o oGL o o obo o o o oGL o o ob0 0 0 0 0 0 0 0 /. W	1 W	1 W	1 W	1 W	1 W	1 W	1 W	1rI I I I I I I Ij T
S
S;;;      Y   * /.00 
Yz z z z z: z z zxI I I I I I I IV> > > > > > > >D2 2 2 2 2]: 2 2 2
T T T T TJ T T Tli i i i i9 i i iX% % % % %, % % %	+ 	+ 	+ 	+ 	+< 	+ 	+ 	+: : : : : : : : ^ ^ ^ ^ ^L!6z ^ ^ ^0^ ^ ^ ^ ^L!6z ^ ^ ^ ^ ^r1   