o
    à’Oj© ã                   @   sö  d Z dZddlZddlZddlm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 ddlmZmZ ddlmZmZ dd	lmZmZ dd
lmZ ddl m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 G dd„ de"ƒZ8G dd„ de3ƒZ9G dd„ de9ƒZ:G dd„ de9ƒZ;G dd„ dƒZ<G dd„ de9ƒZ=G dd„ de=e:ƒZ>G d d!„ d!e=e;ƒZ?d"d#„ Z@d$d%„ ZAd&d'„ ZBd(d)„ ZCd*d+„ ZDd,d-„ ZEd.d/„ ZFd0d1„ ZGd2d3„ ZHd4d5„ ZId6d7„ ZJd8d9„ ZKg d:¢ZLd;d<„ ZMd=d>„ ZNd?d@„ ZOdAdB„ ZPdCdD„ ZQdEdF„ ZRdGdH„ ZSdIdJ„ ZTdKdL„ ZUdMdN„ ZVdOdP„ ZWdQdR„ ZXdSdT„ ZYdUdV„ ZZdWdX„ Z[dYdZ„ Z\d[d\„ Z]d]d^„ Z^g d:¢ZLd_d`„ Z_dadb„ Z`dcdd„ Zadedf„ Zbdgdh„ Zcdidj„ Zddkdl„ Zedmdn„ ZfG dodp„ dpe(ƒZgdS )qz3.3.0z™This module defines a variety of Bar Chart components.

The basic flavors are stacked and side-by-side, available in horizontal and
vertical versions. 

é    N)Úliteral_eval)Úcolors)ÚisNumberÚisNumberOrNoneÚisColorOrNoneÚisStringÚ
SequenceOfÚ	isBooleanÚisStringOrNoneÚNoneOrÚisListOfNumbersOrNoneÚEitherOrÚOneOfÚisInt)ÚisStrÚyieldNoneSplits)ÚuSymbol2SymbolÚisSymbol)ÚAttrMapÚAttrMapValue)ÚstringWidth)ÚTypedPropertyCollectionÚ
PropHolderÚ
tpcGetItem)ÚLineÚRectÚGroupÚDrawingÚPolyLine)ÚXCategoryAxisÚ
YValueAxisÚYCategoryAxisÚ
XValueAxis)ÚBarChartLabelÚNoneOrInstanceOfNA_Label)ÚPlotArea)Ú_objStr©Úcmpc                   @   s‚   e Zd Zeeedd�eedd�eedd�eedd�edddd	�eed
d�ee	e
ƒddd	�eedd�ee	eƒdd�d�	Zdd„ ZdS )ÚBarChartPropertieszColor of the bar border.©ÚdesczColor of the bar interior area.zWidth of the bar border.zDash array of a line.Nz,A widget to be used instead of a normal bar.é   ©r+   ÚadvancedUsagez0Text to be associated with a bar (eg seriesname)z!None or makeMarker('Diamond') ...z(minimum width/height that will be drawn.z%if this bar should be drawn as a line)	ÚstrokeColorÚ	fillColorÚstrokeWidthÚstrokeDashArrayÚsymbolÚnameÚswatchMarkerÚminDimenÚisLinec                 C   s$   d | _ tj| _d| _d | _d | _d S )Nç      à?)r/   r   Úbluer0   r1   r3   r2   ©Úself© r<   úi/var/www/html/pharmsmart-cdr-gen/venv/lib/python3.10/site-packages/reportlab/graphics/charts/barcharts.pyÚ__init__,   s
   
zBarChartProperties.__init__)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r   r	   Ú_attrMapr>   r<   r<   r<   r=   r)      s    





