
     hxe                       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 dLdZ1dLdZ2dLd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 dG          ZS G dH dIeQeSeE          ZT G dJ dKeQeSeM          ZUdS )Mz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                 d   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          ||                               S )Nr   c                      || ||          S N )Txspecialfuncs       Z/var/www/html/Sam_Eipo/venv/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-   r7   s         r/   _findMinMaxValuerA   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.4Sa[[!!"""r1   c                 4    t          | ||t          |          S )zfind minimum over V[i][x]r-   )rA   minr?   r,   r@   r-   s       r/   _findMinrF   =       AaG<<<<r1   c                 4    t          | ||t          |          S )zfind maximum over V[i][x]rC   )rA   maxrE   s       r/   _findMaxrJ   A   rG   r1   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/   _allIntrQ   E   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selfrP   kwdss      r/   __init__zAxisLabelAnnotation.__init__W       


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>a   s    a r1   r,   yr*   )rW   copypopr   hasattr_pseudo_configurescalerV   isYAxis_x_y)rY   axisrZ   r^   r_   svr,   rc   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[   rn   r*   r1   r/   rS   rS   N   s<           " " " " "r1   rS   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)   rU   rX   s      r/   r[   zAxisLineAnnotation.__init__y   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getGridDimsrn   r   rL   hilodrawAtLimitc                     | S r)   r*   rb   s    r/   r0   z-AxisLineAnnotation.__call__.<locals>.<lambda>   s    1 r1   parentr`   c                     S r)   r*   )r,   ds    r/   r0   z-AxisLineAnnotation.__call__.<locals>.<lambda>   s    q r1   )rW   rd   re   ri   rj   rk   getattrrf   _lengthrD   rI   _get_line_posrV   _getLineFuncrg   itemssetattr)rY   rl   rZ   r_   rx   ry   offsd0sr6   dimr~   r   r   oaglprP   r.   Lkr   s                      @r/   rn   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 Nro   r*   r1   r/   ru   ru   l   s<           4 4 4 4 4r1   ru   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)   )_colorsrW   )rY   colorsrZ   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 )Nrz   r{   r|   r}   rn   r   rL   r`   )	fillColorstrokeColor)r,   rc   widthheight)r   rW   rd   ri   rj   rk   re   r   rf   rg   r   r>   r   range
isinstancer%   r   __dict__r   r$   add)rY   rl   r   rZ   ri   r   r   r   r6   r   tvGncolorsv0iv1crc   r,   r   r   rr   s                          r/   rn   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   Nro   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>)re   r   r+   )rY   r+   rZ   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rY   tr   r,   rP   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)rp   rq   rr   rs   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   )rh   )rY   rP   s     r/   r   z_AxisG._get_line_pos  s4    JJqMM	!AA	Ds     $c                 p    |                      |          }t          || j        |z   || j        |z             S r)   )r   r   rk   )rY   r,   rz   r{   s       r/   _cxLinez_AxisG._cxLine  s5    q!!Atw47S=999r1   c                 p    |                      |          }t          | j        |z   || j        |z   |          S r)   )r   r   rj   )rY   rc   rz   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 NrL   )strokeLineJoin)r   rk   rD   rI   r   )	rY   r,   rz   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   rj   rD   rI   r   )	rY   rc   rz   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*   )rP   r   r6   r7   r   r   s         r/   r0   z%_AxisG._getLineFunc.<locals>.<lambda>0  s     aaPQRSTU]ckqNrNrNr r1   c                      || ||          S r)   r*   )rP   r   r6   r7   s       r/   r0   z%_AxisG._getLineFunc.<locals>.<lambda>3  s    !!Aa(( r1   )r   ri   r   r   r   r   )rY   rz   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 )Nr`   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   rf   rg   ri   r`   r   strokeWidthstrokeDashArrayr   strokeLineCapstrokeMiterLimitr   r   r   )rY   grz   r{   r   r   r   r   r   r   r   r   specialsr.   exfr   r   arP   s              `       r/   
_makeLinesz_AxisG._makeLines5  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   Nrn   rL   _gridSpecials)r   r   r   )r   )gridStrokeColorgridStrokeWidthvisibleGrid	gridStartgridEndrf   ri   rj   rk   r   gridStrokeDashArraygridStrokeLineJoingridStrokeLineCapgridStrokeMiterLimitr   _makeSubGrid)
rY   r   r   r   r   r   wr   r6   r   s
             r/   makeGridz_AxisG.makeGridK  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   Nrn   rL   )r   r   )r   
subTickNumsubGridStrokeColorsubGridStrokeWidthsubGridStart
subGridEndrf   ri   rj   rk   _calcSubTicksr   subGridStrokeDashArraysubGridStrokeLineJoinsubGridStrokeLineCapsubGridStrokeMiterLimitr`   )rY   r   r   r   r   r   r   r   r6   r   otvs              r/   r   z_AxisG._makeSubGrida  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)   )rj   rk   ri   r   )rY   rz   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
_dataIndexrL   Tr   Y   AdjYr   	__class__rp   rY   acns     r/   ri   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   )rY   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__)rY   r	  DrP   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)rY   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)rp   rq   rr   r   r   r   r   r   r   r   r   r   r}   ri   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rY   kws     r/   r[   zCALabel.__init__  sE    $$$$$$" 	 	 	 	 	 	r1   N)	rp   rq   rr   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.rL   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lowrl   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 )Nr0  z(Abstract Class CategoryAxis Instantiated2   d   r   rL   Fr   r   r   r   r         ?rl   rS  )+r   rp   rj   rk   r   	_catCountr  r2  r4  r6  r   rH  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"  rJ  rL  r|   rN  joinAxisModerV  rP  rR  _labelTextFormatr[  r`  ra  rc  re  rY   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)   floatrj   rk   r   rY   r,   rc   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 )NrL   rY  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   )rI   r4   r5   r>   rs  r   r`  ra  ry  	_barWidth_calcTickmarkPositionsrV  r   _pmv)rY   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>2  s    888!#888r1   rL   )rs  r[  r   r`   rP  r4   )rY   ns     r/   r  z#CategoryAxis._calcTickmarkPositions/  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 NrL   )rP  rs  rY   idxs     r/   _scalezCategoryAxis._scale9  s      <s(:1(<#
r1   c                 :    |                      |          | j        fS )z/Returns the position and width in drawing unitsloScaler  r  s     r/   rh   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.midScaleA  s     ||C  3t~#555r1   r*   r)   )rp   rq   rr   rs   _nodocr,  r-  r   r   r	   r   r
   r   r   r   r.  r[   r|  r  r  r  rh   r  r*   r1   r/   r0  r0    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   r0  c                 B    | j         sJ d| j        j        z              d S )Nz/Cannot connect to other axes (%s), but Y- ones.)ri   r   rp   rl   s    r/   _assertYAxisr  E  (    <ddJT^Md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   rp   r  s    r/   _assertXAxisr  G  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   rv  s    r/   actualTickStrokeWidthz_XTicks.actualTickStrokeWidthM      t-d.>???r1   c                 .    t          | d| j                  S )Nr^  )r   r   rv  s    r/   actualTickStrokeColorz_XTicks.actualTickStrokeColorQ  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 )Nrm  )	r   r  _tickTweaksr   r  r   r   r   r   )rY   tUtDr   itdsWtWs          r/   _drawTicksInnerz_XTicks._drawTicksInnerU  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   r4  r  )rY   r  r  r   s       r/   
_drawTicksz_XTicks._drawTicksc  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   rL   )r   r   r   _subTickingr  r`   )rY   r  r  r   r   s        r/   _drawSubTicksz_XTicks._drawSubTicksi  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tickAxisModerl   	subTickHir   	subTickLo)rk   _labelAxisPosr   r  tickUptickDownr  )rY   yoldr   s      r/   r  z_XTicks.makeTickss  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 NrX  rW  )r|   rV  rk   r   rY   moderl   s      r/   r  z_XTicks._labelAxisPos}  M    } 	.-4-Du}}ww--wr1   r)   )rp   rq   rr   r  r   r  r  r  r  r  r  r  r*   r1   r/   r  r  J  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|   rV  rj   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  )rj   r  r   r  	tickRighttickLeftr  )rY   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)   )rp   rq   rr   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.rk  ri  valuepointsNIMode used for connecting axis ('bottom', 'top', 'value', 'points', None).)r%  r  r  rt  r   c                     t                               |            d| j        _        d| j        _        d| _        d| _        d S )Nr  r      )r0  r[   rJ  	boxAnchordyr  r  rv  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  (   rp  )OneTwoThreeFourFiver  r6   r   Z      rq  r|  r  rL  rJ  r  angler   r   rY   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.rk  ri  r  r  Nr  rk   r   rh   rY   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rk  ri  r  r  r  r  r  r|   rt  r  rN  rY   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)rj   r`  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  r2  r   rj   rc  rk   r   re  r   r   r   r   rY   r   rl   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 NrY  rL   r    )r   r6  rL  rs  r>   rP  r  r  rj   rV  r  r   rJ  r  r&  	setOriginsetTextr   )rY   r   rL  catCountr  rP  r  rk   rj   pmvr   iclabel_dyrP   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   rk  Nrp   rq   rr   rs   r,  r0  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  rt  rL   c                     t                               |            d| j        _        d| j        _        d| _        d| _        d S )Nr6   r  r  r   )r0  r[   rJ  r  dxr  r  rv  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 )Nrp  r  P   )r  r  r  )r  r  r  r6   r   r<  r  r  rq  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  rj   r   rh   rY   xAxisr  r  s       r/   r  zYCategoryAxis.joinToAxis2  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)rk   r  r  r  s     r/   r  zYCategoryAxis.loScaleH  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  r2  r   rj   rk   rc  r   re  r   r   r   r   r  s      r/   r  zYCategoryAxis.makeAxisL  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   r6  rL  rs  r>   rP  r  rJ  r  rk   rV  r  r   r&  r  r  r  r   )rY   r   rL  r  r  rP  r  rJ  rj   rk   r  r   r  r  r
  rc   _dxrP   s                     r/   r  zYCategoryAxis.makeTickLabelsY  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*   )rY   rl   r  s      r/   rn   zTickLabeller.__call__  s    //r1   N)rp   rq   rr   rs   rn   r*   r1   r/   r(  r(    s-         0 0 0 0 0r1   r(  c                     d| z  S )Nz%.12gr*   rb   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          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  r1  r2  r3  r6  r7  r4  r5  r   r8  r   r9  r   r:  r   r;  r   r   rL   r<  r=  r   r>  r   r?  r   r@  r   rA  r   rB  r   rC  r   rD  r   rE  r   rF  r   rG  rH  rI  minimumTickSpacingz)Minimum value for distance between ticks.maximumTickszMaximum number of ticks.rJ  NrK  rV  rW  rX  rl   rZ  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
rangeRoundrh  rj  ceilingfloorzHow to round the axis limits
zrangePrefz!Zero range axis limit preference.rR  normalrT  rU  zHow values are plotted!skipEndLrz   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 ticksrP  rQ  r  rb  rc  rd  re  rf  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 truerg  ri  rk  rl  requiredRangezMinimum required value range.rm  rn  c                 v   | j         j        dk    s
J d             | j        dOi |  | j        dOi 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 d| j        _        d S )PNr,  z%Abstract Class ValueAxis Instantiated_configuredr   rj   rp  rk   r   rq  r  rL   r2  r6  r4  r   r-  r   r   r   r   r   r   r   rr  r   r   r   r   r   r   r   rH  Fr   r  r   r  r  r   r   r   r   r   r   r   r   rJ  rJ  r/  r  r0     ru  rV  rl   r1  r2  r3  r4  r5  r6  r8  r;  r<  r=  rh  r@  rR  rA  rB  rC  rE  rG  r  rP  rc  re  rK  r*   )r   rp   r)  r   r   r   rJ  r  r*  s     r/   r[   zValueAxis.__init__  sv   ~&3335\333B Q	 Q	 Q	&'aQ	
  RQ	  RQ	 #&#Q	 #$!Q	 '(aQ	 )*Q	 ()qQ	 '(aQ	 %&AQ	" '(a#Q	$ '5]&C&C%Q	& +99J*K*K'Q	( +99I*J*J)Q	* )7(G(G+Q	, ,::L+M+M-Q	. +/$/Q	0 +9*G*G1Q	2 /==N.O.O3Q	4 /==M.N.N5Q	6 -;?,K,K7Q	8 0>>P/Q/Q9Q	: %)D;Q	< #'$=Q	> (-u?Q	@ *+AQ	B +,!CQ	D &'QEQ	F %&AGQ	H %&AIQ	J 1??O0P0PKQ	L 0>o/N/NMQ	N 3AAS2T2TOQ	P .2TQQ	R .<M-J-JSQ	T 2@@Q1R1RUQ	V (,tWQ	X &*TYQ	Z "9!?!?!?[Q	\ 01q]Q	b .0RcQ	d ()qeQ	l ,04mQ	n )/oQ	p +/$qQ	r /3dsQ	t *.uQ	~ $(4Q	@ $(4AQ	B %)DCQ	D *.EQ	F +/$GQ	H +0%IQ	J &,VKQ	L &'QMQ	N !)OQ	P "(QQ	R (,tSQ	T (,tUQ	V 15WQ	X (.vYQ	Z *+[Q	\  !q]Q	^  !q_Q	` '(aaQ	 Q	d r1   c                 ~    t          |          | _        t          |          | _        t          |          | _        d S r)   rx  rz  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)rY   
dataSeriess     r/   r  zValueAxis.configure1  s.     	z"""r1   c                 d    |                                   |                                  d| _        d S r  )r  _calcScaleFactorrM  rv  s    r/   rR  zValueAxis._configure_endA  s4    ##%%%r1   c                     	 ||f}||         }n9#  || _         || _        |                                 \  }}|||dz  fx}||<   Y nxY w|S )Nr   )	_valueMin	_valueMax_calcStepAndTickPositions)rY   r4  r5  cacheKr   r6  r+   s           r/   _getValueStepAndTickszValueAxis._getValueStepAndTicksF  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(  rq  )rK  rD   rI   
_cValueMin
_cValueMax)rY   r4  r5  rrr   mr   y2s           r/   _preRangeAdjustzValueAxis._preRangeAdjustQ  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          x}| _        |t          || j        d          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|
          x}| _        |t          || j        d|
          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   r@  g{Gz?g{Gz333333?        _bubblePlotr<  rr  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	bubbleMaxrP   s         r/   r-   z$ValueAxis._setRange.<locals>.special  so    &!AA! & & &!#AAA&AiK#--tAaDL1g666s    ""rC   r.  r  r7  r<  Frh  rj  r?  rj  r>  r  rL   r  ư>) r4  r5  rF   r   r^  rJ   r_  r   ry  _bubbleV
_bubbleMaxr   _bubbleRadiusrc  r=  r-  rD   r   r8  r&   r;  r\  rI   _computedValueSteprW  rX  rC  rE  rG  _calcValueStep
_valueStep_rangeAdjust)'rY   rS  oMinr4  oMaxr5  zrprl  fracrk  r-   r=  cMincMaxr-  abfdo_rrdo_abfabfizrrnrrxabSdo_absaLgorZ  iterr6  r+   fuzzi0i1sfrP   urC  rE  rG  ra  s'                                          r/   rQ  zValueAxis._setRangee  st    -'x-'x(:do^_:`:``X(:do^_:`:``Xx{{<DL!$|A66C1uu#&#$Q#$#&#'#(]*$HH#HHA::"8|H"HH"H"8|H4d++ 	qhz!A6677ID(8+,G#DM'DO!%dl!2D)09 7 7 7 7 |(:do^_ho:p:p:ppX|(:do^_ho:p:p:ppX!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)r4  rW  r5  rX  rf   r  rR  rv  s    r/   rg   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*   rv  s    r/   rv  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*   rv  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   ry  rX  rW  _scaleFactorrv  s    r/   rU  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 )Nrs  r   rm  rL   rn  c                     g | ]}|z  S r*   r*   )r;   r   r6  s     r/   r<   z7ValueAxis._calcStepAndTickPositions.<locals>.<listcomp>9  s    >>>!!I+>>>r1   )
r   rs  ru  rt  rW  rX  r=  rN   ry  r   )	rY   r4  r5  r  r=  r  rP   r  r6  s	           @r/   rY  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  )rY  rv  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 )Nr`   r  r  r  r   r   c                     | S r)   r*   rb   s    r/   r0   z)ValueAxis._calcSubTicks.<locals>.<lambda>I  s     r1   c                 4    g | ]}t          |d d          |S )_doSubTicksrL   )r   )r;   r   s     r/   r<   z+ValueAxis._calcSubTicks.<locals>.<listcomp>K  s)    CCC"wr-'B'BC2CCCr1   r<  rL      r  )rf   rg   r`   r   rp   rN   r  r   r>   r  rI   rW  rX  insertry  	enumerater   r  )rY   r   r  iFuzzdCnvOTVr+   nstr   dstr  vnvxr,   jr   s                   r/   r   zValueAxis._calcSubTicks>  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.r7  N)r   r`   r  r  rv  s    r/   r  z ValueAxis._calcTickmarkPositionsh  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.NrL   )
r6  rX  rW  rD   ry  r0  r   r/  r#   ru  )rY   rawRangerawIntervals      r/   rt  zValueAxis._calcValueStepp  so    >!~6H"St/@/B)C)CU4<EXEXY]YpEp%r%rrK-k::DOOO"nDOOOr1   c                 *    t          | j                  S r)   )rQ   r`   rv  s    r/   _allIntTickszValueAxis._allIntTicksy  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
calcPlacesrL   rh  rz   r{   r   ro  r  rn   zInvalid labelTextFormat %s)r  )%r   r6  ru  r1  r  _defaultLabelFormatterstrrf   r  r`   r2  r3  rj   rk   r   r  rJ  rB  r  r   r>   r  r  rh   r   r   r&   r(  
ValueErrorr  r  rJ  
XValueAxis	getBoundscloner  r   )rY   r   r7   postsclr  r   rJ  sknticksnticks1r   tickr  rP   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   )rM  rj   rk   r   r  rP  r   rW  )rY   r  orgr  s       r/   rh   zValueAxis.scale  sy     TT!TTT=!% w 1  	 B4<CR/000r1   r*   )$rp   rq   rr   rs   r,  r-  r   r   r
   r   r	   r   r   r   r   r   r.  r[   r|  r  rR  r\  rc  rQ  rg   rv  r  rU  rY  r  r   r  rt  r  r  rh   r*   r1   r/   r,  r,    s       ..w E
 E
 E
 L9UU6]]*C!D!DKjkkkkE
,y/PQQQQE
 #l93PQQQQE
 %Y5TUUUU	E

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

8\]abfg@h@h@h0i'j'j  rS  T  T  T  TEE
F ',xx	1B1B::i`aefjkClClCl0m'n'n  vE  F  F  F  FGE
H  <fVIg F FGefffIE
J "\.7Z[[[[KE
L UU8ImDDE^___ME
N  <fWU6 B BIdeeeeOE
P $|N9]^^^^QE
R $|N9STTTTSE
T !-^B[ \ \ \ \UE
V $|EE&v$>$>EkllllWE
X (<	8]^^^^YE
Z #l4-BCCCC[E
\ h-YZZZZ]E
^ h-VWWWW_E
` "\(1RSSSSaE
b !L0GHHHHcE
d !L0FGGGGeE
f ',y7YZZZZgE
h &i6WXXXXiE
j *\(9OPPPPkE
l *\->TUUUUmE
n "..CJk!l!l!l!loE
p  ,|EE!AaLL>hiiiiqE
r !-UU1Qq\\?j k k k ksE
t #/,x=h"i"i"i"iuE
v $|N9^____wE
x "\.7Z[[[[yE
z ',x6TUUUU{E
| *\(9[\\\\}E
~ *\->`aaaaE
@ ',};YZZZZAE
B  ,|I<}~~~~CE
D  <fU6( C CDmnnnEE
F %^:YZZZZGE
H %%5<abbbbIE
HNU U Un% % %     
 >@ 	 	 	 	! ! !(` ` `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  NrM  rk  ri  r  r  r  rO  )r%  r  r  r|   rt  rN  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[   rJ  r  r  r  r  r  r|   rt  rN  r*  s     r/   r[   zXValueAxis.__init__  sb    4%%"%%% # r1   c                     |                      ddd           |                     dg           t          dd          }|                    |            |S )Nr  rp     r  r  rq  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  rk  r  ri  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 )Nrk  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  rp   rq   rr   rs   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.
    -rL   )splitrN   lower_monthsindex_maxDays)dmstrdstrmstrddmms        r/   parseDayAndMonthr  8  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  )rY   r,   answerelementr  r  s         r/   testz_isListOfDaysAndMonths.testK  sX    88 		F # ##-g66FB#"FFFM5s   *0c                     |S r)   r*   )rY   r,   s     r/   	normalizez _isListOfDaysAndMonths.normalizeW  s    r1   N)rp   rq   rr   rs   r  r  r*   r1   r/   r  r  F  s<         
 
 
    r1   r  )rL   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   rN  r9  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 datesrh  ri  rj  rk  rl  )r%  bottomAxisLabelSlack	niceMonthforceEndDateforceFirstDateforceDatesEachYearxLabelFormatdayOfWeekName	monthName	dailyFreqspecifiedTickDatesspecialTickClearrg  c                     t          j        | fi | d| _        d| _        d| _        d| _        g | _        d| _        d| _        g d| _	        g d| _
        d| _        d x| _        | _        d S )Nri  rL   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  r7  r  r*  s     r/   r[   zNormalDateXValueAxis.__init__z  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  )rY   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  )rY   rP   r   ra  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  rY   s    r/   	formatterz4NormalDateXValueAxis._xAxisTicker.<locals>.formatter  s    **4555r1   r   r  
re  rL   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#  ticksrJ  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(  r4  r5  rJ  fontNamefontSizeleading
textAnchorr  r  r   r  r   rI   r   r/  r  r0  r  r  ry  r  r  r  r4   r5   r  yearr   NDr  r  r>   _NDINTMr  monthr  r   r  )#rY   r)  
axisLength	firstDateendDaterJ  r,  r-  r.  r/  r  r  RBLxLabelWxLabelHr   Wr*  r0  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   )rY   datar&  r  r   r,   rc   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  r3  r  rA  )	rY   r)  xEOMpmpxr,   ra  stepsrJ  s	            r/   _getStepsAndLabelsz'NormalDateXValueAxis._getStepsAndLabels3  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  rL   )rD  setr   r4   sortr  rJ  r4  r5  rW  rX  r`   ru  r   ry  r  rM  )
rY   rC  r)  r,   dvr&  rI  rJ  r4  r5  s
             r/   r  zNormalDateXValueAxis.configureE  s#    	! 	!A ! !		"Q%    !U

