a
    ¦¾de© ã                   @   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+   Z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   Úbluer/   r0   r2   r1   ©Úself© r;   ú\/var/www/sistema_ama/venv/lib/python3.9/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                   @   sì  e Zd ZdZeeeeeee	e
fƒfƒddd�ee
dd�ee
dd�ee
dd�ed	d
d�ed	dd�ed	dd�ed	dd�ed	dd�ed	dd�ed	ddd�ed	dd�eeddd�eeddd�ed	dd�ee
dd�eedddƒdd�ed	ddd�eedd�eeddd�eeeedddd�dddd�dƒd �Zd!d"„ ZdRd#d$„Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ ZdSd<d=„ZdTd>d?„Zd@dA„ Z dBdC„ Z!dDdE„ Z"dFdG„ Z#dHdI„ Z$dJdK„ Z%dLdM„ Z&dNdO„ Z'dPdQ„ Z(d	S )UÚBarChartz(Abstract base class, unusable by itself.zrFlag to use absolute spacing values; use string of gsb for finer control
(g=groupSpacing,s=barSpacing,b=barWidth).r,   r-   zThe width of an individual bar.r*   zWidth between groups of bars.zWidth between individual bars.NzHandle of the individual bars.zHandle of the value axis.zHandle of the category axis.z/Data to be plotted, list of (lists of) numbers.z!Handle to the list of bar labels.zZFormatting string or function used for bar labels. Can be a list or list of lists of such.z`Callout function(label)
label._callOutInfo = (self,g,rowNo,colNo,x,y,width,height,x00,y00,x0,y0)zGexplicit array of bar label values, must match size of data if present.z,If true, reverse common category plot order.zLabel to use for N/A values.z<list of callables, will be called with self, xscale, yscale.z=width to leave for a category label to go between categories.ÚfirstÚlastÚautoz,where any label bar should appear first/lastzJcallable(bar,label=labelText,value=value,**kwds) to record bar informationa!  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=7z'Label to use for a group of N/A values.r   )ZemptyOKZNoneOKÚloz#dynamic 'mixed' category style case)ÚBASEÚuseAbsoluteÚbarWidthÚgroupSpacingÚ
barSpacingÚbarsÚ	valueAxisÚcategoryAxisÚdataÚ	barLabelsÚbarLabelFormatÚbarLabelCallOutÚbarLabelArrayÚreversePlotOrderÚnaLabelÚannotationsÚcategoryLabelBarSizeÚcategoryLabelBarOrderÚ	barRecordÚzIndexOverridesÚcategoryNALabelÚseriesOrderc              
   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 ƒƒ}|r t|||d  ||d  |
ƒS t|ddƒ�rb||d  }t|d	ƒrÌ|j}nt|d	ƒrÞ|j}nd }t|||| ||jpú|j|j	|j
d
�}|�r.t|||d  ||j�p*|jƒ}|�rX|�rXtƒ }| |¡ | |¡ |S |�p`|S t||||||	||
d�S d S )Nr.   r/   r1   r0   r4   ç       @r6   Fr2   ©r.   r0   r1   )r0   r.   r1   r/   )rL   ÚlenÚgetattrr   Úhasattrr2   r   r.   r/   r0   r1   r   Úaddr   )r:   ÚrowNoÚxÚyÚwidthÚheightZ	baseStyleÚstyleIdxÚstyler.   r/   r1   r0   r4   Zyh2ÚSÚLÚgr;   r;   r<   ÚmakeSwatchSampleW   s@    


ý&


ÿzBarChart.makeSwatchSamplec                 C   s   t t| j| d|ƒƒS )zreturn series name i or defaultr3   )r&   r`   rL   )r:   ÚiÚdefaultr;   r;   r<   ÚgetSeriesNamez   s    zBarChart.getSeriesNamec                 C   s&  | j jdvsJ d| j j ƒ‚| jr4tƒ | _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)rB   Ú
BarChart3DzAbstract Class %s InstantiatedÚstackedÚparallelÚparallel_3dÚmixedri   r   )éd   én   éx   é‚   )éF   éP   éU   éZ   é
   é   ÚcÚmiddler,   é   )*Ú	__class__r>   Ú_flipXYr!   rN   r"   rM   r   r    r   rA   Úvalidater%   r=   rK   rT   rO   rH   rI   rJ   r   r#   rP   Ú	boxAnchorÚ
textAnchorrQ   rS   Únudger)   rL   r0   r   Úblackr.   r1   Úredr/   Úgreenr8   rU   r[   rZ   r9   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 chartrB   z#Abstract Class BarChart has no demoéÈ   rv   )rƒ   r>   ÚNotImplementedErrorr   rb   )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 ƒ}|r’||8 }||O }||8 }|rN| t|ƒ¡ ||8 }qN|rÊ| dd„ t	|ƒD ƒ¡ |ræ| d	d„ t	|ƒD ƒ¡ || _
d S )
Nr\   c                 S   s   g | ]
}|f‘qS r;   r;   ©Ú.0Ússr;   r;   r<   Ú
<listcomp>È   ó    z+BarChart.getSeriesOrder.<locals>.<listcomp>c                    s(   h | ] }d |  krˆ krn q|’qS )r   r;   r‘   )Únr;   r<   Ú	<setcomp>Ï   r•   z*BarChart.getSeriesOrder.<locals>.<setcomp>c                    s   h | ]}ˆ   |d d¡r|’qS )r6   F)Ú	checkAttrr‘   ©rL   r;   r<   r—   Ð   r•   c                 s   s   | ]}|fV  qd S ©Nr;   r‘   r;   r;   r<   Ú	<genexpr>Ù   r•   z*BarChart.getSeriesOrder.<locals>.<genexpr>c                 s   s   | ]}|fV  qd S rš   r;   r‘   r;   r;   r<   r›   Û   r•   )r`   r_   rO   ÚrangerL   ÚsetÚappendÚtupleÚextendÚsortedÚ_seriesOrder)r:   ÚbsÚRZunseenÚlinesÚsrl   Úglr;   )rL   r–   r<   ÚgetSeriesOrderÄ   s.    