÷r)   c                   @   sF  e Zd ZdZedgi de“deeeee	e
fƒfƒddd�“dee
dd	�“d
ee
dd	�“dee
dd	�“deddd	�“deddd	�“deddd	�“deddd	�“deddd	�“deddd	�“dedddd�“deddd	�“deed dd�“d!eed"dd�“d#edd$d	�“d%ee
d&d	�“d'eed(d)d*ƒd+d	�“d,edd-dd�“d.eed/d	�“d0eed1dd�“d2eeeed3d3dd4�d3ddd4�d5ƒ“ŽZd6d7„ Zdhd8d9„Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ ZdBdC„ ZdDdE„ ZdFdG„ ZdHdI„ ZdJdK„ ZdLdM„ ZdNdO„ ZdidQdR„ZdjdSdT„ZdUdV„ Z dWdX„ Z!dYdZ„ Z"d[d\„ Z#d]d^„ Z$d_d`„ Z%dadb„ Z&dcdd„ Z'dedf„ Z(dS )kÚBarChartz(Abstract base class, unusable by itself.ÚBASEÚuseAbsolutezrFlag to use absolute spacing values; use string of gsb for finer control
(g=groupSpacing,s=barSpacing,b=barWidth).r,   r-   ÚbarWidthzThe width of an individual bar.r*   ÚgroupSpacingzWidth between groups of bars.Ú
barSpacingzWidth between individual bars.ÚbarsNzHandle of the individual bars.Ú	valueAxiszHandle of the value axis.ÚcategoryAxiszHandle of the category axis.Údataz/Data to be plotted, list of (lists of) numbers.Ú	barLabelsz!Handle to the list of bar labels.ÚbarLabelFormatzZFormatting string or function used for bar labels. Can be a list or list of lists of such.ÚbarLabelCallOutz`Callout function(label)
label._callOutInfo = (self,g,rowNo,colNo,x,y,width,height,x00,y00,x0,y0)ÚbarLabelArrayzGexplicit array of bar label values, must match size of data if present.ÚreversePlotOrderz,If true, reverse common category plot order.ÚnaLabelzLabel to use for N/A values.Úannotationsz<list of callables, will be called with self, xscale, yscale.ÚcategoryLabelBarSizez=width to leave for a category label to go between categories.ÚcategoryLabelBarOrderÚfirstÚlastÚautoz,where any label bar should appear first/lastÚ	barRecordzJcallable(bar,label=labelText,value=value,**kwds) to record bar informationÚzIndexOverridesa!  None (the default ie use old z ordering scheme) or a ',' separated list of key=value (int/float) for new zIndex ordering. If used defaults are
    background=0,
    categoryAxis=1,
    valueAxis=2,
    bars=3,
    barLabels=4,
    categoryAxisGrid=5,
    valueAxisGrid=6,
    annotations=7ÚcategoryNALabelz'Label to use for a group of N/A values.ÚseriesOrderr   )ÚemptyOKÚNoneOKÚloz#dynamic 'mixed' category style casec              
   C   sn  | j }|t|ƒ }|| }t|dt|dd ƒƒ}	t|dt|dd ƒƒ}
t|dt|dd ƒƒ}t|dt|dd ƒƒ}t|dt|dd ƒƒ}|rPt|||d  ||d  |
ƒS t|ddƒr«||d  }t|d	ƒre|j}nt|d	ƒrn|j}nd }t|||| ||jp||j|j	|j
d
�}|r”t|||d  ||jp’|jƒ}|r§|r§tƒ }| |¡ | |¡ |S |pª|S t||||||	||
d�S )Nr/   r0   r2   r1   r5   ç       @r7   Fr3   ©r/   r1   r2   )r1   r/   r2   r0   )rI   ÚlenÚgetattrr   Úhasattrr3   r   r/   r0   r1   r2   r   Úaddr   )r;   ÚrowNoÚxÚyÚwidthÚheightÚ	baseStyleÚstyleIdxÚstyler/   r0   r2   r1   r5   Úyh2ÚSÚLÚgr<   r<   r=   ÚmakeSwatchSampleW   s@   


ý"

ÿzBarChart.makeSwatchSamplec                 C   s   t t| j| d|ƒƒS )zreturn series name i or defaultr4   )r&   rc   rI   )r;   ÚiÚdefaultr<   r<   r=   ÚgetSeriesNamez   s   zBarChart.getSeriesNamec                 C   s&  | j jdvsJ d| j j ƒ‚| jrtƒ | _tƒ | _ntƒ | _tƒ | _t	ddddƒ| jj
d _t | ¡ d| _d| _d	d
g| _d| _d| _d| _d| _ttƒ| _d| j_d| j_d | _d | _d| j_ttƒ| _d| j_tj | j_!d | j_"tj#| jd _$tj%| jd _$tj&| jd _$d  | _'| _(d | _)d S )N)rC   Ú
BarChart3DzAbstract Class %s InstantiatedÚstackedÚparallelÚparallel_3dÚmixedrm   r   )éd   én   éx   é‚   )éF   éP   éU   éZ   é
   é   ÚcÚmiddler,   é   )*Ú	__class__r?   Ú_flipXYr!   rK   r"   rJ   r   r    r   rB   Úvalidater%   r>   rH   rQ   rL   rE   rF   rG   r   r#   rM   Ú	boxAnchorÚ
textAnchorrN   rP   Únudger)   rI   r1   r   Úblackr/   r2   Úredr0   Úgreenr9   rR   r[   rZ   r:   r<   r<   r=   r>   ~   s@   

ÿ	



zBarChart.__init__c                 C   s4   | j jdkr
tdƒ‚tddƒ}|   ¡ }| |¡ |S )zShows basic use of a bar chartrC   z#Abstract Class BarChart has no demoéÈ   r{   )rˆ   r?   ÚNotImplementedErrorr   re   )r;   ÚdrawingÚbcr<   r<   r=   Údemo»   s   

zBarChart.democ                    sð   t | dd ƒ}t| jƒ‰|sdd„ tˆƒD ƒ}n\| j‰ ttˆƒƒ}tƒ }g }|D ]/}‡fdd„|D ƒ}‡ fdd„|D ƒ}|rI||8 }||O }||8 }|rV| t|ƒ¡ ||8 }q'|re| dd„ t	|ƒD ƒ¡ |rs| d	d„ t	|ƒD ƒ¡ || _
d S )
Nr\   c                 S   s   g | ]}|f‘qS r<   r<   ©Ú.0Ússr<   r<   r=   Ú
<listcomp>È   s    z+BarChart.getSeriesOrder.<locals>.<listcomp>c                    s(   h | ]}d |  krˆ krn n|’qS )r   r<   r–   )Únr<   r=   Ú	<setcomp>Ï   s   ( z*BarChart.getSeriesOrder.<locals>.<setcomp>c                    s   h | ]}ˆ   |d d¡r|’qS )r7   F)Ú	checkAttrr–   ©rI   r<   r=   r›   Ð   s    c                 s   ó   � | ]}|fV  qd S ©Nr<   r–   r<   r<   r=   Ú	<genexpr>Ù   ó   € z*BarChart.getSeriesOrder.<locals>.<genexpr>c                 s   rž   rŸ   r<   r–   r<   r<   r=   r    Û   r¡   )rc   rb   rL   ÚrangerI   ÚsetÚappendÚtupleÚextendÚsortedÚ_seriesOrder)r;   ÚbsÚRÚunseenÚlinesÚsrq   Úglr<   )rI   rš   r=   ÚgetSeriesOrderÄ   s0   
€
zBarChart.getSeriesOrderc                    s‚   | j j}| j‰ttttˆƒƒƒ}ˆ‰ |dvr<g ‰‡fdd„}|dkr'|ˆ Ž  n|  ¡  | jD ]}|‡ fdd„|D ƒŽ  q.ˆ| _	d S )N©rx   ry   c                     sŠ   t dd„ | D ƒƒdg }|d d … }| D ]$}t|ƒD ]\}}|p!d}|dkr/||  |7  < q||  |7  < qqˆ  |¡ ˆ  |¡ d S )Nc                 s   s   � | ]}t |ƒV  qd S rŸ   )rb   )r—   Údr<   r<   r=   r    ç   ó   € zBBarChart._getConfigureData.<locals>._accumulate.<locals>.<genexpr>r   ç�íµ ÷Æ°¾)ÚmaxÚ	enumerater¤   )ÚDÚpdataÚndatar±   rs   Úv)rL   r<   r=   Ú_accumulateæ   s   û
z/BarChart._getConfigureData.<locals>._accumulaterw   c                 3   s   � | ]}ˆ | V  qd S rŸ   r<   )r—   Új©Ú_datar<   r=   r    ÷   r²   z-BarChart._getConfigureData.<locals>.<genexpr>)
rK   rm   rL   r´   ÚlistÚmaprb   r¯   r¨   Ú_configureData)r;   ÚcAStyleÚccrº   Úbr<   )r½   rL   r=   Ú_getConfigureDataÞ   s   


zBarChart._getConfigureDatac                 C   s&   |   ¡  | j | j¡ | jj| jjfS )z Attempt to return the data range)rÄ   rJ   Ú	_setRangerÀ   Ú	_valueMinÚ	_valueMaxr:   r<   r<   r=   Ú
_getMinMaxú   s   zBarChart._getMinMaxc                 C   sX   | j }| | j| j|¡ |  ¡  | | j¡ | d¡}|js(||kr*||| kr*|S |S )z8Position and configure value axis, return crossing valuer   )	rJ   ÚsetPositionrg   rh   rÄ   Ú	configurerÀ   ÚscaleÚ	forceZero)r;   ÚorgÚlengthÚvAÚ	crossesAtr<   r<   r=   Ú
_drawBegin   s   
"zBarChart._drawBeginc                    sR  | j }| j}| | j¡ |  ¡  tƒ }t| ddƒ}|sƒ| |  ¡ ¡ t|ddƒ}t|ddƒ}|s9|j	|| |j
d� |sD|j	|| |j
d� | |  ¡ ¡ | |¡ | |¡ |r`|j	|| |j
d� |rk|j	|| |j
d� t| ddƒD ]}| || |j|jƒ¡ qq| `|S tdd	d
dddddd�‰ | ¡  d¡D ]w}| ¡ }|sŸq–z	| d¡\}	}
W n   td||d ‡ fdd„tˆ  ¡ ƒD ƒ¡f ƒ‚|	ˆ vrÞtd|	ˆ d ‡ fdd„tˆ  ¡ ƒD ƒ¡f ƒ‚zt|
ƒ}
t|
ttfƒsìJ ‚W n   td|
||d ‡ fdd„tˆ  ¡ ƒD ƒ¡f ƒ‚|
ˆ |	< q–dd„ ˆ  ¡ D ƒ‰ ˆ  ¡  |  ¡ }|j d¡}ˆ D ]}\}
}	|	dk�r9| |  ¡ ¡ �q'|	dk�rE| |¡ �q'|	dk�rU|j	|| |j
d� �q'|	d k�ra| |¡ �q'|	d!k�rq|j	|| |j
d� �q'|	d"k�r}| |¡ �q'|	d#k�r‰| |¡ �q'|	dk�r£t| ddƒD ]}| || |j|jƒ¡ �q”�q'| `|S )$z"finalize the drawing of a barchartrZ   NÚdrawGridLastF)ÚparentÚdimrS   r<   r   r,   r‡   é   é   r„   é   é   )Ú
backgroundrK   rJ   rI   rM   ÚcategoryAxisGridÚvalueAxisGridrS   ú,ú=z?Badly formatted zIndex clause %r in %r
allowed variables are
%sÚ
c                    ó   g | ]
}d |ˆ | f ‘qS ©z%s=%rr<   ©r—   Úk©ÚZr<   r=   r™   1  ó    z(BarChart._drawFinish.<locals>.<listcomp>z9Unknown zIndex variable %r in %r
allowed variables are
%sc                    rß   rà   r<   rá   rã   r<   r=   r™   3  rå   zCBad zIndex value %r in clause %r of zIndex
allowed variables are
%sc                    rß   rà   r<   rá   rã   r<   r=   r™   8  rå   c                 S   s   g | ]\}}||f‘qS r<   r<   )r—   râ   r¹   r<   r<   r=   r™   :  s    éÿÿÿÿrÙ   rK   rÚ   rJ   rÛ   rI   rM   )rK   rJ   rÊ   rÀ   ÚcalcBarPositionsr   rc   re   ÚmakeBackgroundÚmakeGridÚgetGridDimsÚmakeBarsrË   ÚdictÚstripÚsplitÚ
ValueErrorÚjoinr§   Úkeysr   Ú
isinstanceÚfloatÚintÚitemsÚsortÚcontentsÚpop)r;   ÚcArÏ   rq   ÚzIndexÚcAdglÚvAdglÚaÚzrâ   r¹   rÃ   Úblr<   rã   r=   Ú_drawFinish  sŠ   