..u55f!]DM( ( 0588bbll ( 0599bbll)18&  & L5H1D+E+EE r1   )rp   rq   rr   rs   r,  r  r-  r   r   isListOfDaysAndMonthsr   r   r   r   r
   r.  r   r1  r  r[   r  r   rA  rD  rJ  r  r*   r1   r/   r  r  ^  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  NrM  r  r  rO  )r%  r  r  r|   rt  rN  rL   c                     t                               |            d| j        _        d| j        _        d| j        _        d| _        d| _        d | _        d | _	        d | _
        d S )Nr6   r  r   r  )r,  r[   rJ  r  r  r  r  r  r|   rt  rN  rv  s    r/   r[   zYValueAxis.__init__m  s]    4    # r1   c                     dg}|                      ddd           |                     |           t          dd          }|                    |            |S )N)r  r  r  *   rq  r  r  r  r  )rY   rC  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/   rQ  rQ  Z  s       NwI<02 2 2 L13 3 3<*, , ,#|EE*T$U$U\^ ^ ^"l>=? ? ?
 
 
H J       
  
  
  
 D D D
 
 
 
 
r1   rQ  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)   )r1  timeLabelTextFormatter_saved_tickInforY   argsrZ   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  NrL   dayshoursminutesseconds)r6  rX  rW  rD   ry  r0  r   r/  _dc_unit_hc_mc_unitdrN   r#   ru  )rY   r  r  r   s       r/   rt  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;   rP   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,   rl  r   s      r/   r0   z6TimeValueAxis.timeLabelTextFormatter.<locals>.<lambda>  s    H"Qx,? r1   c                     g | ]}d |z  S )z%.10fr*   r;   rP   s     r/   r<   z8TimeValueAxis.timeLabelTextFormatter.<locals>.<listcomp>  s    ///qw{///r1   c              3      K   | ]?}t          |                    d                     |                    d          z
  dz
  V  @dS )0.rL   N)r>   rstripr  ro  s     r/   	<genexpr>z7TimeValueAxis.timeLabelTextFormatter.<locals>.<genexpr>  sH      LL1C..qwws||;A=LLLLLLr1   rL   z%%.%dfsc                     || |z  z  S r)   r*   r,   rl  fmts      r/   r0   z6TimeValueAxis.timeLabelTextFormatter.<locals>.<lambda>  s    sad| r1   r  r  c                 :    g | ]}|t          |          z
  z  S r*   rM   )r;   rP   fms     r/   r<   z8TimeValueAxis.timeLabelTextFormatter.<locals>.<listcomp>  s'    666a1s1vv:r/666r1   hra  r   z%%d%s%%d%%sc           	      |    |t          | |z            t          | |z  t          | |z            z
  |z            fz  S r)   rM   )r,   rl  ry  rw  s       r/   r0   z6TimeValueAxis.timeLabelTextFormatter.<locals>.<lambda>  sL    PSWZ[\]_[_W`W`adfghjfjmpqrsuqumvmvfvxzeza{a{V|P| r1   z%%.%df%sc                     || |z  z  S r)   r*   rv  s      r/   r0   z6TimeValueAxis.timeLabelTextFormatter.<locals>.<lambda>  s    qQSt r1   )
ri  tupler`   r]  ry  rf  rQ   rI   re  rh  )rY   valr  r   rw  r   r   stvstvlfvs1ry  rl  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)	rp   rq   rr   rh  rg  re  r[   rt  r\  r*   r1   r/   rZ  rZ    sX        
C
S&C
S&C" " "
- - -2    r1   rZ  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[   rZ  r^  s      r/   r[   zXTimeValueAxis.__init__  sJ    D.$......t1T111D11111r1   Nrp   rq   rr   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#  rD  rF  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  rL   g333333?r  r   )	rQ  r[   rK  r  r  r  r  r  r7  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,   ra  s     r/   r0   z,AdjYValueAxis._rangeAdjust.<locals>.<lambda>	  s
    ad r1   )r   r  r  rN     	   )r  gridNr<  r(  rq  rL   )r  r  percentr  r  r^  r_  r  ro  r  )reportlab.graphics.charts.utilsr  r*  rW  rX  r0  r4   r=   r6  rK  rD   rI   r  r  r8  r&   r   r`   r1  ru  r   rt  r  ru  r  r   r  r   )rY   r  r*  y_miny_maxra  r  r6  rK  r   rb  ymr+   r   r}  r  r  _nrj   vMaxvMinr,   s                         r/   rv  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)rp   rq   rr   rs   r,  rQ  r-  r   r   r   r   r.  r[   rv  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   ry  
math_log10rX  rW  r  rv  s    r/   rU  zLogValueAxis._calcScaleFactorD  sG    
 !L5t~&&DN)C)CC,E ,E E  r1   c                 j   | j         }| j        }t          || j        d          }t	          || j        d          }||}||}||k    rt          d| j        j        |fz            |dk    rt          d|z            | 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   z7%s: valueMin=%r should not be greater than valueMax=%r!z0%s: valueMin=%r negative values are not allowed!rL   r  )r4  r5  rF   r   rJ   r  r   _LogValueAxis__name__valueMinr;  r  r&   r   ry  rD   rI   rW  rX  )rY   rS  r4  r5  aMinaMaxr  lMinlMaxa0a1r   r  s                r/   rQ  zLogValueAxis._setRangeN  sv   ==
