o
    Ô¥[& ã                   @   s  d Z dZddlZddl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mZ ddlmZmZ ddl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/m0Z0 ddl1m2Z2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z; G dd„ de%ƒZ<G dd„ de6ƒZ=G dd„ de=ƒZ>G dd„ de=ƒZ?G dd„ dƒZ@G dd„ de=ƒZAG dd„ deAe>ƒZBG d d!„ d!eAe?ƒZCd"d#„ ZDd$d%„ ZEd&d'„ ZFd(d)„ ZGd*d+„ ZHd,d-„ ZId.d/„ ZJd0d1„ ZKd2d3„ ZLd4d5„ ZMd6d7„ ZNd8d9„ ZOg d:¢ZPd;d<„ ZQd=d>„ ZRd?d@„ ZSdAdB„ ZTdCdD„ ZUdEdF„ ZVdGdH„ ZWdIdJ„ ZXdKdL„ ZYdMdN„ ZZdOdP„ Z[dQdR„ Z\dSdT„ Z]dUdV„ Z^dWdX„ Z_dYdZ„ Z`d[d\„ Zad]d^„ Zbg d:¢ZPd_d`„ Zcdadb„ Zddcdd„ Zededf„ Zfdgdh„ Zgdidj„ Zhdkdl„ Zidmdn„ ZjG dodp„ dpe*ƒZkd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)Úcolors)ÚisNumberÚisNumberOrNoneÚisColorÚisColorOrNoneÚisStringÚisListOfStringsÚ
SequenceOfÚ	isBooleanÚisNoneOrShapeÚisStringOrNoneÚNoneOrÚisListOfNumbersOrNoneÚEitherOrÚOneOfÚisInt)Úflatten)ÚuSymbol2SymbolÚisSymbol)Ú	Formatter)ÚAttrMapÚAttrMapValue)ÚstringWidth)ÚWidgetÚTypedPropertyCollectionÚ
PropHolder)ÚLineÚRectÚGroupÚDrawingÚNotImplementedError)ÚXCategoryAxisÚ
YValueAxisÚYCategoryAxisÚ
XValueAxis)ÚBarChartLabelÚNA_LabelÚNoneOrInstanceOfNA_Label)ÚPlotArea)Ú_objStr)ÚxrangeÚcmpc                   @   st   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�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.)ÚstrokeColorÚ	fillColorÚstrokeWidthÚstrokeDashArrayÚsymbolÚnameÚswatchMarkerÚminDimenc                 C   s$   d | _ tj| _d| _d | _d | _d S )Nç      à?)r2   r   Úbluer3   r4   r6   r5   ©Úself© r>   úU/var/www/html/env/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   Ú_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/   r0   Ú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   s¸   | 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�S )Nr2   r3   r5   r4   r8   ç       @)r4   r2   r5   r3   )rK   ÚlenÚgetattrr   r   )r=   ÚrowNoÚxÚyÚwidthÚheightÚ	baseStyleÚstyleIdxÚstyler2   r3   r5   r4   r8   r>   r>   r?   ÚmakeSwatchSampleV   s   ÿzBarChart.makeSwatchSamplec                 C   s   t t| j| d|ƒƒS )zreturn series name i or defaultr7   )r)   rd   rK   )r=   ÚiÚdefaultr>   r>   r?   ÚgetSeriesNamed   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)rE   Ú
BarChart3DzAbstract Class %s InstantiatedÚstackedÚparallelÚparallel_3dÚmixedrl   r   )éd   én   éx   é‚   )éF   éP   éU   éZ   é
   é   ÚcÚmiddler/   é   )*Ú	__class__rA   Ú_flipXYr#   rM   r$   rL   r!   r"   r   rD   Úvalidater(   r@   rJ   rS   rN   rG   rH   rI   r   r%   rO   Ú	boxAnchorÚ
textAnchorrP   rR   Únudger,   rK   r4   r   Úblackr2   r5   Úredr3   Úgreenr;   rT   r]   r\   r<   r>   r>   r?   r@   h   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 chartrE   z#Abstract Class BarChart has no demoéÈ   rv   )rƒ   rA   r    r   Úadd)r=   ÚdrawingÚbcr>   r>   r?   Údemo¥   s   