(1Ðø
..0








*€zBarChart._drawFinishc           %         sÆ  | j ‰ˆr	| j‰
n| j‰
| j}|j‰| j}t|ƒ }| _tt	t
t|ƒƒƒ | _}| j}| j}| j}t| ddƒ}t| ddƒ}	|	dkrGˆrEdpFd}	|	dk}	|j‰| j‰t‡fdd„t|ƒD ƒƒ}
||
 }ˆd	kr”| j}t|ƒ|
 }|| }|d
 | }|d
kr‚|}|}nd }}|| dg ‰ˆdd… ‰n*ˆdv r©d
}|| }|d
 | }|}|}n|}|dg ‰ˆdd… ‰|}d } }}|| |  | _‰| j‰ˆrétˆtƒsÔd‰ndd
dˆv   ddˆv   ddˆv   ‰nd‰tˆdƒd
 ƒ}|| }ˆdk�r|ˆ  | _ } }}nˆdk�rd } }}|j‰ npˆd
k�r)d}|| ||   }}n^ˆdk�r;d}|| ||   }}nLˆdk�rRd }}|�rO|| | | nd}n5ˆdk�rdd}|| ||   }}n#ˆdk�rvd }}|| | | }nˆdk�r‡d
 }}|| | | }|| _|| _|| _| j}|j‰|j ‰|j!|j"}}|d  k�r¬|k�r³n nˆdƒ‰nd|k �r½ˆ|ƒ‰n	|dk �rÆˆ|ƒ‰ˆ| _#|| ‰d| | }|| ||  }|�r|	�rî||d  | }||7 }n|||  ||  |d  | }||j$_%g | _&| j&j'}| j(}‡ ‡‡‡‡‡‡‡‡	‡
‡‡‡‡‡‡‡fdd„}ˆd	k�rxd} t)|ƒD ]H\}!‰g ‰|�r<|d
 |! n|!‰|ˆ|  ‰ˆ *|!dd¡‰	ˆ	�r]| d
7 } ||d
 | d  ‰nˆ| | 8 ‰t|ƒD ]}"||"|"ƒ �qg|ˆƒ �q-dS d} t)| jƒD ]a\}#}$t|$ƒd
k�rŒdnd‰|$D ]N}!|�r›|d
 |# n|#‰|ˆ|  ‰g ‰||! ‰ˆ *|!dd¡‰	ˆ	�rÂ| d
7 } ||d
 | d  ‰nˆ| | 8 ‰t|ƒD ]}"||"|"| |# ƒ �qÌ|ˆƒ �q��qdS )z©Works out where they go. default vertical.

        Sets an attribute _barPositions which is a list of
        lists of (x, y, width, height) matching the data.
        rT   r   rU   rX   rW   rV   c                 3   s"   � | ]}t ˆ  |d d¡ƒV  qdS )r7   FN)rô   rœ   ©r—   Ú_r�   r<   r=   r    o  s   €  z,BarChart.calcBarPositions.<locals>.<genexpr>rz   r,   Nr°   rØ   rÃ   r‡   rq   rÖ   r­   ç      ð?rÕ   r„   r×   r8   g      @c                    s>  ˆdkrˆˆ | ƒ ˆ ˆ	 }n
ˆ| ƒ\}}|ˆ }ˆ
|  }|d u r&d }ˆ}nfˆdvrpˆsp|dkrPˆˆ| ƒ}ˆr=|ˆk rCn|ˆkrCˆ}ˆ|  |7  < ˆ| }n"ˆˆ| ƒ}ˆr]|ˆkrcn|ˆk rcˆ}ˆ|  |7  < ˆ| }nˆ}ˆ|ƒ| }d|  k r‚dkrŒn nd}|dk rŒd}ˆ  ˆr–|||ˆfp›||ˆ|f¡ d S )NrØ   r°   r³   ç:Œ0âŽyE¾ç:Œ0âŽyE>)r¤   )ÚcolNoÚaccxrg   rq   r  Údatumrj   rh   )Ú_cscaleÚaccumNegÚaccumPosÚbarRowÚbaseLineÚcScaleÚflipXYÚ
groupWidthr7   rÍ   Úrowrm   rE   ÚvARDÚvScaleri   ÚxValr<   r=   Ú_addBarÐ  s0   

&z*BarChart.calcBarPositions.<locals>._addBarr7   Frx   rw   )+r‰   rh   rg   rK   rË   rL   rb   Ú_seriesCountr´   r¾   r¿   Ú
_rowLengthrG   rH   rF   rc   rm   rI   Úsumr¢   r¨   Ú_groupWidthrE   rò   Ústrró   Ú_normFactorÚ_scaleÚ_normFactorBÚ_normFactorGÚ_normFactorSrJ   ÚreverseDirectionrÆ   rÇ   Ú	_baseLineÚlabelsÚlabelPosFracÚ_barPositionsr¤   rQ   rµ   rœ   )%r;   rù   rL   ÚseriesCountÚ	rowLengthÚwGrH   rF   ÚclbsÚclboÚ	lineCountÚseriesMLineCountr˜   ÚbarsPerGroupÚwBÚwSÚbGapBÚbGapSÚaW0ÚaWÚfBÚfGÚfSrÏ   ÚvmÚvMÚoffsÚbGapÚlbpfÚaBPrQ   r  ÚlineSeenrf   r  ÚsbÚsgr<   )r	  r
  r  r  rI   r  r  r  r  r7   rÍ   r  rm   rE   r  r  ri   r  r=   rç   S  s  

*












 ,
 ôóþzBarChart.calcBarPositionsc                 C   sª   | j }t|ttfƒr|| }t|ttfƒr|| }|du r!d}|S |dkr.| j| | }|S t|ƒr=|| j| |  }|S t|dƒrM|| j| | ƒ}|S d| }t|ƒ‚)zreturn formatted label textNÚvaluesÚ__call__z6Unknown formatter type %s, expected string or function)	rN   rò   r¾   r¥   rP   r   rL   rd   Ú	Exception)r;   rf   r  ÚlabelFmtÚ	labelTextÚmsgr<   r<   r=   Ú_getLabelText  s&   
÷ù
ûþzBarChart._getLabelTextc                 C   sâ   |j }t|ddƒ}|dk}|r| }| }	}
|rd}
|d|  }|dkr&dp'd| }|dkr5||d  }n4|d	krL|
dkrD||
 | }n%|| }|	 }	n|d
krc|
dkr[||
 | }n|| }|	 }	n||
 | }|	|_|||	fS )zCompute x, y for a labelÚ	boxTargetÚnormalÚantir   r8   r,   ræ   ÚmidÚhir_   )r�   rc   Ú_pmv)r;   Úlabelrg   rh   ri   rj   r�   ÚbtrH  ÚpmÚvaluerý   rÃ   r<   r<   r=   Ú_labelXY&  s.   

zBarChart._labelXYc           	      C   s<   |   ||¡}|r|  || j||f |||||||¡	 d S d S rŸ   )rE  Ú	_addLabelrM   )	r;   rq   rf   r  rg   rh   ri   rj   Útextr<   r<   r=   Ú_addBarLabelC  s   (ÿzBarChart._addBarLabelFc
                 C   sv   |	d u r| j }	|	r7|	jr9t |	¡}	| jjdkrdpd}