zBarChart.getSeriesOrderc                    s‚   | j j}| j‰ttttˆƒƒƒ}ˆ‰ |dvrxg ‰‡fdd„}|dkrN|ˆ Ž  n*|  ¡  | jD ]}|‡ fdd„|D ƒŽ  q\ˆ| _	d S )N©rs   rt   c                     sŠ   t dd„ | D ƒƒdg }|d d … }| D ]H}t|ƒD ]:\}}|pBd}|dkr^||  |7  < q4||  |7  < q4q(ˆ  |¡ ˆ  |¡ d S )Nc                 s   s   | ]}t |ƒV  qd S rš   )r_   )r’   Údr;   r;   r<   r›   ç   r•   zBBarChart._getConfigureData.<locals>._accumulate.<locals>.<genexpr>r   ç�íµ ÷Æ°¾)ÚmaxÚ	enumeraterž   )ÚDZpdataÚndatarª   rn   Úv)rO   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>)
rN   ri   rO   r¬   ÚlistÚmapr_   r¨   r¢   Ú_configureData)r:   ÚcAStyleÚccr±   Úbr;   )r´   rO   r<   Ú_getConfigureDataÞ   s    

zBarChart._getConfigureDatac                 C   s&   |   ¡  | j | j¡ | jj| jjfS )z Attempt to return the data range)r»   rM   Z	_setRanger·   Ú	_valueMinÚ	_valueMaxr9   r;   r;   r<   Ú
_getMinMaxú   s    zBarChart._getMinMaxc                 C   sX   | j }| | j| j|¡ |  ¡  | | j¡ | d¡}|jsP||krT||| krT|S |S )z8Position and configure value axis, return crossing valuer   )	rM   ÚsetPositionrd   re   r»   Ú	configurer·   ÚscaleZ	forceZero)r:   ÚorgÚlengthÚvAZ	crossesAtr;   r;   r<   Ú
_drawBegin   s    
zBarChart._drawBeginc                    sZ  | j }| j}| | j¡ |  ¡  tƒ }t| ddƒ}|�s| |  ¡ ¡ t|ddƒ}t|ddƒ}|st|j	|| |j
d� |sŠ|j	|| |j
d� | |  ¡ ¡ | |¡ | |¡ |rÂ|j	|| |j
d� |rØ|j	|| |j
d� t| ddƒD ]}| || |j|jƒ¡ qä�nNtdd	d
dddddd�‰ | ¡  d¡D �]}| ¡ }|�sB�q*z| d¡\}	}
W n:   td||d ‡ fdd„tˆ  ¡ ƒD ƒ¡f ƒ‚Y n0 |	ˆ 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 ƒ‚Y n0 |
ˆ |	< �q*dd„ ˆ  ¡ D ƒ‰ ˆ  ¡  |  ¡ }|j d¡}ˆ D ]ì\}
}	|	dk�r†| |  ¡ ¡ nÈ|	dk�rœ| |¡ n²|	dk�rº|j	|| |j
d� n”|	d k�rÐ| |¡ n~|	d!k�rî|j	|| |j
d� n`|	d"k�r| |¡ nJ|	d#k�r| |¡ n4|	dk�rdt| ddƒD ]}| || |j|jƒ¡ �q0�qd| `|S )$z"finalize the drawing of a barchartrZ   NZdrawGridLastF)ÚparentZdimrV   r;   r   r,   r‚   é   é   r   é   é   )Ú
backgroundrN   rM   rL   rP   ÚcategoryAxisGridÚvalueAxisGridrV   ú,ú=z?Badly formatted zIndex clause %r in %r
allowed variables are
%sÚ
c                    s   g | ]}d |ˆ | f ‘qS ©z%s=%rr;   ©r’   Úk©ÚZr;   r<   r”   1  r•   z(BarChart._drawFinish.<locals>.<listcomp>z9Unknown zIndex variable %r in %r
allowed variables are
%sc                    s   g | ]}d |ˆ | f ‘qS rÑ   r;   rÒ   rÔ   r;   r<   r”   3  r•   zCBad zIndex value %r in clause %r of zIndex
allowed variables are
%sc                    s   g | ]}d |ˆ | f ‘qS 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”   :  r•   éÿÿÿÿrË   rN   rÌ   rM   rÍ   rL   rP   )rN   rM   rÀ   r·   ÚcalcBarPositionsr   r`   rb   ZmakeBackgroundZmakeGridZgetGridDimsÚmakeBarsrÁ   ÚdictÚstripÚsplitÚ
ValueErrorÚjoinr¡   Úkeysr   Ú
isinstanceÚfloatÚintÚitemsÚsortÚcontentsÚpop)r:   ÚcArÄ   rl   ZzIndexZcAdglZvAdglÚaÚzrÓ   r°   rº   Úblr;   rÔ   r<   Ú_drawFinish  s„    

,ø

4
.6







.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rŽˆrŠdpŒd}	|	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… ‰nVˆdv �rXd
}|| }|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�r8d } }}|j‰ nàˆd
k�r\d}|| ||   }}n¼ˆdk�r€d}|| ||   }}n˜ˆdk�r®d }}|�r¨|| | | nd}njˆdk�rÒd}|| ||   }}nFˆdk�röd }}|| | | }n"ˆdk�rd
 }}|| | | }|| _|| _|| _| j}|j‰|j ‰|j!|j" }}|d  k�rb|k�rpn 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ød} t)|ƒD ]�\}!‰g ‰|�r‚|d
 |! n|!‰|ˆ|  ‰ˆ *|!dd¡‰	ˆ	�rÄ| d
7 } ||d
 | d  ‰nˆ| | 8 ‰t|ƒD ]}"||"|"ƒ �qØ|ˆƒ �qdnÒd} t)| jƒD ]Â\}#}$t|$ƒd
k�r dnd‰|$D ]œ}!|�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.
        rW   r   rX   rE   rD   rC   c                 3   s    | ]}t ˆ  |d d¡ƒV  qdS )r6   FN)rá   r˜   ©r’   Ú_r™   r;   r<   r›   o  r•   z,BarChart.calcBarPositions.<locals>.<genexpr>ru   r,   Nr©   rÊ   rº   r‚   rl   rÈ   r¦   ç      ð?rÇ   r   rÉ   r7   g      @c                    sH  ˆdkrˆˆ | ƒ ˆ ˆ	 }nˆ| ƒ\}}|ˆ }ˆ
|  }|d u rLd }ˆ}nÒˆdvràˆsà|dkr ˆˆ| ƒ}ˆrz|ˆk r†n|ˆkr†ˆ}ˆ|  |7  < ˆ| }qäˆˆ| ƒ}ˆrº|ˆkrÆn|ˆk rÆˆ}ˆ|  |7  < ˆ| }nˆ}ˆ|ƒ| }d|  k �rdk�rn nd}|dk �rd}ˆ  ˆ�r6|||ˆf�p@||ˆ|f¡ d S )NrÊ   r©   r«   ç:Œ0âŽyE¾ç:Œ0âŽyE>)rž   )ÚcolNoZaccxrd   rl   rì   Zdatumrg   re   )Ú_cscaleÚaccumNegÚaccumPosÚbarRowÚbaseLineÚcScaleÚflipXYÚ
groupWidthr6   rÂ   Úrowri   rH   ÚvARDÚvScalerf   ÚxValr;   r<   Ú_addBarÐ  s0    

z*BarChart.calcBarPositions.<locals>._addBarr6   Frs   rr   )+r„   re   rd   rN   rÁ   rO   r_   Ú_seriesCountr¬   rµ   r¶   Z
_rowLengthrJ   rK   rI   r`   ri   rL   Úsumrœ   r¢   Z_groupWidthrH   rß   Ústrrà   Ú_normFactorZ_scaleZ_normFactorBZ_normFactorGZ_normFactorSrM   ZreverseDirectionr¼   r½   Z	_baseLineÚlabelsZlabelPosFracÚ_barPositionsrž   rT   r­   r˜   )%r:   ræ   rO   ÚseriesCountZ	rowLengthZwGrK   rI   ZclbsZclboZ	lineCountZseriesMLineCountr“   ZbarsPerGroupZwBZwSZbGapBZbGapSZaW0ZaWZfBZfGZfSrÄ   ZvmZvMZoffsZbGapZlbpfZaBPrT   rý   ZlineSeenrc   rð   ZsbZsgr;   )rñ   rò   ró   rô   rL   rõ   rö   r÷   rø   r6   rÂ   rù   ri   rH   rú   rû   rf   rü   r<   r×   S  s   