4?155
4?155XXHVZ^ZhZy  |D  ZE  E  F  F  FQ;;ORZZ[[[" 	.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 )Nrn  rL   rm  Tr  )
r  rW  rX  r=  rN   r  rI   r0  	_powerIncr  )
rY   r4  r{  r5  r|  r`  r   r+   r   r  s
             r/   r  zLogValueAxis._calcTickPositionsi  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 )Nr`   r  rL   r  r<  r   )rf   rg   r`   r  r  rW  rX  roundr  ry  r   r   rD   r  r  )rY   r   r+   r4  r5  r   r   facrz   r  rP   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)rp   rq   rr   rU  rQ  r  r   r*   r1   r/   r  r  B  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   gMbP?1rL   10z10<sup>%s</sup>)r  rN   )rY   rl   r  r6   s       r/   rn   zLogAxisTickLabeller.__call__  sU    u1Q33%AeG,,a44a44 1$$r1   N)rp   rq   rr   rn   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 d| _	        d S )NrL   r6   r  r   r  z%.0e)
r"   r   r!   rJ  r   r  r  r  r  r1  rv  s    r/   r[   zLogAxisLabellingSetup.__init__  s    )1&99DK!!(+%!#!"(+%!"!##6#8#8D   #)D   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  rv  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   rf  )rM  rj   r  r  rW  rY   r  msgs      r/   rh   zLogXValueAxis.scale       B$$$$=EB;;7T.DN1K1KKKKw*j.?.?*T^B\B\.\]]]r1   N)rp   rq   rr   r,  r  r.  r[   rh   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)   )rQ  r[   r  rv  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  )rM  rk   r  r  rW  r  s      r/   rh   zLogYValueAxis.scale  r  r1   N)rp   rq   rr   r,  rQ  r.  r[   rh   r*   r1   r/   r  r    sI        wJ'''H- - -^ ^ ^ ^ ^r1   r  r)   )V__version__rs   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&   rA   rF   rJ   rQ   rS   ru   r   r   r   r"  r0  r  r  r  r  r  r  r(  r  r,  r  r  r  r  r  rO  r2  r  rQ  rZ  r  r  r  r  r  r  r  r*   r1   r/   <module>r     s3   	< % $ $ $ $ $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 & & & & & & % % % % % %	# 	# 	# 	#= = = == = = =  " " " " " " " "<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 /. U	1 U	1 U	1 U	1 U	1 U	1 U	1 U	1n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   