|d u r!|
}|d u r'|
}| j|	j|	||||||||d�
S d S d S )Nr   r  r  )ÚcalcOnly)rR   rR  ÚcopyrJ   rÇ   rQ  )r;   rq   rf   r  rg   rh   ri   rj   rT  Únar¹   r<   r<   r=   Ú_addNABarLabelH  s   

 ûzBarChart._addNABarLabelc                 C   sÈ  |j ràt||j|jƒ}| j}|r|  ||||	|¡\}}}n|  |||||	¡\}}}t|dd ƒ}|d urF| | |¡}||}}|rC|}n|}n|rQ|}||	d  }n||d  }|}t|dd ƒ}|d urp| | |¡}|rn|}n|}|dk r†|r~d|j }d}nd|j	 }d}nd }}|
r”|| || fS | 
|| || ¡ | |¡ |j|j}}|r¼|r¼| dt||||||d�¡ | |¡ t| dd ƒ}|râ| |||||||	||||f|_||ƒ |`d S d S d S )NÚfixedEndr`   Ú
fixedStartr   éþÿÿÿ)r/   r1   rO   )Úvisibler   ÚfontNameÚfontSizer‰   rP  rc   Ú	_getValueÚdxÚdyÚ	setOriginÚsetTextÚlineStrokeColorÚlineStrokeWidthÚinsertr   re   Ú_callOutInfo)r;   rR  rL  rq   rf   r  rg   rh   ri   rj   rT  Ú
labelWidthr  Úy0Úx0rN  rX  r¹   Úx00Úy00rY  r_  r`  ÚsCÚsWÚalxr<   r<   r=   rQ  Q  sX   



$
Ï.zBarChart._addLabelc           	      C   sB   t ||||ƒ}|j|_|j|_|j|_|jr|j|_| |¡ d S rŸ   )r   r1   r0   r/   r2   re   )	r;   rq   rg   rh   ri   rj   rf   rm   Úrr<   r<   r=   Ú_makeBar…  s   zBarChart._makeBarc           "      C   s  | j }t| dd ƒ}| j}| j}| j}i }|r?g }	t| jƒd }
t|ƒD ]\}}t|ƒD ]\}\}}}}d ||fvr=d||< q+q#g j}g j}t|ƒD �]ª\}}t|ƒ}|| }|| }| 	|dd¡}g j}t|ƒD �]m\}\}}}}||f|v r}|||f p~|}d ||fv rð|r‹||v r—|  
|||||||¡ nR|ré||	vré|  
|||||||d|¡	}|rä||
 | \}}}}|  
||
|||||d|¡	}|d |d  d }|d |d  d }| j
||
|||dd|d	� |	 |¡ |rï|d ƒ qhd }t|d
ƒrþt |j¡}nt| j d
ƒ�r	| j j}t|dd ƒ}|�r<|�r)|dk �r"t|j |ƒ}nt|j|ƒ}n|dk �r6t|j |ƒ}nt|j|ƒ}|�ry|�sM|| }||d  }n
|| }||d  }||ƒ ||ƒ |�rxtt||ƒ|||j�po|jƒ} | �rx|| ƒ nR|�rŽ||_||_||_||_| |¡ n=t|ƒdk�rËt|ƒdk�rË|jd u�s¨|jd u�rË|  |||||||¡ |�rË||jd |  ||¡| j| | ||d� |  |||||||¡ qht |j!ƒD ]}|�rò|t"||j�pê|j|j#|j$d�ƒ �qÜqI|j!D ]}!| |!¡ �qø|j!D ]} | | ¡ �qd S )NrY   r,   r7   FTr   r`   g-Cëâ6?)rV  r3   r6   r8   gH¯¼šò×z>ræ   )rL  rO  rf   r  ra   )%rI   rc   r$  r‰   r[   rb   rL   rµ   r¤   rœ   rW  rd   rU  Údeepcopyr3   Úminr6   r´   r   r   r/   r0   rg   rh   ri   rj   re   Úabsrp  r÷   rE  rS  r   Ú__self__r   r1   r2   )"r;   rq   ÚlgrI   ÚbrÚBPr  ÚcatNALÚcatNNAÚCBLÚrowNoLrf   r  r  rg   rh   ri   rj   r¬   ÚlineSymsÚ
styleCountrl   ÚrowStyler7   ÚlinePtsrm   Úr0Úr1r3   r6   ÚyLÚxLÚsymÚplr<   r<   r=   Ú	_makeBarsŽ  s²   €þ



€40ý€þ