*












 , 
zBarChart.calcBarPositionsc                 C   s¦   | j }t|ttfƒr2|| }t|ttfƒr2|| }|du r@d}nb|dkrX| j| | }nJt|ƒrt|| j| |  }n.t|dƒr’|| j| | ƒ}nd| }t|ƒ‚|S )zreturn formatted label textNÚvaluesÚ__call__z6Unknown formatter type %s, expected string or function)	rQ   rß   rµ   rŸ   rS   r   rO   ra   Ú	Exception)r:   rc   rð   ZlabelFmtZ	labelTextÚmsgr;   r;   r<   Ú_getLabelText  s     
zBarChart._getLabelTextc                 C   sâ   |j }t|ddƒ}|dk}|r$| }| }	}
|r4d}
|d|  }|dkrLdpNd| }|dkrj||d  }nh|d	kr˜|
dkrˆ||
 | }qÒ|| }|	 }	n:|d
krÆ|
dkr¶||
 | }qÒ|| }|	 }	n||
 | }|	|_|||	fS )zCompute x, y for a labelZ	boxTargetÚnormalÚantir   r7   r,   rÖ   ZmidÚhirF   )rˆ   r`   Z_pmv)r:   Úlabelrd   re   rf   rg   rˆ   Zbtr  ÚpmÚvaluerç   rº   r;   r;   r<   Ú_labelXY&  s.    
zBarChart._labelXYc           	      C   s8   |   ||¡}|r4|  || j||f |||||||¡	 d S rš   )r	  Ú	_addLabelrP   )	r:   rl   rc   rð   rd   re   rf   rg   Útextr;   r;   r<   Ú_addBarLabelC  s    zBarChart._addBarLabelFc
                 C   sr   |	d u r| j }	|	rn|	jrnt |	¡}	| jjdkr2dp4d}
|d u rB|
}|d u rN|
}| j|	j|	||||||||d�
S d S )Nr   rî   rï   )ÚcalcOnly)rU   r  ÚcopyrM   r½   r  )r:   rl   rc   rð   rd   re   rf   rg   r  Únar°   r;   r;   r<   Ú_addNABarLabelH  s    

zBarChart._addNABarLabelc                 C   sÎ  |j �rÊt||j|jƒ}| j}|r<|  ||||	|¡\}}}n|  |||||	¡\}}}t|dd ƒ}|d urŽ| | |¡}|| }}|rˆ|}q´|}n&|r¤|}||	d  }n||d  }|}t|dd ƒ}|d urâ| | |¡}|rÞ|}n|}|dk �r|�rd|j }d}nd|j	 }d}nd }}|
�r0|| || fS | 
|| || ¡ | |¡ |j|j }}|�r„|�r„| dt||||||d�¡ | |¡ t| dd ƒ}|�rÊ| |||||||	||||f|_||ƒ |`d S )NÚfixedEndr]   Ú
fixedStartr   éþÿÿÿ)r.   r0   rR   )Úvisibler   ÚfontNameÚfontSizer„   r  r`   Ú	_getValueÚdxÚdyÚ	setOriginÚsetTextZlineStrokeColorZlineStrokeWidthÚinsertr   rb   Z_callOutInfo)r:   r  r  rl   rc   rð   rd   re   rf   rg   r  Ú
labelWidthr÷   Úy0Úx0r  r  r°   Úx00Úy00r  r  r   ZsCZsWZalxr;   r;   r<   r  Q  sT    




(
zBarChart._addLabelc           	      C   sB   t ||||ƒ}|j|_|j|_|j|_|jr4|j|_| |¡ d S rš   )r   r0   r/   r.   r1   rb   )	r:   rl   rd   re   rf   rg   rc   ri   Ú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 ]6\}}t|ƒD ]$\}\}}}}d ||fvrVd||< qVqFg j}g j}t|ƒD �]b\}}t|ƒ}|| }|| }| 	|dd¡}g j}t|ƒD �]è\}\}}}}||f|v rú|||f pü|}d ||fv �rì|�r||v �r4|  
|||||||¡ nª|�rÞ||	v�rÞ|  
|||||||d|¡	}|�rÔ||
 | \}}}}|  
||
|||||d|¡	}|d |d  d }|d |d  d }| j
||
|||dd|d	� |	 |¡ |rÐ|d ƒ qÐd }t|d
ƒ�r
t |j¡}nt| j d
ƒ�r | j j}t|dd ƒ}|�r†|�r`|dk �rRt|j |ƒ}nt|j|ƒ}n&|dk �rzt|j |ƒ}nt|j|ƒ}|�r |�s¨|| }||d  }n|| }||d  }||ƒ ||ƒ |�r¤tt||ƒ|||j�pì|jƒ} | �r¤|| ƒ n¤|�r*||_||_||_||_| |¡ nzt|ƒdk�r¤t|ƒdk�r¤|jd u�s^|jd u�r¤|  |||||||¡ |�r¤||jd |  ||¡| j| | ||d� |  |||||||¡ qÐt |j!ƒD ].}|�rÆ|t"||j�pâ|j|j#|j$d�ƒ �qÆq’|j!D ]}!| |!¡ �qþ|j!D ]} | | ¡ �qd S )NrY   r,   r6   FTr   r]   g-Cëâ6?)r  r2   r5   r7   gH¯¼šò×z>rÖ   )r  r  rc   rð   r^   )%rL   r`   r  r„   r[   r_   rO   r­   rž   r˜   r  ra   r  Údeepcopyr2   Úminr5   r¬   r   r   r.   r/   rd   re   rf   rg   rb   Úabsr*  rä   r	  r  r   Ú__self__r   r0   r1   )"r:   rl   ÚlgrL   ÚbrÚBPr÷   ZcatNALZcatNNAZCBLZrowNoLrc   rù   rð   rd   re   rf   rg   r¥   ZlineSymsZ
styleCountrh   ZrowStyler6   ZlinePtsri   Zr0Zr1r2   r5   ZyLZxLÚsymÚplr;   r;   r<   Ú	_makeBarsŽ  s¦    