zBarChart.democ                    sž   t | dd ƒ}t| jƒ‰ |sdd„ tˆ ƒD ƒ}n3ttˆ ƒƒ}g }|D ]}‡ fdd„|D ƒ}|r;| t|ƒ¡ |t|ƒ8 }q!|rJ| 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(   g | ]}d |  krˆ krn n|‘qS )r   r>   r‘   ©Únr>   r?   r”   ·   s   ( c                 s   s   � | ]}|fV  qd S ©Nr>   r‘   r>   r>   r?   Ú	<genexpr>¼   s   € z*BarChart.getSeriesOrder.<locals>.<genexpr>)rd   rc   rN   r*   ÚsetÚrangeÚappendÚtupleÚextendÚsortedÚ_seriesOrder)r=   ÚbsÚRÚunseenÚsÚgr>   r•   r?   ÚgetSeriesOrder®   s   
€
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©rs   rt   c                     sŽ   t dd„ | D ƒƒdg }|d d … }| D ]&}tt|ƒƒD ]}|| p#d}|dkr1||  |7  < q||  |7  < qqˆ  |¡ ˆ  |¡ d S )Nc                 s   s   � | ]}t |ƒV  qd S r—   )rc   )r’   Údr>   r>   r?   r˜   È   ó   € zBBarChart._getConfigureData.<locals>._accumulate.<locals>.<genexpr>r   ç�íµ ÷Æ°¾)Úmaxr*   rc   r›   )ÚDÚpdataÚndatar§   rn   Úv)rN   r>   r?   Ú_accumulateÇ   s   û
z/BarChart._getConfigureData.<locals>._accumulaterr   c                 3   s   � | ]}ˆ | V  qd S r—   r>   )r’   Új©Ú_datar>   r?   r˜   Ø   r¨   z-BarChart._getConfigureData.<locals>.<genexpr>)
rM   rl   rN   rª   ÚlistÚmaprc   r¥   rŸ   Ú_configureData)r=   ÚcAStyleÚccr¯   Úbr>   )r²   rN   r?   Ú_getConfigureData¿   s   


zBarChart._getConfigureDatac                 C   s&   |   ¡  | j | j¡ | jj| jjfS )z Attempt to return the data range)r¹   rL   Ú	_setRangerµ   Ú	_valueMinÚ	_valueMaxr<   r>   r>   r?   Ú
_getMinMaxÛ   s   zBarChart._getMinMaxc                 C   sR   | j }| | j| j|¡ |  ¡  | | j¡ | d¡}||| ks%||k r'|}|S )z8Position and configure value axis, return crossing valuer   )rL   ÚsetPositionrf   rg   r¹   Ú	configurerµ   Úscale)r=   ÚorgÚlengthÚvAÚ	crossesAtr>   r>   r?   Ú
_drawBeginá   s   
zBarChart._drawBeginc                    sT  | 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 ]x}| ¡ }|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|
i ƒ}
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�r:| |  ¡ ¡ �q(|	dk�rF| |¡ �q(|	dk�rV|j	|| |j
d� �q(|	d k�rb| |¡ �q(|	d!k�rr|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 barchartr\   NÚdrawGridLastF)ÚparentÚdimrU   r>   r   r/   r‚   é   é   r   é   é   )Ú
backgroundrM   rL   rK   rO   ÚcategoryAxisGridÚvalueAxisGridrU   ú,ú=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”     ó    z(BarChart._drawFinish.<locals>.<listcomp>z9Unknown zIndex variable %r in %r
allowed variables are
%sc                    rÓ   rÔ   r>   rÕ   r×   r>   r?   r”     rÙ   zCBad zIndex value %r in clause %r of zIndex
allowed variables are
%sc                    rÓ   rÔ   r>   rÕ   r×   r>   r?   r”     rÙ   c                 S   s   g | ]\}}||f‘qS r>   r>   )r’   rÖ   r®   r>   r>   r?   r”     s    éÿÿÿÿrÍ   rM   rÎ   rL   rÏ   rK   rO   )rM   rL   r¿   rµ   ÚcalcBarPositionsr   rd   r�   ÚmakeBackgroundÚmakeGridÚgetGridDimsÚmakeBarsrÀ   ÚdictÚstripÚsplitÚ
ValueErrorÚjoinrž   ÚkeysÚevalÚ
isinstanceÚfloatÚintÚitemsÚsortÚcontentsÚpop)r=   ÚcArÃ   r¤   Ú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‰
ˆ
dkr~| j}
t|
ƒ}|| }|d | }|dkrl|}|}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�r:d }}|�r7|| | | nd}n5ˆdk�rLd}|| ||   }}n#ˆdk�r^d }}|| | | }nˆdk�rod }}|| | | }|| _|| _|| _| 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�r<t%|ƒD ]+}g ‰|�r|d | n|‰|ˆ|  ‰|| ‰	t%|ƒD ]}|||ƒ �q+|ˆƒ �qd	S t&| jƒD ]B\} }!t|!ƒdk�rNdnd‰
|�rY|d |  n| ‰|ˆ|  ‰|!D ]}g ‰|| ‰	t%|ƒD ]}|||| |  ƒ �qo|ˆƒ �qc�qAd	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.
        rV   r   rW   rZ   rY   rX   ru   r/   Nr¦   rÌ   r¸   r‚   r¤   rÊ   r£   ç      ð?rÉ   r   rË   r:   g      @c                    s  ˆ	|  }ˆdkrˆˆ | ƒ ˆ ˆ }n