ÿzBarChart._makeBarsc	                 C   sB  |j rŸt||j|jƒ}	| j}
|
r|  |||||¡\}}}n|  |||||¡\}}}t|dd ƒ}|d urF| | |¡}||}}|
rC|}n|}n|
rQ|}||d  }n||d  }|}t|dd ƒ}|d urp| | |¡}|
rn|}n|}|dk r†|
r~d|j }d}nd|j	 }d}nd }}| 
|| || ¡ | |¡ || ¡ fS d S )NrX  r`   rY  r   rZ  )r[  r   r\  r]  r‰   rP  rc   r^  r_  r`  ra  rb  Ú	getBounds)r;   rR  rL  rf   r  rg   rh   ri   rj   rg  r  rh  ri  rN  rX  r¹   rj  rk  rY  r_  r`  r<   r<   r=   Ú_computeLabelPositionó  sF   



×zBarChart._computeLabelPositionc                 C   s~   | j | j}}|r||_|r||_| jr$| |  | j| j¡| j| j	¡ n| | j|  | j| j	¡| j¡ | 
| j¡ |  ¡  dS )zRInformation function, can be called by charts which want to with space around barsN)rK   rJ   ÚjoinAxisr‰   rÉ   rÑ   rg   ri   rh   rj   rÊ   rÀ   rç   ©r;   rù   rÏ   r<   r<   r=   Ú_computeBarPositions  s   

 zBarChart._computeBarPositionsc              
   C   s.  | j }|  ¡  t| jƒ}| j}g }|j}|rS| j}|| j }	| j| j	 }
|D ]+}|D ]&\}}}}|| }|| }|t
||ƒt||ƒt
||ƒ| |	t||ƒ fƒ q*q&n<| j}|| j	 }	| j| j }
|D ]+}|D ]&\}}}}|| }|| }|t
||ƒt||ƒt
||ƒ| |	t||ƒ fƒ qgqc| ¡  |d g}|D ]@}|d }|d |d k rÕ|d |d k rÕt
|d |d ƒt|d |d ƒt
|d |d ƒt
|d |d ƒf|d< qš| |¡ qš|}d}d}t|ƒ}t|ƒD ]©\}}|d }|| }||
krþ ||fS |}d }}||k �r6|| d |k�r6t
|| d |ƒ}t
|| d |ƒ}|d7 }||k �r6|| d |k�s||k�rg||k�rf|}|�rQ|||| || df�p[|||| || df}||k�rf ||fS qé||k�r’|}|�r}|	| ||	|| df�p‡||	| || |	df}||k�r’ ||fS qé||fS )	ak  helper for madmen who want to put stuff inside their barcharts
        basically after _computebarPositions we slide a line of length size
        down the bar profile on either side of the bars to find the
        maximum space. If the space at any point is >= required then we're
        done. Otherwise we return the largest space location and amount.
        r   ræ   r,   r‡   rÕ   i  €Niÿÿÿ)r‰   r‹  rb   rL   r$  r¤   rg   ri   rh   rj   rr  r´   rö   rµ   )r;   ÚsizeÚrequiredr  ÚlenDatarw  ÚCÚaCr_   rJ  ÚendÚbprg   rh   ÚwÚhr¹   rþ   rª   r…   ro  ÚmaxSÚmaxPÚnCrs   ÚciÚv0Úv1r»   ÚaloÚahir<   r<   r=   Ú_computeMaxSpace+  s~   

2ýÿ
2ý
 J
ñý

4€
ü4€ zBarChart._computeMaxSpacec                 C   sŠ  | j | j}}|r||_|r||_| jr$| |  | j| j¡| j| j	¡ n| | j|  | j| j	¡| j¡ | 
| j¡ |  ¡  | j}g j}| j}t|ƒD ]w\}}g j}t|ƒD ]f\}	\}
}}}d||fv r›| j}|r–|jr–t |¡}| jjdkrxdpyd}|du r€|}|du r†|}||  |j|||	|
|||¡ƒ qU|dƒ qU|  ||	¡}|r·||  || j||	f ||	|
|||¡ƒ qU|dƒ qU||jƒ qJ|jS )zLInformation function, can be called by charts which want to mess with labelsNr   r  r  )rK   rJ   r‰  r‰   rÉ   rÑ   rg   ri   rh   rj   rÊ   rÀ   rç   rI   r¤   r$  rµ   rR   rR  rU  rÇ   rˆ  rE  rM   rt  )r;   rù   rÏ   rI   rª   rw  rf   r  r�  r  rg   rh   ri   rj   rV  r¹   rR  r<   r<   r=   Ú_computeSimpleBarLabelPositionsk  s:   

 

 
(
z(BarChart._computeSimpleBarLabelPositionsc                 C   s&   t ƒ }t ƒ }|  ||¡ | |¡ |S rŸ   )r   r†  re   )r;   rq   ru  r<   r<   r=   rë   �  s
   
zBarChart.makeBarsc                 C   s^   | j j}| j}t|ƒ}tttt|ƒƒƒ}|dkr%|d | j || j  }n| j}|| j	|  S )z:for dynamically computing the desired category axis lengthrx   r,   )
rK   rm   rL   rb   r´   r¾   r¿   rH   rF   rG   )r;   rm   rL   rš   Úmr  r<   r<   r=   Ú_desiredCategoryAxisLength—  s   z#BarChart._desiredCategoryAxisLengthc                 C   st   | j | j}}|r||_|r||_| jr'| |  | j| j¡| j| j	¡ |  
¡ S | | j|  | j| j	¡| j¡ |  
¡ S rŸ   )rK   rJ   r‰  r‰   rÉ   rÑ   rg   ri   rh   rj   r   rŠ  r<   r<   r=   Údraw£  s   

ÿzBarChart.drawr<   rŸ   )FN)F))r?   r@   rA   Ú__doc__r   r%   r   r   r	   r   r   r$   r   r
   r   r   rB   rr   ru   r>   r•   r¯   rÄ   rÈ   rÑ   r   rç   rE  rP  rS  rW  rQ  rp  r†  rˆ  r‹  r�  rž  rë   r   r¡  r<   r<   r<   r=   rC   4   sŒ    ÿþýüûúùø	÷
öõôóòñðïîíä"ã 
#=	H @

	4	e,@%rC   c                   @   ó   e Zd ZdZdZdS )ÚVerticalBarChartz3Vertical bar chart with multiple side-by-side bars.r   N©r?   r@   rA   r¢  r‰   r<   r<   r<   r=   r¤  ­  ó    r¤  c                   @   r£  )ÚHorizontalBarChartz5Horizontal bar chart with multiple side-by-side bars.r,   Nr¥  r<   r<   r<   r=   r§  ±  r¦  r§  c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )Ú
_FakeGroupNc                 C   s   g | _ t |¡| _d S rŸ   )r½   Ú	functoolsÚ
cmp_to_keyÚ_key)r;   r(   r<   r<   r=   r>   ¶  s   z_FakeGroup.__init__c                 C   s   | j  |¡ d S rŸ   )r½   r¤   )r;   Úwhatr<   r<   r=   re   º  s   z_FakeGroup.addc                 C   s   | j S rŸ   r¼   r:   r<   r<   r=   rO  ½  s   z_FakeGroup.valuec                 C   s   | j j| jd� d S )N)Úkey)r½   rö   r«  r:   r<   r<   r=   rö   À  s   z_FakeGroup.sortrŸ   )r?   r@   rA   r>   re   rO  rö   r<   r<   r<   r=   r¨  µ  s
    
r¨  c                	   @   sv   e Zd Zeeeedd�eedd�eedd�eedd�d�ZdZdZ	dZ
dZd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )rv   zdx/dzr*   zdy/dzzdepth of an individual serieszz gap around series)rD   Útheta_xÚtheta_yÚzDepthÚzSpacer8   Nc                 C   sŒ   t  | ¡ | j}| j}|d u r| j}| j}|d u r| j}| jjdkr-|| |d |  }n|d|  }|| j	9 }| j
| | _| j| | _d S )Nry   r,   r‡   )rC   rç   r  r°  rF   r±  rH   rK   rm   r  r®  Ú_3d_dxr¯  Ú_3d_dy)r;   r%  r°  r±  Ú	_3d_depthr<   r<   r=   rç   Ï  s   

zBarChart3D.calcBarPositionsc                 C   s\   | j }|d u r
| j}| j}|d u r| j}| jjdkr'| j|||  |  }|S | j| }|S )Nry   )r°  rF   r±  rH   rK   rm   r  )r;   rf   r°  r±  Úz0r<   r<   r=   Ú_calc_z0Þ  s   
ÿzBarChart3D._calc_z0c                 C   sª   | j }|d u r
| j}| j}	|	d u r| j}	|  |¡}
|
|| j  }|dk r+||7 }| }||
| j 7 }||
| j 7 }| jrA||	7 }n||	7 }| 	d|
|||||||f	¡ d S )Nr   )
r°  rF   r±  rH   r¶  r  r®  r¯  r‰   re   )r;   rq   rg   rh   ri   rj   rf   rm   r°  r±  rµ  Úz1r<   r<   r=   rp  é  s   

 zBarChart3D._makeBarc                 C   sv   |   |¡}| j}	|	d u r| j}	|}
||| j 7 }||| j 7 }| jr'||	7 }n||	7 }| d||
||||||f	¡ d S )Nr,   )r¶  r±  rH   r®  r¯  r‰   re   )r;   rq   rf   r  rg   rh   ri   rj   rµ  r±  r·  r<   r<   r=   rS  û  s   

 zBarChart3D._addBarLabelc                 C   s>  ddl m} t| jd�}|  ||¡ | ¡  tƒ }| j}| j}| 	¡ }| j
j}|dkr0| ¡  n|dkrBdd„ tdd	„ |D ƒƒD ƒ}|D ]5}|d dkry|d
d … \}	}
}}}}}}|
|	 }||||| ||| || || |jd |j|jdd� qD|D ] }|d
krœ|d
d … \}	}
}}}}}}t | |||||||¡ q||S )Nr   )Ú_draw_3d_barr'   rw   rz   c                 S   s   g | ]}|d  ‘qS )r,   r<   r  r<   r<   r=   r™     ó    z'BarChart3D.makeBars.<locals>.<listcomp>c                 s   s0   � | ]}|d  |d |d |d f|fV  qdS )r,   r‡   rÕ   rÖ   Nr<   )r—   Útr<   r<   r=   r      s   €. z&BarChart3D.makeBars.<locals>.<genexpr>r,   gÍÌÌÌÌÌÜ?)r0   ÚfillColorShadedr/   r1   Úshading)Ú!reportlab.graphics.charts.utils3dr¸  r¨  Ú_cmpZr†  rö   r   r®  r¯  rO  rK   rm   Úreverser§   r0   r/   r1   rC   rS  )r;   r¸  Úfgrq   r®  r¯  Úfg_valuerÁ   rº  rµ  r·  rg   rh   ri   rj   rf   rm   Údzr  r<   r<   r=   rë     s:   
 ý€€zBarChart3D.makeBars)r?   r@   rA   r   rC   r   r   rB   r®  r¯  r°  r±  rç   r¶  rp  rS  rë   r<   r<   r<   r=   rv   Ã  s     



ürv   c                   @   ó   e Zd Zdd„ ZdS )ÚVerticalBarChart3Dc                 C   óB   t |d  |d |d |d  f|d  |d |d |d  fƒS )Nr,   rÕ   r   rÖ   r'   ©r;   rý   rÃ   r<   r<   r=   Ú<lambda>&  ó   B zVerticalBarChart3D.<lambda>N©r?   r@   rA   r¾  r<   r<   r<   r=   rÄ  %  ó    rÄ  c                   @   rÃ  )ÚHorizontalBarChart3Dc                 C   rÅ  )Nr,   rÖ   r   rÕ   r'   rÆ  r<   r<   r=   rÇ  )  rÈ  zHorizontalBarChart3D.<lambda>NrÉ  r<   r<   r<   r=   rË  (  rÊ  rË  c                  C   s–   t ddƒ} dg}tƒ }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_d|jj_d|jj_d|jj_ddg|j_|  |¡ | S )z9A slightly pathologic bar chart with only TWO data items.é�  r‘   ©é   é   é2   é}   é,  r   é<   é   Úneé   rZ  é   ÚYingÚYang©r   r¤  rg   rh   rj   ri   rL   r   rŽ   r/   rJ   ÚvalueMinÚvalueMaxÚ	valueSteprK   r"  r‹   r_  r`  ÚangleÚcategoryNamesre   ©r“   rL   r”   r<   r<   r=   Ú	sampleV0a,  s&   