40ý

zBarChart._makeBarsc	                 C   sH  |j �rDt||j|jƒ}	| j}
|
r<|  |||||¡\}}}n|  |||||¡\}}}t|dd ƒ}|d urŽ| | |¡}|| }}|
rˆ|}q´|}n&|
r¤|}||d  }n||d  }|}t|dd ƒ}|d urâ| | |¡}|
rÞ|}n|}|dk �r|
�rd|j }d}nd|j	 }d}nd }}| 
|| || ¡ | |¡ || ¡ fS d S )Nr  r]   r  r   r  )r  r   r  r  r„   r  r`   r  r  r   r!  r"  Z	getBounds)r:   r  r  rc   rð   rd   re   rf   rg   r$  r÷   r%  r&  r  r  r°   r'  r(  r  r  r   r;   r;   r<   Ú_computeLabelPositionó  sD    




zBarChart._computeLabelPositionc                 C   s~   | j | j }}|r||_|r"||_| jrH| |  | 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)rN   rM   ÚjoinAxisr„   r¿   rÅ   rd   rf   re   rg   rÀ   r·   r×   ©r:   ræ   rÄ   r;   r;   r<   Ú_computeBarPositions  s    

 zBarChart._computeBarPositionsc              
   C   s  | j }|  ¡  t| jƒ}| j}g }|j}|r¦| j}|| j }	| j| j	 }
|D ]V}|D ]L\}}}}|| }|| }|t
||ƒt||ƒt
||ƒ| |	t||ƒ fƒ qTqLnx| j}|| j	 }	| j| j }
|D ]V}|D ]L\}}}}|| }|| }|t
||ƒt||ƒt
||ƒ| |	t||ƒ fƒ qÎqÆ| ¡  |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< n
| |¡ �q4|}d}d}t|ƒ}t|ƒD �]2\}}|d }|| }||
k�r �q|}d }}||k �rZ|| d |k�rZt
|| d |ƒ}t
|| d |ƒ}|d7 }�q||k�r¸||k�r
|}|�r�|||| || df�p¤|||| || df}||k�r
 �qnR||k�rØ|}|�rä|	| ||	|| df�pø||	| || |	df}||k�rØ �q�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„   r8  r_   rO   r  rž   rd   rf   re   rg   r,  r¬   rã   r­   )r:   ÚsizeÚrequiredr÷   ZlenDatar1  ÚCZaCrF   r  ÚendZbprd   re   ÚwÚhr°   rè   r¤   r€   r)  ZmaxSZmaxPZnCrn   ÚciZv0Zv1r²   ZaloZahir;   r;   r<   Ú_computeMaxSpace+  sl    

6
4
$J

4
4zBarChart._computeMaxSpacec                 C   s–  | j | j }}|r||_|r"||_| jrH| |  | j| j¡| j| j	¡ n| | j|  | j| j	¡| j¡ | 
| j¡ |  ¡  | j}g j}| j}t|ƒD ]ú\}}g j}t|ƒD ]Ø\}	\}
}}}d||fv �r@| j}|�r6|j�r6t |¡}| jjdkrödpød}|du �r|}|du �r|}||  |j|||	|
|||¡ƒ n|dƒ qª|  ||	¡}|�rz||  || j||	f ||	|
|||¡ƒ qª|dƒ qª||jƒ q”|jS )zLInformation function, can be called by charts which want to mess with labelsNr   rî   rï   )rN   rM   r6  r„   r¿   rÅ   rd   rf   re   rg   rÀ   r·   r×   rL   rž   r  r­   rU   r  r  r½   r5  r	  rP   r.  )r:   ræ   rÄ   rL   r¤   r1  rc   rù   r;  rð   rd   re   rf   rg   r  r°   r  r;   r;   r<   Ú_computeSimpleBarLabelPositionsk  s:    

 
 
(
z(BarChart._computeSimpleBarLabelPositionsc                 C   s&   t ƒ }t ƒ }|  ||¡ | |¡ |S rš   )r   r4  rb   )r:   rl   r/  r;   r;   r<   rØ   �  s
    
zBarChart.makeBarsc                 C   s^   | j j}| j}t|ƒ}tttt|ƒƒƒ}|dkrJ|d | j || j  }n| j}|| j	|  S )z:for dynamically computing the desired category axis lengthrs   r,   )
rN   ri   rO   r_   r¬   rµ   r¶   rK   rI   rJ   )r:   ri   rO   r–   Úmrø   r;   r;   r<   Ú_desiredCategoryAxisLength—  s    z#BarChart._desiredCategoryAxisLengthc                 C   sn   | j | j }}|r||_|r"||_| jrH| |  | j| j¡| j| j	¡ n| | j|  | j| j	¡| j¡ |  
¡ S rš   )rN   rM   r6  r„   r¿   rÅ   rd   rf   re   rg   rê   r7  r;   r;   r<   Údraw£  s    

 zBarChart.draw)N)FN)F))r>   r?   r@   Ú__doc__r   r%   r   r   r	   r   r   r$   r   r
   r   r   rA   rm   rp   r=   r�   r¨   r»   r¾   rÅ   rê   r×   r	  r  r  r  r  r*  r4  r5  r8  r@  rA  rØ   rC  rD  r;   r;   r;   r<   rB   4   sb   












	 ã #
=	H @
	
4	e,@%rB   c                   @   s   e Zd ZdZdZdS )ÚVerticalBarChartz3Vertical bar chart with multiple side-by-side bars.r   N©r>   r?   r@   rE  r„   r;   r;   r;   r<   rF  ­  s   rF  c                   @   s   e Zd ZdZdZdS )ÚHorizontalBarChartz5Horizontal bar chart with multiple side-by-side bars.r,   NrG  r;   r;   r;   r<   rH  ±  s   rH  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<   rb   º  s    z_FakeGroup.addc                 C   s   | j S rš   r³   r9   r;   r;   r<   r  ½  s    z_FakeGroup.valuec                 C   s   | j j| jd� d S )N)Úkey)r´   rã   rL  r9   r;   r;   r<   rã   À  s    z_FakeGroup.sort)N)r>   r?   r@   r=   rb   r  rã   r;   r;   r;   r<   rI  µ  s   
rI  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)rG   Útheta_xÚtheta_yÚzDepthÚzSpacer7   Nc                 C   sŒ   t  | ¡ | j}| j}|d u r$| j}| j}|d u r8| j}| jjdkrZ|| |d |  }n|d|  }|| j	9 }| j
| | _| j| | _d S )Nrt   r,   r‚   )rB   r×   rþ   rQ  rI   rR  rK   rN   ri   r  rO  Z_3d_dxrP  Z_3d_dy)r:   r  rQ  rR  Z	_3d_depthr;   r;   r<   r×   Ï  s    

zBarChart3D.calcBarPositionsc                 C   sZ   | j }|d u r| j}| j}|d u r(| j}| jjdkrL| j|||  |  }n
| j| }|S )Nrt   )rQ  rI   rR  rK   rN   ri   r  )r:   rc   rQ  rR  Ú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 rV||7 }| }||
| j 7 }||
| j 7 }| jr‚||	7 }n||	7 }| 	d|
|||||||f	¡ d S )Nr   )
rQ  rI   rR  rK   rT  r  rO  rP  r„   rb   )r:   rl   rd   re   rf   rg   rc   ri   rQ  rR  rS  Úz1r;   r;   r<   r*  é  s    

zBarChart3D._makeBarc                 C   sv   |   |¡}| j}	|	d u r| j}	|}
||| j 7 }||| j 7 }| jrN||	7 }n||	7 }| d||
||||||f	¡ d S )Nr,   )rT  rR  rK   rO  rP  r„   rb   )r:   rl   rc   rð   rd   re   rf   rg   rS  rR  rU  r;   r;   r<   r  û  s    

zBarChart3D._addBarLabelc                 C   s>  ddl m} t| jd�}|  ||¡ | ¡  tƒ }| j}| j}| 	¡ }| j
j}|dkr`| ¡  n$|dkr„dd„ tdd	„ |D ƒƒD ƒ}|D ]j}|d dkrˆ|d
d … \}	}
}}}}}}|
|	 }||||| ||| || || |jd |j|jdd� qˆ|D ]@}|d
krø|d
d … \}	}
}}}}}}t | |||||||¡ qø|S )Nr   )Ú_draw_3d_barr'   rr   ru   c                 S   s   g | ]}|d  ‘qS )r,   r;   rë   r;   r;   r<   r”     r•   z'BarChart3D.makeBars.<locals>.<listcomp>c                 s   s.   | ]&}|d  |d |d |d f|fV  qdS )r,   r‚   rÇ   rÈ   Nr;   )r’   Útr;   r;   r<   r›     r•   z&BarChart3D.makeBars.<locals>.<genexpr>r,   gÍÌÌÌÌÌÜ?)r/   ZfillColorShadedr.   r0   Zshading)Z!reportlab.graphics.charts.utils3drV  rI  Ú_cmpZr4  rã   r   rO  rP  r  rN   ri   Úreverser¡   r/   r.   r0   rB   r  )r:   rV  Zfgrl   rO  rP  Zfg_valuer¸   rW  rS  rU  rd   re   rf   rg   rc   ri   Zdzrð   r;   r;   r<   rØ     s6    
 ýzBarChart3D.makeBars)r>   r?   r@   r   rB   r   r   rA   rO  rP  rQ  rR  r×   rT  r*  r  rØ   r;   r;   r;   r<   rq   Ã  s   