ˆ| ƒ\}}|ˆ }|d u r&d }ˆ}nVˆ
dvr`|dkrGˆˆ| ƒ}|ˆkr:ˆ}ˆ|  |7  < ˆ| }nˆˆ| ƒ}|ˆk rSˆ}ˆ|  |7  < ˆ| }nˆ}ˆ|ƒ| }d|  k rrdkr|n nd}|dk r|d}ˆ  ˆr†|||ˆfp‹||ˆ|f¡ d S )NrÌ   r¦   r©   ç:Œ0âŽyE¾ç:Œ0âŽyE>)r›   )ÚcolNoÚaccxÚdatumrf   r¤   Ú_ri   rg   ©Ú_cscaleÚaccumNegÚaccumPosÚbarRowÚbaseLineÚcScaleÚflipXYÚ
groupWidthrÁ   Úrowrl   rG   ÚvScalerh   ÚxValr>   r?   Ú_addBar¯  s0   

&z*BarChart.calcBarPositions.<locals>._addBarrs   rr   )'r„   rg   rf   rM   rÀ   rN   rc   Ú_seriesCountrª   r³   r´   Ú
_rowLengthrI   rJ   rH   rd   rl   rŸ   Ú_groupWidthrG   rç   Ústrrè   Ú_normFactorÚ_scaleÚ_normFactorBÚ_normFactorGÚ_normFactorSrL   r»   r¼   Ú	_baseLineÚlabelsÚlabelPosFracÚ_barPositionsr›   rS   r*   Ú	enumerate)"r=   rî   rN   ÚseriesCountÚ	rowLengthÚwGrJ   rH   ÚclbsÚclbor“   ÚbarsPerGroupÚwBÚwSÚbGapBÚbGapSÚaW0ÚaWÚfBÚfGÚfSrÃ   ÚvmÚvMÚoffsÚbGapÚlbpfÚaBPrS   r	  re   rù   ÚsbÚsgr>   rý   r?   rÛ   6  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|ƒtu r?|| j| |  }|S t|dƒrO|| j| | ƒ}|S d| }t	|ƒ‚)zreturn formatted label textNÚvaluesÚ__call__z6Unknown formatter type %s, expected string or function)
rP   rç   r³   rœ   rR   Útyper  rN   ÚhasattrÚ	Exception)r=   re   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   r:   r/   rÚ   ÚmidÚhira   )rˆ   rd   Ú_pmv)r=   Úlabelrf   rg   rh   ri   rˆ   Úbtr:  ÚpmÚvaluerò   r¸   r>   r>   r?   Ú_labelXYø  s.   

zBarChart._labelXYc           	      C   s<   |   ||¡}|r|  || j||f |||||||¡	 d S d S r—   )r7  Ú	_addLabelrO   )	r=   r¤   re   rù   rf   rg   rh   ri   Útextr>   r>   r?   Ú_addBarLabel  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)rT   rD  ÚcopyrL   r¼   rC  )r=   r¤   re   rù   rf   rg   rh   ri   rF  Únar®   r>   r>   r?   Ú_addNABarLabel  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ÚfixedEndrb   Ú
fixedStartr   éþÿÿÿ)r2   r4   rQ   )Úvisibler   ÚfontNameÚfontSizer„   rB  rd   Ú	_getValueÚdxÚdyÚ	setOriginÚsetTextÚlineStrokeColorÚlineStrokeWidthÚinsertr   r�   Ú_callOutInfo)r=   rD  r>  r¤   re   rù   rf   rg   rh   ri   rF  Ú
labelWidthr  Úy0Úx0r@  rJ  r®   Úx00Úy00rK  rQ  rR  ÚsCÚsWÚalxr>   r>   r?   rC  #  sX   



$
Ï.zBarChart._addLabelc           	      C   sB   t ||||ƒ}|j|_|j|_|j|_|jr|j|_| |¡ d S r—   )r   r4   r3   r2   r5   r�   )	r=   r¤   rf   rg   rh   ri   re   rl   Úrr>   r>   r?   Ú_makeBarW  s   zBarChart._makeBarc                 C   s   t | jƒ}| j}t| dd ƒ}| j}| j}| j}i }	|rEg }
|d }t|ƒD ]\}}tt |ƒƒD ]}|| \}}}}d ||fvrCd|	|< q/q%t|ƒD �]C\}}t |ƒ}|| }|| }tt |ƒƒD �]+}||f|v ro|||f pp|}|| \}}}}d ||fv rä|r…||	v r‘|  	|||||||¡ nR|rã||
vrã|  	|||||||d|¡	}|rÞ|| | \}}}}|  	|||||||d|¡	}|d |d  d }|d |d  d }| j	|||||dd|d� |
 
|¡ q`d }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 �r)t|j |ƒ}nt|j|ƒ}|�rD||_||_||_||_| |¡ n=t|ƒd
k�r�t|ƒd
k�r�|jd u�s^|jd u�r�|  |||||||¡ |�r�||jd |  ||¡| j| | ||d� |  |||||||¡ q`qId S )Nr[   r/   Tr   rb   g-Cëâ6?)rH  r6   r9   gH¯¼šò×z>rÚ   )r>  rA  re   rù   )rc   rN   rK   rd   r  r„   r]   r  r*   rI  r›   r2  rG  Údeepcopyr6   Úminr9   rª   rf   rg   rh   ri   r�   Úabsr3   r2   rb  rì   r7  rE  )r=   r¤   ÚlgÚlenDatarK   ÚbrÚBPr  ÚcatNALÚcatNNAÚCBLÚrowNoLre   r  rù   rf   rg   rh   ri   Ú
styleCountrk   ÚrowStylerl   Úr0Úr1r6   r9   r>   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 )NrJ  rb   rK  r   rL  )rM  r   rN  rO  r„   rB  rd   rP  rQ  rR  rS  rT  Ú	getBounds)r=   rD  r>  re   rù   rf   rg   rh   ri   rY  r  rZ  r[  r@  rJ  r®   r\  r]  rK  rQ  rR  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)rM   rL   ÚjoinAxisr„   r¾   rÅ   rf   rh   rg   ri   r¿   rµ   rÛ   ©r=   rî   rÃ   r>   r>   r?   Ú_computeBarPositionsÔ  s   

 zBarChart._computeBarPositionsc              
   C   s@  | j }|  ¡  t| jƒ}| j}g }|j}|rW| j}|| j }	| j| j	 }
t
|ƒD ]-}|| D ]&\}}}}|| }|| }|t||ƒt||ƒt||ƒ| |	t||ƒ fƒ q.q(n@| j}|| j	 }	| j| j }
t
|ƒD ]-}|| D ]&\}}}}|| }|| }|t||ƒt||ƒt||ƒ| |	t||ƒ fƒ qoqi| ¡  |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 �r?|| d |k�r?t|| d |ƒ}t|| d |ƒ}|d7 }||k �r?|| d |k�s||k�rp||k�ro|}|�rZ|||| || df�pd|||| || df}||k�ro ||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„   rw  rc   rN   r  r›   rf   rh   rg   ri   r*   rd  rª   rë   r  )r=   ÚsizeÚrequiredr  rg  ri  ÚCÚaCra   r<  Úendrn   rf   rg   ÚwÚhr®   ró   r¡   r€   ra  ÚmaxSÚmaxPÚnCÚ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¡ |  ¡  t| jƒ}| j}g j}| j}t|ƒD ]}}|| }g j}	tt|ƒƒD ]h}
||
 \}}}}d||fv r¦| j}|r¡|jr¡t |¡}| jjdkrƒdp„d}|du r‹|}|du r‘|}|	|  |j|||
||||¡ƒ q^|	dƒ q^|  ||
¡}|rÂ|	|  || j||
f ||
||||¡ƒ q^|	dƒ q^||	jƒ qO|jS )zLInformation function, can be called by charts which want to mess with labelsNr   r÷   rø   )rM   rL   ru  r„   r¾   rÅ   rf   rh   rg   ri   r¿   rµ   rÛ   rc   rN   rK   r›   r  r*   rT   rD  rG  r¼   rt  r7  rO   Ú__self__)r=   rî   rÃ   rg  rK   r¡   ri  re   r  rz  rù   rf   rg   rh   ri   rH  r®   rD  r>   r>   r?   Ú_computeSimpleBarLabelPositions   s@   

 


 
(
z(BarChart._computeSimpleBarLabelPositionsc                 C   s&   t ƒ }t ƒ }|  ||¡ | |¡ |S r—   )r   rr  r�   )r=   r¤   rf  r>   r>   r?   rß   H  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 lengthrs   r/   )
rM   rl   rN   rc   rª   r³   r´   rJ   rH   rI   )r=   rl   rN   r–   Úmr  r>   r>   r?   Ú_desiredCategoryAxisLengthO  s   z#BarChart._desiredCategoryAxisLengthc                 C   st   | j | j}}|r||_|r||_| jr'| |  | j| j¡| j| j	¡ |  
¡ S | | j|  | j| j	¡| j¡ |  
¡ S r—   )rM   rL   ru  r„   r¾   rÅ   rf   rh   rg   ri   rõ   rv  r>   r>   r?   Údraw[  s   

ÿzBarChart.drawr>   r—   )FN)F))rA   rB   rC   Ú__doc__r   r(   r   r   r
   r   r   r'   r   r   r	   r   rD   rm   rp   r@   r�   r¥   r¹   r½   rÅ   rõ   rÛ   r7  rB  rE  rI  rC  rb  rr  rt  rw  r‡  r‰  rß   r‹  rŒ  r>   r>   r>   r?   rE   3   sŒ    ÿþýüûúùø	÷
öõôóòñðïîíä"ã 
=	H /

	4	H,@(rE   c                   @   ó   e Zd ZdZdZdS )ÚVerticalBarChartz3Vertical bar chart with multiple side-by-side bars.r   N©rA   rB   rC   r�  r„   r>   r>   r>   r?   r�  e  ó    r�  c                   @   rŽ  )ÚHorizontalBarChartz5Horizontal bar chart with multiple side-by-side bars.r/   Nr�  r>   r>   r>   r?   r’  i  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@   n  s   z_FakeGroup.__init__c                 C   s   | j  |¡ d S r—   )r²   r›   )r=   Úwhatr>   r>   r?   r�   r  s   z_FakeGroup.addc                 C   s   | j S r—   r±   r<   r>   r>   r?   rA  u  s   z_FakeGroup.valuec                 C   s   | j j| jd� d S )N)Úkey)r²   rë   r–  r<   r>   r>   r?   rë   x  s   z_FakeGroup.sortr—   )rA   rB   rC   r@   r�   rA  rë   r>   r>   r>   r?   r“  m  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 )rq   zdx/dzr-   zdy/dzzdepth of an individual serieszz gap around series)rF   Útheta_xÚtheta_yÚzDepthÚzSpacer:   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 )Nrt   r/   r‚   )rE   rÛ   r
  r›  rH   rœ  rJ   rM   rl   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 )Nrt   )r›  rH   rœ  rJ   rM   rl   r  )r=   re   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›  rH   rœ  rJ   r¡  r  r™  rš  r„   r�   )r=   r¤   rf   rg   rh   ri   re   rl   r›  rœ  r   Úz1r>   r>   r?   rb  ¡  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œ  rJ   r™  rš  r„   r�   )r=   r¤   re   rù   rf   rg   rh   ri   r   rœ  r¢  r>   r>   r?   rE  ³  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_bar©r+   rr   ru   c                 S   s   g | ]}|d  ‘qS )r/   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ÍÌÌÌÌÌÜ?)r3   ÚfillColorShadedr2   r4   Úshading)Ú!reportlab.graphics.charts.utils3dr£  r“  Ú_cmpZrr  rë   r   r™  rš  rA  rM   rl   Úreverserž   r3   r2   r4   rE   rE  )r=   r£  Úfgr¤   r™  rš  Úfg_valuer¶   r¦  r   r¢  rf   rg   rh   ri   re   rl   Údzrù   r>   r>   r?   rß   À  s:   
 ý€€zBarChart3D.makeBars)rA   rB   rC   r   rE   r   r   rD   r™  rš  r›  rœ  rÛ   r¡  rb  rE  rß   r>   r>   r>   r?   rq   {  s     



ürq   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©rA   rB   rC   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é   rL  é   ÚYingÚYang©r   r�  rf   rg   ri   rh   rN   r   r‰   r2   rL   ÚvalueMinÚvalueMaxÚ	valueSteprM   r  r†   rQ  rR  ÚangleÚcategoryNamesr�   ©rŽ   rN   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Â  rL  rÃ  úJan-99rÆ  rÌ  r>   r>   r?   Ú	sampleV0b  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Â  rL  )r   r�  rf   rg   ri   rh   rN   r   r‰   r2   rL   rÇ  rÈ  rÉ  rM   r  r†   rQ  rR  rË  r�   rÌ  r>   r>   r?   Ú	sampleV0c!  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Â  rL  rÃ  úJan Feb Mar Apr May Jun Jul Augú c                 S   ó   g | ]}|d  ‘qS ©z-99r>   ©r’   r–   r>   r>   r?   r”   Z  r¥  zsampleV1.<locals>.<listcomp>)r   r�  rf   rg   ri   rh   rN   r   r‰   r2   rL   rÇ  rÈ  rÉ  rM   r  r†   rQ  rR  rÊ  râ   rË  r�   ©rŽ   rN   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¼  rx   r¾  r   r~   éñÿÿÿrÀ  r   Ú	HelveticarÂ  r–   r�   éÄÿÿÿ©r   r�  rf   rg   ri   rh   rN   rJ   rI   rH   rL   rÇ  rÈ  rÉ  r  rN  rO  r†   r‡   rM   rË  rR  r�   ©rN   r  rŽ   r�   r>   r>   r?   Ú	sampleV2aa  ó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¼  rx   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¼  rx   r¾  r‚   r~   rï  rÀ  r   rð  rÂ  r–   r�   rñ  ú%0.2fr   rË   )r   r�  rf   rg   ri   rh   rN   rJ   rI   rH   rL   rÇ  rÈ  rÉ  r  rN  rO  rM   rË  r†   r‡   rR  rO   rˆ   rP   rQ  r�   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Ó?r:   rö   gš™™™™™é?gffffffæ?gš™™™™™Ù?gš™™™™™¹?rö   rÿ  ©
g        ç…ëQ¸Õ?gš™™™™™á?çš™™™™™ñ?g)\�Âõ(ì?g¤p=
×£è?g)\�Âõ(Ü?g)\�Âõ(¼?r  r  úbad datar¸  rŒ   r   rv   é–   rú  r}  r}   rð  rË   r~   rL  r‚   r/   iƒÿÿÿé¯   i¦ÿÿÿ)#rc   r   r�  rf   rg   ri   rh   rN   r   r‹   rK   r3   rP   rO   rQ  rR  r†   rÊ  rN  rO  rˆ   rL   rM  rÇ  rÈ  rÉ  rM   ÚtickUpÚtickDownrË  r  r   Ú	translateÚrotater�   ©ÚnamesÚseries1Úseries2rŽ   r�   r¤   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�  rf   rg   ri   rh   rN   r   r‰   r2   rL   rÇ  rÈ  rÉ  rM   r  r†   rR  rË  r�   rÌ  r>   r>   r?   Ú	sampleV4a  ó"   



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?   Ú	sampleV4cW  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?   Ú	sampleV4dt  r  r  ))r~   r¿  )r»  r¼  )rÃ  é(   )r  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�  rf   rg   ri   rh   rN   r   r‰   r2   rL   rÇ  rÈ  rÉ  rM   r  r†   rR  rË  r�   rÌ  r>   r>   r?   Ú	sampleV5a—  s"   



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 )ú-A simple bar chart with proportional spacing.r¸  rŒ   r¼  r½  r¾  r   r  r»  r~   r¿  rÀ  r–   r  rÄ  rÅ  ©r   r  r�  rf   rg   ri   rh   rN   r   r‰   r2   rG   rH   rI   rJ   rL   rÇ  rÈ  rÉ  rM   r  r†   rR  rË  r�   rÌ  r>   r>   r?   Ú	sampleV5b³  ó*   



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 )ú6Make sampe simple bar chart but with absolute spacing.r¸  rŒ   r¼  r½  r¾  r/   r  r   r¿  rÀ  r–   r  rÄ  rÅ  r"  rÌ  r>   r>   r?   Ú
sampleV5c1Ô  r$  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 )r%  r¸  rŒ   r¼  r½  r¾  r/   r  r»  r   r¿  rÀ  r–   r  rÄ  rÅ  r"  rÌ  r>   r>   r?   Ú
sampleV5c2õ  r$  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 )r%  r¸  rŒ   r¼  r½  r¾  r/   r  r   r~   r¿  rÀ  r–   r  rÄ  rÅ  r"  rÌ  r>   r>   r?   Ú
sampleV5c3  r$  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 )r%  r¸  rŒ   r¼  r½  r¾  r/   r  r»  r~   r   r¿  rÀ  r–   r  rÄ  rÅ  r"  rÌ  r>   r>   r?   Ú
sampleV5c47  r$  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’  rf   rg   ri   rh   rN   r   r‰   r2   rL   rÇ  rÈ  rÉ  rM   r  r†   rÊ  rË  r�   rÌ  r>   r>   r?   Ú	sampleH0aZ  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?   Ú	sampleH0bw  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_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"   



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 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’  rf   rg   ri   rh   rN   r   r‰   r2   rL   rÇ  rÈ  rÉ  rM   r  r†   râ   rË  r�   rä  r>   r>   r?   ÚsampleH1¯  s(   
þ

r1  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¼  rx   r¾  r   r~   rï  rÀ  r   rð  rÂ  r–   r�   éjÿÿÿ)r   r’  rf   rg   ri   rh   rN   rJ   rI   rH   rL   rÇ  rÈ  rÉ  r  rN  rO  r†   r‡   r¿   rM   rË  rQ  r�   ró  r>   r>   r?   Ú	sampleH2aÎ  s8   ÿ








r3  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¼  rx   r¾  r   r~   rï  rÀ  rð  rÂ  r–   r�   r2  )r   r’  rf   rg   ri   rh   rN   rJ   rI   rH   rL   rÇ  rÈ  rÉ  r  rN  rO  r†   r‡   rM   rË  rQ  r�   ró  r>   r>   r?   Ú	sampleH2bø  rõ  r4  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¼  rx   r¾  r‚   r~   rï  rÀ  r   rð  rÂ  r–   r�   r2  rú  r   rË   )r   r’  rf   rg   ri   rh   rN   rJ   rI   rH   rL   rÇ  rÈ  rÉ  r  rN  rO  r†   r‡   rM   rË  rQ  rO   rˆ   rP   rR  r�   ró  r>   r>   r?   Ú	sampleH2c!  sD   ÿ








r5  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Œ   rv   r»  r  éú   rú  r   r}  rð  rË   r~   rL  r‚   r/   iVÿÿÿ) rc   r   r’  rf   rg   ri   rh   rN   r   r‹   rK   r3   rP   rO   rQ  rR  r†   rN  rO  rˆ   rL   rM  rÇ  rÈ  rÉ  rM   ÚtickLeftÚ	tickRightrË  r  r   r�   r
  r>   r>   r?   ÚsampleH3S  sD   






r9  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À  r/  rÄ  rÅ  ©r   r’  rf   rg   ri   rh   rN   r   r‰   r2   rL   rÇ  rÈ  rÉ  rM   r  r†   rË  r�   rÌ  r>   r>   r?   Ú	sampleH4a…  ó    


r<  c                  C   r:  )r  r¸  rŒ   r¹  r¼  r½  r¾  r  r¿  rÀ  r/  rÄ  rÅ  r;  rÌ  r>   r>   r?   Ú	sampleH4b¡  r=  r>  c                  C   r:  )z<A bar chart showing value axis region starting *above* zero.r¸  rŒ   r¹  r¼  r½  r¾  r~   r¿  rÀ  r/  rÄ  rÅ  r;  rÌ  r>   r>   r?   Ú	sampleH4c½  r=  r?  c                  C   r:  )r  r¸  rŒ   r  r¼  r½  r¾  r  r  rÀ  r/  rÄ  rÅ  r;  rÌ  r>   r>   r?   Ú	sampleH4dÙ  r=  r@  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 )r  r¸  rŒ   r¼  r½  r¾  r   r¿  rÀ  r/  rÄ  rÅ  )r   r  r’  rf   rg   ri   rh   rN   r   r‰   r2   rL   rÇ  rÈ  rÉ  rM   r  r†   rË  r�   rÌ  r>   r>   r?   Ú	sampleH5a÷  s    


rA  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À  r/  rÄ  rÅ  ©r   r  r’  rf   rg   ri   rh   rN   r   r‰   r2   rG   rH   rI   rJ   rL   rÇ  rÈ  rÉ  rM   r  r†   rË  r�   rÌ  r>   r>   r?   Ú	sampleH5b  ó(   


rC  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À  r/  rÄ  rÅ  rB  rÌ  r>   r>   r?   Ú
sampleH5c12  rD  rE  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À  r/  rÄ  rÅ  rB  rÌ  r>   r>   r?   Ú
sampleH5c2R  rD  rH  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 )rG  r¸  rŒ   r¼  r»  é›   r¾  r/   r~   r   r‚   r¿  rÀ  r/  rÄ  rÅ  rB  rÌ  r>   r>   r?   Ú
sampleH5c3r  rD  rJ  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 rF  rB  rÌ  r>   r>   r?   Ú
sampleH5c4’  rD  rK  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¿  r/  rÄ  rÅ  ©Ú
ShadedRectÚ
horizontalÚverticalr/   r‚   )#r   r  r�  rf   rg   ri   rh   rN   r   r‰   r2   rH   rI   rJ   rL   rÇ  rÈ  rÉ  rM   r  r†   rË  Ú reportlab.graphics.widgets.gridsrN  ÚfillColorStartr;   ÚfillColorEndÚorientationr4   ÚpinkÚwhiteÚcylinderModerK   r6   r�   )rŽ   rN   r�   rN  Úsym1Úsym2Úsym3r>   r>   r?   ÚsampleSymbol1±  sN   


r[  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 )rL  r¸  rŒ   rr   r¼  r½  r¾  r~   rÀ  r   r/  rÄ  rÅ  rM  rP  r/   r‚   rÉ   )#r   r  r�  rM   rl   rf   rg   ri   rh   rN   r   r‰   r2   rH   rI   rL   rÇ  r  r†   rË  rQ  rN  rK   r6   rŠ   rR  rV  rS  rT  rW  r4   Úmagentar‹   r;   r�   )rŽ   rN   r�   rN  r>   r>   r?   ÚsampleStacked1ç  sT   






r]  c                   @   s   e Zd ZdZddd„ZdS )Ú
SampleH5c4rG  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À  r/  rÄ  rÅ  ÚHBC)r7   )r   r@   r’  rf   rg   ri   rh   r  rN   r   r‰   r2   rG   rH   rI   rJ   rL   rÇ  rÈ  rÉ  rM   r  r†   rË  r�   )r=   rh   ri   ÚargsÚkwr�   r>   r>   r?   r@   #	  s$   
zSampleH5c4.__init__N)r¸  rŒ   )rA   rB   rC   r�  r@   r>   r>   r>   r?   r^   	  s    r^  )lÚ__version__r�  rG  r”  Úreportlab.libr   Úreportlab.lib.validatorsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Úreportlab.lib.utilsr   Ú"reportlab.graphics.widgets.markersr   r   Úreportlab.lib.formattersr   Ú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&   r'   Úreportlab.graphics.charts.areasr(   Ú!reportlab.graphics.charts.legendsr)   Ú	reportlabr*   r+   r,   rE   r�  r’  r“  rq   r°  r·  rÍ  rÑ  rÒ  ræ  rô  rö  rû  r  r  r  r  r  r  r   r#  r&  r'  r(  r)  r,  r-  r.  r1  r3  r4  r5  r9  r<  r>  r?  r@  rA  rC  rE  rH  rJ  rK  r[  r]  r^  r>   r>   r>   r?   Ú<module>   s�   D      8b#))28!!!!!#*)22    69