rá  c                  C   s”   t ddƒ} dg}tƒ }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d|j
_d	|jj_d
|jj_d|jj_d|jj_dg|j_|  |¡ | S )z/A pathologic bar chart with only ONE data item.rÌ  r‘   ©é*   rÐ  rÑ  rÒ  r   rÔ  rÕ  rÖ  rZ  r×  úJan-99rÚ  rà  r<   r<   r=   Ú	sampleV0bK  s&   






rå  c                  C   sˆ   t ddƒ} dg}tƒ }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_d|jj_d|jj_g |j_|  |¡ | S )z8A really pathologic bar chart with NO data items at all!rÌ  r‘   r<   rÐ  rÑ  rÒ  r   rÓ  rÔ  rÕ  rÖ  rZ  )r   r¤  rg   rh   rj   ri   rL   r   rŽ   r/   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   r_  r`  rß  re   rà  r<   r<   r=   Ú	sampleV0ci  s$   




ræ  c                  C   s¬   t ddƒ} ddg}tƒ }d|_d|_d|_d|_||_tj|_	d|j
_d	|j
_d
|j
_d|jj_d|jj_d|jj_d|jj_d d¡}dd„ |D ƒ}||j_|  |¡ | S )ú!Sample of multi-series bar chart.rÌ  r‘   ©rÎ  r„   rÏ  é   é%   é-   é   rÖ   ©é   r×   é   é   é&   é.   rÏ  r„   rÐ  rÑ  rÒ  r   rÓ  rÔ  rÕ  rÖ  rZ  r×  úJan Feb Mar Apr May Jun Jul Augú c                 S   ó   g | ]}|d  ‘qS ©z-99r<   ©r—   rš   r<   r<   r=   r™   ¢  r¹  zsampleV1.<locals>.<listcomp>)r   r¤  rg   rh   rj   ri   rL   r   rŽ   r/   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   r_  r`  rÞ  rî   rß  re   ©r“   rL   r”   ÚcatNamesr<   r<   r=   ÚsampleV1†  s.   
þ





rú  c                  C   sÀ   ddg} d}t ddƒ}tƒ }d|_d|_d|_d|_| |_d	|_d
|_d
|_	d|j
_d|j
_d|j
_d|j
j_d|j
j_d|j
j_d|j
j_||j_d|jj_d|jj_d|jj_| |¡ |S )rç  ©ç333333@çÍÌÌÌÌÌÀr‡   r„   gffffff"@©ç333333ã?çš™™™™™ÀéýÿÿÿrÖ   g333333@©zQ3 2000zYear to Datez	12 monthszAnnualised
3 yearszSince 07.10.99rÌ  r‘   rÐ  r}   rÒ  r   rƒ   éñÿÿÿrÔ  r„   Ú	HelveticarÖ  rš   r†   éÄÿÿÿ©r   r¤  rg   rh   rj   ri   rL   rH   rG   rF   rJ   rÛ  rÜ  rÝ  r"  r\  r]  r‹   rŒ   rK   rß  r`  re   ©rL   r"  r“   r”   r<   r<   r=   Ú	sampleV2a©  ó6   ÿ








r  c                  C   sÀ   ddg} d}t ddƒ}tƒ }d|_d|_d|_d|_| |_d	|_d
|_d
|_	d|j
_d|j
_d	|j
_d|j
j_d|j
j_d|j
j_d|j
j_||j_d|jj_d|jj_d|jj_| |¡ |S )rç  rû  rþ  r  rÌ  r‘   rÐ  r}   rÒ  r„   rƒ   r  rÔ  r  rÖ  rš   r†   r  r  r  r<   r<   r=   Ú	sampleV2bÒ  r	  r
  c                  C   sö   ddg} d}t ddƒ}tƒ }d|_d|_d|_d|_| |_d	|_d
|_d
|_	d|j
_d|j
_d|j
_d|j
j_d|j
j_||j_d|jj_d|jj_d|j
j_d|j
j_d|jj_d
|j_d|_d|j_d|j_d|j_d|j_d|j_| |¡ |S )rç  ©rü  rý  r‡   r„   ç{®Gáú#@©rÿ  r   r  rÖ   r  r  rÌ  r‘   rÐ  r}   rÒ  r‡   rƒ   r  rÔ  r„   r  rÖ  rš   r†   r  ú%0.2fr   r×   )r   r¤  rg   rh   rj   ri   rL   rH   rG   rF   rJ   rÛ  rÜ  rÝ  r"  r\  r]  rK   rß  r‹   rŒ   r`  rM   r�   rN   r_  re   r  r<   r<   r=   Ú	sampleV2cû  sD   ÿ








r  c                  C   sT  d} d}d}t | ƒt |ƒksJ dƒ‚t | ƒt |ƒksJ dƒ‚tddƒ}tƒ }d|_d|_d|_d	|_|f|_tj	|j
_d
|_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_| |j_d|jj_d|jj_d|jj_d|jj_d|jj_d|jj_t|ƒ}|  dd¡ | !d¡ | "|¡ |S )zBFaked horizontal bar chart using a vertical real one (deprecated).©
zUK EquitieszUS EquitieszEuropean EquitieszJapanese EquitieszPacific (ex Japan) EquitieszEmerging Markets EquitieszUK BondszOverseas BondszUK Index-LinkedÚCash©
g      ø¿ç333333Ó?r8   r  gš™™™™™é?gffffffæ?gš™™™™™Ù?gš™™™™™¹?r  r  ©
g        ç…ëQ¸Õ?gš™™™™™á?çš™™™™™ñ?g)\�Âõ(ì?g¤p=
×£è?g)\�Âõ(Ü?g)\�Âõ(¼?r  r  úbad datarÌ  r‘   r   r{   é–   r  r“  r‚   r  r×   rƒ   rZ  r‡   r,   iƒÿÿÿé¯   i¦ÿÿÿ)#rb   r   r¤  rg   rh   rj   ri   rL   r   r�   rI   r0   rN   rM   r_  r`  r‹   rÞ  r\  r]  r�   rJ   r[  rÛ  rÜ  rÝ  rK   ÚtickUpÚtickDownrß  r"  r   Ú	translateÚrotatere   ©ÚnamesÚseries1Úseries2r“   r”   rq   r<   r<   r=   ÚsampleV3-  sN   









r"  c                  C   ó‚   t ddƒ} dg}tƒ }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_d|jj_ddg|j_|  |¡ | S )úAA bar chart showing value axis region starting at *exactly* zero.rÌ  r‘   rÍ  rÐ  rÑ  rÒ  r   rÓ  rÔ  rš   éûÿÿÿrØ  rÙ  ©r   r¤  rg   rh   rj   ri   rL   r   rŽ   r/   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   r`  rß  re   rà  r<   r<   r=   Ú	sampleV4ae  ó"   



r'  c                  C   r#  )ú<A bar chart showing value axis region starting *below* zero.rÌ  r‘   rÍ  rÐ  rÑ  rÒ  éöÿÿÿrÓ  rÔ  rš   r%  rØ  rÙ  r&  rà  r<   r<   r=   Ú	sampleV4b‚  r(  r+  c                  C   r#  )z;A bar chart showing value axis region staring *above* zero.rÌ  r‘   rÍ  rÐ  rÑ  rÒ  rƒ   rÓ  rÔ  rš   r%  rØ  rÙ  r&  rà  r<   r<   r=   Ú	sampleV4cŸ  r(  r,  c                  C   r#  )ú<A bar chart showing value axis region entirely *below* zero.rÌ  r‘   ©ióÿÿÿiìÿÿÿrÐ  rÑ  rÒ  éâÿÿÿr*  rÔ  rš   r%  rØ  rÙ  r&  rà  r<   r<   r=   Ú	sampleV4d¼  r(  r0  ))rƒ   rÓ  )rÏ  rÐ  )r×  é(   )r1  r×  c                  C   s€   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|j_d|j_d|j_d	|jj_d
|jj_ddg|j_|  |¡ | S )ú8A simple bar chart with no expressed spacing attributes.rÌ  r‘   rÐ  rÑ  rÒ  r   rÓ  rÔ  rš   r%  rØ  rÙ  )r   ÚdataSample5r¤  rg   rh   rj   ri   rL   r   rŽ   r/   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   r`  rß  re   rà  r<   r<   r=   Ú	sampleV5aß  s"   



r4  c                  C   s˜   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d|j_d
|j_d|j_d|jj_d|jj_ddg|j_|  |¡ | S )ú-A simple bar chart with proportional spacing.rÌ  r‘   rÐ  rÑ  rÒ  r   r1  rÏ  rƒ   rÓ  rÔ  rš   r%  rØ  rÙ  ©r   r3  r¤  rg   rh   rj   ri   rL   r   rŽ   r/   rE   rF   rG   rH   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   r`  rß  re   rà  r<   r<   r=   Ú	sampleV5bû  ó*   