ürq   c                   @   s   e Zd Zdd„ ZdS )ÚVerticalBarChart3Dc                 C   sB   t |d  |d |d |d  f|d  |d |d |d  fƒS )Nr,   rÇ   r   rÈ   r'   ©r:   rç   rº   r;   r;   r<   Ú<lambda>&  r•   zVerticalBarChart3D.<lambda>N©r>   r?   r@   rX  r;   r;   r;   r<   rZ  %  s   rZ  c                   @   s   e Zd Zdd„ ZdS )ÚHorizontalBarChart3Dc                 C   sB   t |d  |d |d |d  f|d  |d |d |d  fƒS )Nr,   rÈ   r   rÇ   r'   r[  r;   r;   r<   r\  )  r•   zHorizontalBarChart3D.<lambda>Nr]  r;   r;   r;   r<   r^  (  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dg|j_|  |¡ | S )z9A slightly pathologic bar chart with only TWO data items.é�  rŒ   ©é   é   é2   é}   é,  r   é<   é   Úneé   r  é   ÚYingÚYang©r   rF  rd   re   rg   rf   rO   r   r‰   r.   rM   ÚvalueMinÚvalueMaxÚ	valueSteprN   r  r†   r  r   ÚangleÚcategoryNamesrb   ©rŽ   rO   r�   r;   r;   r<   Ú	sampleV0a,  s&    