r7  c                  C   s˜   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d|_d|j_d	|j_d
|j_d|jj_d|jj_ddg|j_|  |¡ | S )ú6Make sampe simple bar chart but with absolute spacing.rÌ  r‘   rÐ  rÑ  rÒ  r,   r1  r   rÓ  rÔ  rš   r%  rØ  rÙ  r6  rà  r<   r<   r=   Ú
sampleV5c1  r8  r:  c                  C   s˜   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d	|j_d
|j_d|j_d|jj_d|jj_ddg|j_|  |¡ | S )r9  rÌ  r‘   rÐ  rÑ  rÒ  r,   r1  rÏ  r   rÓ  rÔ  rš   r%  rØ  rÙ  r6  rà  r<   r<   r=   Ú
sampleV5c2=  r8  r;  c                  C   s˜   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d|j_d
|j_d|j_d|jj_d|jj_ddg|j_|  |¡ | S )r9  rÌ  r‘   rÐ  rÑ  rÒ  r,   r1  r   rƒ   rÓ  rÔ  rš   r%  rØ  rÙ  r6  rà  r<   r<   r=   Ú
sampleV5c3^  r8  r<  c                  C   s˜   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d
|j_d|j_d|j_d|jj_d|jj_ddg|j_|  |¡ | S )r9  rÌ  r‘   rÐ  rÑ  rÒ  r,   r1  rÏ  rƒ   r   rÓ  rÔ  rš   r%  rØ  rÙ  r6  rà  r<   r<   r=   Ú
sampleV5c4  r8  r=  c                  C   r#  )z>Make a slightly pathologic bar chart with only TWO data items.rÌ  r‘   rÍ  rÐ  rÑ  rÒ  r   rÓ  rÔ  Úser×  rØ  rÙ  ©r   r§  rg   rh   rj   ri   rL   r   rŽ   r/   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   rÞ  rß  re   rà  r<   r<   r=   Ú	sampleH0a¢  r(  r@  c                  C   s€   t ddƒ} dg}tƒ }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d|j
_d	|jj_d
|jj_dg|j_|  |¡ | S )z4Make a pathologic bar chart with only ONE data item.rÌ  r‘   râ  rÐ  rÑ  rÒ  r   rÔ  r>  r×  rä  r?  rà  r<   r<   r=   Ú	sampleH0b¿  s"   




rA  c                  C   s~   t ddƒ} dg}tƒ }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_d|jj_g |j_|  |¡ | S )z=Make a really pathologic bar chart with NO data items at all!rÌ  r‘   r<   rÐ  rÑ  rÒ  r   rÓ  rÔ  r>  r×  r?  rà  r<   r<   r=   Ú	sampleH0cÛ  s"   



rB  c                  C   s�   t ddƒ} ddg}tƒ }d|_d|_d|_d|_||_tj|_	d|j
_d	|j
_d
|j
_d|jj_d d¡}dd„ |D ƒ}||j_|  |d¡ | S )rç  rÌ  r‘   rè  rí  rÐ  rÑ  rÒ  r   rÓ  rÔ  Úeró  rô  c                 S   rõ  rö  r<   r÷  r<   r<   r=   r™     r¹  zsampleH1.<locals>.<listcomp>Úbarchart)r   r§  rg   rh   rj   ri   rL   r   rŽ   r/   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   rî   rß  re   rø  r<   r<   r=   ÚsampleH1÷  s(   
þ

rE  c                  C   sÎ   ddg} d}t ddƒ}tƒ }d|_d|_d|_d	|_| |_d
|_d|_d|_	d|j
_d|j
_d|j
_d|j
j_d|j
j_d|j
j_d|j
j_|j
 |j¡ ||j_d|jj_d|jj_d|jj_| |¡ |S )rç  rû  rþ  r  rÌ  r‘   r€   rÐ  r}   rÒ  r   rƒ   r  rÔ  r„   r  rÖ  rš   r†   éjÿÿÿ)r   r§  rg   rh   rj   ri   rL   rH   rG   rF   rJ   rÛ  rÜ  rÝ  r"  r\  r]  r‹   rŒ   rÊ   rK   rß  r_  re   r  r<   r<   r=   Ú	sampleH2a  s8   ÿ








rG  c                  C   sÀ   ddg} d}t ddƒ}tƒ }d|_d|_d|_d	|_| |_d
|_d|_d|_	d|j
_d|j
_d
|j
_d|j
j_d|j
j_d|j
j_d|j
j_||j_d|jj_d|jj_d|jj_| |¡ |S )rç  rû  rþ  r  rÌ  r‘   r€   rÐ  r}   rÒ  r„   rƒ   r  rÔ  r  rÖ  rš   r†   rF  )r   r§  rg   rh   rj   ri   rL   rH   rG   rF   rJ   rÛ  rÜ  rÝ  r"  r\  r]  r‹   rŒ   rK   rß  r_  re   r  r<   r<   r=   Ú	sampleH2b@  r	  rH  c                  C   sö   ddg} d}t ddƒ}tƒ }d|_d|_d|_d	|_| |_d
|_d|_d|_	d|j
_d|j
_d|j
_d|j
j_d|j
j_d|j
j_d|j
j_||j_d|jj_d|jj_d|jj_d|j_d|_d|j_d|j_d|j_d|j_d|j_| |¡ |S )rç  r  r  r  rÌ  r‘   r€   rÐ  r}   rÒ  r‡   rƒ   r  rÔ  r„   r  rÖ  rš   r†   rF  r  r   r×   )r   r§  rg   rh   rj   ri   rL   rH   rG   rF   rJ   rÛ  rÜ  rÝ  r"  r\  r]  r‹   rŒ   rK   rß  r_  rM   r�   rN   r`  re   r  r<   r<   r=   Ú	sampleH2ci  sD   ÿ