rt  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Œ   ©é*   rc  rd  re  r   rg  rh  ri  r  rj  úJan-99rm  rs  r;   r;   r<   Ú	sampleV0bK  s&    






rx  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;   rc  rd  re  r   rf  rg  rh  ri  r  )r   rF  rd   re   rg   rf   rO   r   r‰   r.   rM   rn  ro  rp  rN   r  r†   r  r   rr  rb   rs  r;   r;   r<   Ú	sampleV0ci  s$    




ry  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Œ   ©ra  r   rb  é   é%   é-   é   rÈ   ©é   rÉ   é   é   é&   é.   rb  r   rc  rd  re  r   rf  rg  rh  ri  r  rj  úJan Feb Mar Apr May Jun Jul Augú c                 S   s   g | ]}|d  ‘qS ©z-99r;   ©r’   r–   r;   r;   r<   r”   ¢  r•   zsampleV1.<locals>.<listcomp>)r   rF  rd   re   rg   rf   rO   r   r‰   r.   rM   rn  ro  rp  rN   r  r†   r  r   rq  rÛ   rr  rb   ©rŽ   rO   r�   Z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 )rz  ©ç333333@çÍÌÌÌÌÌÀr‚   r   gffffff"@©ç333333ã?çš™™™™™ÀéýÿÿÿrÈ   g333333@©zQ3 2000zYear to Datez	12 monthszAnnualised
3 yearszSince 07.10.99r_  rŒ   rc  rx   re  r   r~   éñÿÿÿrg  r   Ú	Helveticari  r–   r�   éÄÿÿÿ©r   rF  rd   re   rg   rf   rO   rK   rJ   rI   rM   rn  ro  rp  r  r  r  r†   r‡   rN   rr  r   rb   ©rO   r  rŽ   r�   r;   r;   r<   Ú	sampleV2a©  s6    ÿ








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 )rz  rŒ  r�  r“  r_  rŒ   rc  rx   re  r   r~   r”  rg  r•  ri  r–   r�   r–  r—  r˜  r;   r;   r<   Ú	sampleV2bÒ  s6    ÿ








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 )rz  ©r�  rŽ  r‚   r   ç{®Gáú#@©r�  r‘  r’  rÈ   rœ  r“  r_  rŒ   rc  rx   re  r‚   r~   r”  rg  r   r•  ri  r–   r�   r–  ú%0.2fr   rÉ   )r   rF  rd   re   rg   rf   rO   rK   rJ   rI   rM   rn  ro  rp  r  r  r  rN   rr  r†   r‡   r   rP   rˆ   rQ   r  rb   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-LinkedZCash©
g      ø¿ç333333Ó?r7   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~   r  r‚   r,   iƒÿÿÿé¯   i¦ÿÿÿ)#r_   r   rF  rd   re   rg   rf   rO   r   r‹   rL   r/   rQ   rP   r  r   r†   rq  r  r  rˆ   rM   r  rn  ro  rp  rN   ZtickUpZtickDownrr  r  r   Ú	translateÚrotaterb   ©ÚnamesZseries1Zseries2rŽ   r�   rl   r;   r;   r<   ÚsampleV3-  sN    









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dg|j_|  |¡ | S )úAA bar chart showing value axis region starting at *exactly* zero.r_  rŒ   r`  rc  rd  re  r   rf  rg  r–   éûÿÿÿrk  rl  ©r   rF  rd   re   rg   rf   rO   r   r‰   r.   rM   rn  ro  rp  rN   r  r†   r   rr  rb   rs  r;   r;   r<   Ú	sampleV4ae  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dg|j_|  |¡ | S )ú<A bar chart showing value axis region starting *below* zero.r_  rŒ   r`  rc  rd  re  éöÿÿÿrf  rg  r–   r¯  rk  rl  r°  rs  r;   r;   r<   Ú	sampleV4b‚  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dg|j_|  |¡ | S )z;A bar chart showing value axis region staring *above* zero.r_  rŒ   r`  rc  rd  re  r~   rf  rg  r–   r¯  rk  rl  r°  rs  r;   r;   r<   Ú	sampleV4cŸ  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dg|j_|  |¡ | S )ú<A bar chart showing value axis region entirely *below* zero.r_  rŒ   ©ióÿÿÿiìÿÿÿrc  rd  re  éâÿÿÿr³  rg  r–   r¯  rk  rl  r°  rs  r;   r;   r<   Ú	sampleV4d¼  s"    



r¹  ))r~   rf  )rb  rc  )rj  é(   )rº  rj  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Œ   rc  rd  re  r   rf  rg  r–   r¯  rk  rl  )r   ÚdataSample5rF  rd   re   rg   rf   rO   r   r‰   r.   rM   rn  ro  rp  rN   r  r†   r   rr  rb   rs  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Œ   rc  rd  re  r   rº  rb  r~   rf  rg  r–   r¯  rk  rl  ©r   r¼  rF  rd   re   rg   rf   rO   r   r‰   r.   rH   rI   rJ   rK   rM   rn  ro  rp  rN   r  r†   r   rr  rb   rs  r;   r;   r<   Ú	sampleV5bû  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 )ú6Make sampe simple bar chart but with absolute spacing.r_  rŒ   rc  rd  re  r,   rº  r   rf  rg  r–   r¯  rk  rl  r¿  rs  r;   r;   r<   Ú
sampleV5c1  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 )rÁ  r_  rŒ   rc  rd  re  r,   rº  rb  r   rf  rg  r–   r¯  rk  rl  r¿  rs  r;   r;   r<   Ú
sampleV5c2=  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 )rÁ  r_  rŒ   rc  rd  re  r,   rº  r   r~   rf  rg  r–   r¯  rk  rl  r¿  rs  r;   r;   r<   Ú
sampleV5c3^  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 )rÁ  r_  rŒ   rc  rd  re  r,   rº  rb  r~   r   rf  rg  r–   r¯  rk  rl  r¿  rs  r;   r;   r<   Ú
sampleV5c4  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dg|j_|  |¡ | S )z>Make a slightly pathologic bar chart with only TWO data items.r_  rŒ   r`  rc  rd  re  r   rf  rg  Úserj  rk  rl  ©r   rH  rd   re   rg   rf   rO   r   r‰   r.   rM   rn  ro  rp  rN   r  r†   rq  rr  rb   rs  r;   r;   r<   Ú	sampleH0a¢  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g|j_|  |¡ | S )z4Make a pathologic bar chart with only ONE data item.r_  rŒ   ru  rc  rd  re  r   rg  rÆ  rj  rw  rÇ  rs  r;   r;   r<   Ú	sampleH0b¿  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;   rc  rd  re  r   rf  rg  rÆ  rj  rÇ  rs  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 )rz  r_  rŒ   r{  r€  rc  rd  re  r   rf  rg  Úer†  r‡  c                 S   s   g | ]}|d  ‘qS rˆ  r;   r‰  r;   r;   r<   r”     r•   zsampleH1.<locals>.<listcomp>Zbarchart)r   rH  rd   re   rg   rf   rO   r   r‰   r.   rM   rn  ro  rp  rN   r  r†   rÛ   rr  rb   rŠ  r;   r;   r<   ÚsampleH1÷  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
 |j¡ ||j_d|jj_d|jj_d|jj_| |¡ |S )rz  rŒ  r�  r“  r_  rŒ   r{   rc  rx   re  r   r~   r”  rg  r   r•  ri  r–   r�   éjÿÿÿ)r   rH  rd   re   rg   rf   rO   rK   rJ   rI   rM   rn  ro  rp  r  r  r  r†   r‡   rÀ   rN   rr  r  rb   r˜  r;   r;   r<   Ú	sampleH2a  s8    ÿ








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 )rz  rŒ  r�  r“  r_  rŒ   r{   rc  rx   re  r   r~   r”  rg  r•  ri  r–   r�   rÍ  )r   rH  rd   re   rg   rf   rO   rK   rJ   rI   rM   rn  ro  rp  r  r  r  r†   r‡   rN   rr  r  rb   r˜  r;   r;   r<   Ú	sampleH2b@  s6    ÿ








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_d|j_d|_d|j_d|j_d|j_d|j_d|j_| |¡ |S )rz  r›  r�  r“  r_  rŒ   r{   rc  rx   re  r‚   r~   r”  rg  r   r•  ri  r–   r�   rÍ  rž  r   rÉ   )r   rH  rd   re   rg   rf   rO   rK   rJ   rI   rM   rn  ro  rp  r  r  r  r†   r‡   rN   rr  r  rP   rˆ   rQ   r   rb   r˜  r;   r;   r<   Ú	sampleH2ci  sD    ÿ