rI  c                  C   s"  d} d}d}t | ƒt |ƒksJ dƒ‚t | ƒt |ƒksJ dƒ‚tddƒ}tƒ }d|_d|_d	|_d
|_|f|_tj	|j
_d|_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_| |j_d|jj_d|jj_d|jj_d|jj_t|ƒ}| |¡ |S )zEA really horizontal bar chart (compared to the equivalent faked one).r  r  r  r  rÌ  r‘   r{   rÏ  r  éú   r  r   r“  r  r×   rƒ   rZ  r‡   r,   iVÿÿÿ) rb   r   r§  rg   rh   rj   ri   rL   r   r�   rI   r0   rN   rM   r_  r`  r‹   r\  r]  r�   rJ   r[  rÛ  rÜ  rÝ  rK   ÚtickLeftÚ	tickRightrß  r"  r   re   r  r<   r<   r=   ÚsampleH3›  sD   






rM  c                  C   óx   t ddƒ} dg}tƒ }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_ddg|j_|  |¡ | S )r$  rÌ  r‘   rÍ  rÐ  rÑ  rÒ  r   rÓ  rÔ  rC  rØ  rÙ  ©r   r§  rg   rh   rj   ri   rL   r   rŽ   r/   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   rß  re   rà  r<   r<   r=   Ú	sampleH4aÍ  ó    


rP  c                  C   rN  )r)  rÌ  r‘   rÍ  rÐ  rÑ  rÒ  r*  rÓ  rÔ  rC  rØ  rÙ  rO  rà  r<   r<   r=   Ú	sampleH4bé  rQ  rR  c                  C   rN  )z<A bar chart showing value axis region starting *above* zero.rÌ  r‘   rÍ  rÐ  rÑ  rÒ  rƒ   rÓ  rÔ  rC  rØ  rÙ  rO  rà  r<   r<   r=   Ú	sampleH4c  rQ  rS  c                  C   rN  )r-  rÌ  r‘   r.  rÐ  rÑ  rÒ  r/  r*  rÔ  rC  rØ  rÙ  rO  rà  r<   r<   r=   Ú	sampleH4d!  rQ  rT  c                  C   sv   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|j_d|j_d|j_d	|jj_d
dg|j_|  |¡ | S )r2  rÌ  r‘   rÐ  rÑ  rÒ  r   rÓ  rÔ  rC  rØ  rÙ  )r   r3  r§  rg   rh   rj   ri   rL   r   rŽ   r/   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   rß  re   rà  r<   r<   r=   Ú	sampleH5a?  s    


rU  c                  C   sŽ   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d|j_d
|j_d|j_d|jj_ddg|j_|  |¡ | S )r5  rÌ  r‘   rÐ  rÑ  rÒ  r   r1  rÏ  rƒ   rÓ  rÔ  rC  rØ  rÙ  ©r   r3  r§  rg   rh   rj   ri   rL   r   rŽ   r/   rE   rF   rG   rH   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   rß  re   rà  r<   r<   r=   Ú	sampleH5bZ  ó(   


rW  c                  C   sŽ   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d|_d|j_d	|j_d
|j_d|jj_ddg|j_|  |¡ | S )z)A simple bar chart with absolute spacing.rÌ  r‘   rÐ  rÑ  rÒ  r,   rƒ   r   rÓ  rÔ  rC  rØ  rÙ  rV  rà  r<   r<   r=   Ú
sampleH5c1z  rX  rY  c                  C   sŽ   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d	|j_d
|j_d|j_d|jj_ddg|j_|  |¡ | S ©ú'Simple bar chart with absolute spacing.rÌ  r‘   rÐ  rÑ  rÒ  r,   rƒ   rÏ  r   rÓ  rÔ  rC  rØ  rÙ  rV  rà  r<   r<   r=   Ú
sampleH5c2š  rX  r\  c                  C   sŽ   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d	|_d
|_d	|j_d|j_d|j_d|jj_ddg|j_|  |¡ | S )r[  rÌ  r‘   rÐ  rÏ  é›   rÒ  r,   rƒ   r   r‡   rÓ  rÔ  rC  rØ  rÙ  rV  rà  r<   r<   r=   Ú
sampleH5c3º  rX  r^  c                  C   sŽ   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d|_d	|j_d
|j_d|j_d|jj_ddg|j_|  |¡ | S rZ  rV  rà  r<   r<   r=   Ú
sampleH5c4Ú  rX  r_  c                  C   s   t ddƒ} t}tƒ }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|j_d
|j_d|j_d|jj_ddg|j_d	dlm} |ƒ }tj	|_tj|_d|_d	|_|ƒ }tj	|_tj|_d|_d	|_|ƒ }tj|_tj|_d|_d|_d	|_||j _!||j d _!||j d _!|  "|¡ | S )ú(Simple bar chart using symbol attribute.rÌ  r‘   rÐ  rÑ  rÒ  rƒ   rÔ  rÕ   r   rÓ  rC  rØ  rÙ  ©Ú
ShadedRectÚ
horizontalÚverticalr,   r‡   )#r   r3  r¤  rg   rh   rj   ri   rL   r   rŽ   r/   rF   rG   rH   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   rß  Ú reportlab.graphics.widgets.gridsrb  ÚfillColorStartr9   ÚfillColorEndÚorientationr1   ÚpinkÚwhiteÚcylinderModerI   r3   re   )r“   rL   r”   rb  Úsym1Úsym2Úsym3r<   r<   r=   ÚsampleSymbol1ù  sN   


ro  c                  C   sÎ  t ddƒ} t}tƒ }d|j_d|_d|_d|_d|_||_	t
j|_d|_d|_d	|j_d
|jj_ddg|j_d	dlm} |ƒ |j_t
j|jj_t
j|jj_d|jj_d|jj_d	|jj_|ƒ |jd _t
j|jd j_t
j|jd j_d|jd j_d|jd j_d	|jd j_|ƒ |jd _t
j |jd j_t
j|jd j_d|jd j_d|jd j_d	|jd j_|ƒ |jd _t
j!|jd j_t
j|jd j_d|jd j_d|jd j_d	|jd j_|  "|¡ | S )r`  rÌ  r‘   rw   rÐ  rÑ  rÒ  rƒ   rÔ  r   rC  rØ  rÙ  ra  rd  r,   r‡   rÕ   )#r   r3  r¤  rK   rm   rg   rh   rj   ri   rL   r   rŽ   r/   rF   rG   rJ   rÛ  r"  r‹   rß  re  rb  rI   r3   r�   rf  rj  rg  rh  rk  r1   Úmagentar�   r9   re   )r“   rL   r”   rb  r<   r<   r=   ÚsampleStacked1/	  sT   






rq  c                   @   s   e Zd ZdZddd„ZdS )Ú
SampleH5c4r[  rÌ  r‘   c                 O   s¨   t j| ||g|¢R i |¤Ž tƒ }d|_d|_d|_d|_t|_t	j
|_d|_d|_d|_d|_d|j_d|j_d	|j_d
|jj_ddg|j_| j|dd� | ¡  d S )NrÐ  rÑ  rÒ  r,   rƒ   rÏ  r   rÓ  rÔ  rC  rØ  rÙ  ÚHBC)r4   )r   r>   r§  rg   rh   rj   ri   r3  rL   r   rŽ   r/   rE   rF   rG   rH   rJ   rÛ  rÜ  rÝ  rK   r"  r‹   rß  re   rž  )r;   ri   rj   ÚargsÚkwr”   r<   r<   r=   r>   k	  s&   
zSampleH5c4.__init__N)rÌ  r‘   )r?   r@   rA   r¢  r>   r<   r<   r<   r=   rr  h	  s    rr  )hÚ__version__r¢  rU  r©  Úastr   Úreportlab.libr   Úreportlab.lib.validatorsr   r   r   r   r   r	   r
   r   r   r   r   r   Úreportlab.lib.utilsr   r   Ú"reportlab.graphics.widgets.markersr   r   Úreportlab.lib.attrmapr   r   Úreportlab.pdfbase.pdfmetricsr   Úreportlab.graphics.widgetbaser   r   r   Úreportlab.graphics.shapesr   r   r   r   r   Úreportlab.graphics.charts.axesr   r    r!   r"   Ú$reportlab.graphics.charts.textlabelsr#   r$   Úreportlab.graphics.charts.areasr%   Ú!reportlab.graphics.charts.legendsr&   Ú	reportlabr(   r)   rC   r¤  r§  r¨  rv   rÄ  rË  rá  rå  ræ  rú  r  r
  r  r"  r'  r+  r,  r0  r3  r4  r7  r:  r;  r<  r=  r@  rA  rB  rE  rG  rH  rI  rM  rP  rR  rS  rT  rU  rW  rY  r\  r^  r_  ro  rq  rr  r<   r<   r<   r=   Ú<module>   s�   8      b#))28!!!!!#*)22    69