rÐ  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   rb  r§  éú   rž  r   r=  r•  rÉ   r~   r  r‚   r,   iVÿÿÿ) r_   r   rH  rd   re   rg   rf   rO   r   r‹   rL   r/   rQ   rP   r  r   r†   r  r  rˆ   rM   r  rn  ro  rp  rN   ZtickLeftZ	tickRightrr  r  r   rb   r«  r;   r;   r<   ÚsampleH3›  sD    






rÒ  c                  C   sx   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`  rc  rd  re  r   rf  rg  rË  rk  rl  ©r   rH  rd   re   rg   rf   rO   r   r‰   r.   rM   rn  ro  rp  rN   r  r†   rr  rb   rs  r;   r;   r<   Ú	sampleH4aÍ  s     


rÔ  c                  C   sx   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`  rc  rd  re  r³  rf  rg  rË  rk  rl  rÓ  rs  r;   r;   r<   Ú	sampleH4bé  s     


rÕ  c                  C   sx   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 )z<A bar chart showing value axis region starting *above* zero.r_  rŒ   r`  rc  rd  re  r~   rf  rg  rË  rk  rl  rÓ  rs  r;   r;   r<   Ú	sampleH4c  s     


rÖ  c                  C   sx   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·  rc  rd  re  r¸  r³  rg  rË  rk  rl  rÓ  rs  r;   r;   r<   Ú	sampleH4d!  s     


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Œ   rc  rd  re  r   rf  rg  rË  rk  rl  )r   r¼  rH  rd   re   rg   rf   rO   r   r‰   r.   rM   rn  ro  rp  rN   r  r†   rr  rb   rs  r;   r;   r<   Ú	sampleH5a?  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dg|j_|  |¡ | S )r¾  r_  rŒ   rc  rd  re  r   rº  rb  r~   rf  rg  rË  rk  rl  ©r   r¼  rH  rd   re   rg   rf   rO   r   r‰   r.   rH   rI   rJ   rK   rM   rn  ro  rp  rN   r  r†   rr  rb   rs  r;   r;   r<   Ú	sampleH5bZ  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dg|j_|  |¡ | S )z)A simple bar chart with absolute spacing.r_  rŒ   rc  rd  re  r,   r~   r   rf  rg  rË  rk  rl  rÙ  rs  r;   r;   r<   Ú
sampleH5c1z  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dg|j_|  |¡ | S ©ú'Simple bar chart with absolute spacing.r_  rŒ   rc  rd  re  r,   r~   rb  r   rf  rg  rË  rk  rl  rÙ  rs  r;   r;   r<   Ú
sampleH5c2š  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dg|j_|  |¡ | S )rÝ  r_  rŒ   rc  rb  é›   re  r,   r~   r   r‚   rf  rg  rË  rk  rl  rÙ  rs  r;   r;   r<   Ú
sampleH5c3º  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dg|j_|  |¡ | S rÜ  rÙ  rs  r;   r;   r<   Ú
sampleH5c4Ú  s(    


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Œ   rc  rd  re  r~   rg  rÇ   r   rf  rË  rk  rl  ©Ú
ShadedRectZ
horizontalÚverticalr,   r‚   )#r   r¼  rF  rd   re   rg   rf   rO   r   r‰   r.   rI   rJ   rK   rM   rn  ro  rp  rN   r  r†   rr  Ú reportlab.graphics.widgets.gridsrä  ÚfillColorStartr8   ÚfillColorEndÚorientationr0   ZpinkÚwhiteÚcylinderModerL   r2   rb   )rŽ   rO   r�   rä  Zsym1Zsym2Z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 )râ  r_  rŒ   rr   rc  rd  re  r~   rg  r   rË  rk  rl  rã  rå  r,   r‚   rÇ   )#r   r¼  rF  rN   ri   rd   re   rg   rf   rO   r   r‰   r.   rI   rJ   rM   rn  r  r†   rr  ræ  rä  rL   r2   rŠ   rç  rê  rè  ré  rë  r0   Zmagentar‹   r8   rb   )rŽ   rO   r�   rä  r;   r;   r<   ÚsampleStacked1/	  sT    






rí  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 )Nrc  rd  re  r,   r~   rb  r   rf  rg  rË  rk  rl  ZHBC)r3   )r   r=   rH  rd   re   rg   rf   r¼  rO   r   r‰   r.   rH   rI   rJ   rK   rM   rn  ro  rp  rN   r  r†   rr  rb   rA  )r:   rf   rg   ÚargsÚkwr�   r;   r;   r<   r=   k	  s&    
zSampleH5c4.__init__N)r_  rŒ   )r>   r?   r@   rE  r=   r;   r;   r;   r<   rî  h	  s   rî  )hÚ__version__rE  r  rJ  Úastr   Zreportlab.libr   Zreportlab.lib.validatorsr   r   r   r   r   r	   r
   r   r   r   r   r   Zreportlab.lib.utilsr   r   Z"reportlab.graphics.widgets.markersr   r   Zreportlab.lib.attrmapr   r   Zreportlab.pdfbase.pdfmetricsr   Zreportlab.graphics.widgetbaser   r   r   Zreportlab.graphics.shapesr   r   r   r   r   Zreportlab.graphics.charts.axesr   r    r!   r"   Z$reportlab.graphics.charts.textlabelsr#   r$   Zreportlab.graphics.charts.areasr%   Z!reportlab.graphics.charts.legendsr&   Z	reportlabr(   r)   rB   rF  rH  rI  rq   rZ  r^  rt  rx  ry  r‹  r™  rš  rŸ  r­  r±  r´  rµ  r¹  r¼  r½  rÀ  rÂ  rÃ  rÄ  rÅ  rÈ  rÉ  rÊ  rÌ  rÎ  rÏ  rÐ  rÒ  rÔ  rÕ  rÖ  r×  rØ  rÚ  rÛ  rÞ  rà  rá  rì  rí  rî  r;   r;   r;   r<   Ú<module>   s�   8        b#))28!!!!!#*)22    69