U
    '1e[                    @   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 ZKd:d;d<d=gZLd>d? ZMd@dA ZNdBdC ZOdDdE ZPdFdG ZQdHdI ZRdJdK ZSdLdM ZTdNdO ZUdPdQ ZVdRdS ZWdTdU ZXdVdW ZYdXdY ZZdZd[ Z[d\d] Z\d^d_ Z]d`da Z^d:d;d<d=gZLdbdc Z_ddde Z`dfdg Zadhdi Zbdjdk Zcdldm Zddndo Zedpdq ZfG drds dse(ZgdS )tz3.3.0zThis 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;   G/tmp/pip-unpacked-wheel-109iniqw/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 }|rt|||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   sD    


  


 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kst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>   AssertionError_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>   s     z+BarChart.getSeriesOrder.<locals>.<listcomp>c                    s(   h | ] }d |  kr krn q|qS )r   r;   r   )nr;   r<   	<setcomp>   s
      
  z*BarChart.getSeriesOrder.<locals>.<setcomp>c                    s   h | ]}  |d dr|qS )r6   F)	checkAttrr   rL   r;   r<   r      s      c                 s   s   | ]}|fV  qd S Nr;   r   r;   r;   r<   	<genexpr>   s     z*BarChart.getSeriesOrder.<locals>.<genexpr>c                 s   s   | ]}|fV  qd S r   r;   r   r;   r;   r<   r      s     )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k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      s     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      s     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X |	 krtd|	 d fddt  D f z t|
}
t|
ttfstW n<   td|
||d fddt  D f Y nX |
 |	< 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  s     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  s     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  s     c                 S   s   g | ]\}}||fqS r;   r;   )r   r   r   r;   r;   r<   r   :  s     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intr   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rdpd}	|	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krXd
}|| }|d
 | }|}|}n*|}|dg dd |}d } }}|| |  | _| jrttsdn(dd
dk  ddk  ddk  ndtdd
 }|| }dkr|  | _ } }}ndkr8d } }}|j nd
kr\d}|| ||   }}ndkrd}|| ||   }}ndkrd }}|r|| | | nd}njdkrd}|| ||   }}nFdkrd }}|| | | }n"dkrd
 }}|| | | }|| _|| _|| _| j}|j|j |j! }}|d  kr\|krjn 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rd} t(|D ]\}!g |rz|d
 |! n|!||  )|!dd		r| d
7 } ||d
 | d  n| | 8 t|D ]}"||"|" q| q\nd} t(| jD ]\}#}$t|$d
krdnd|$D ]}!|r6|d
 |# n|#||  g ||! )|!dd		r| d
7 } ||d
 | d  n| | 8 t|D ]}"||"|"| |#  q| q qdS )zWorks 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  s     z,BarChart.calcBarPositions.<locals>.<genexpr>ru   r,   Nr   r   r   r   rl   r   r         ?r   r   r   r7   g      @c                    s&  dkr |   	 }n| \}}| }
|  }|d krLd }}ndkrĈs|dkr| }|krx}|  |7  < | }qȈ| }|k r}|  |7  < | }n}|| }d|  k rdkrn nd}|dk rd} r|||fp|||f d S )Nr   r   r   :0yE:0yE>)r   )colNoZaccxrd   rl   r   Zdatumrg   re   )_cscaleaccumNegaccumPosbarRowbaseLinecScaleflipXY
groupWidthr6   r   rowri   rH   vScalerf   xValr;   r<   _addBar  s6     
 
 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   r   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   rf   r   r<   r   S  s    



*












 * 
zBarChart.calcBarPositionsc                 C   s   | j }t|ttfr2|| }t|ttfr2|| }|dk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%  s2      zBarChart._labelXYc           	      C   s8   |  ||}|r4| || j||f |||||||	 d S r   )r  	_addLabelrP   )	r:   rl   rc   r   rd   re   rf   rg   textr;   r;   r<   _addBarLabelB  s    zBarChart._addBarLabelFc
                 C   sr   |	d kr| j }	|	rn|	jrnt|	}	| jjdkr2dp4d}
|d krB|
}|d k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<   _addNABarLabelG  s     

  zBarChart._addNABarLabelc                 C   s  |j rt||j|j}| j}|r<| ||||	|\}}}n| |||||	\}}}t|dd }|d k	r|| |}|| }}|r|}q|}n&|r|}||	d  }n||d  }|}t|dd }|d k	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  P  sX    



 
 
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krVd||< qVqFg j}g j}t|D ]b\}}t|}|| }|| }|	|dd}g j}t|D ]\}\}}}}||f|kr|||f p|}d ||fkr|r||kr4| 
||||||| n|r||	kr| 
|||||||d|	}|r||
 | \}}}}| 
||
|||||d|	}|d |d  d }|d |d  d }| j
||
|||dd|d	 |	| |r|d  qd }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  }|| || |rtt|||||jp|j} | r||  n|r*||_||_||_||_|| nzt|dkrt|dkr|jd k	s^|jd k	r| ||||||| |r||jd | ||| j| | ||d | ||||||| qt |j!D ].}|r|t"||jp|j|j#|j$d qq|j!D ]}!||! q|j!D ]} ||  qd S )NrY   r,   r6   FTr   r]   g-C6?)r  r2   r5   r7   gHz>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 *

zBarChart._makeBarsc	                 C   sH  |j rDt||j|j}	| j}
|
r<| |||||\}}}n| |||||\}}}t|dd }|d k	r|| |}|| }}|
r|}q|}n&|
r|}||d  }n||d  }|}t|dd }|d k	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 qq|  |d g}|D ]}|d }|d |d k r|d |d k rt
|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   r7  r_   rO   r  r   rd   rf   re   rg   r+  r   r   r   )r:   sizerequiredr   ZlenDatar0  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*  sr    

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kr@| j}|r6|jr6t|}| jjdkrdpd}|dkr|}|dk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   r5  r   r   r   rd   rf   re   rg   r   r   r   rL   r   r  r   rU   r  r  r   r4  r  rP   r-  )r:   r   r   rL   r   r0  rc   r   r:  r   rd   re   rf   rg   r  r   r  r;   r;   r<   _computeSimpleBarLabelPositionsj  sB       

 
  
(
z(BarChart._computeSimpleBarLabelPositionsc                 C   s&   t  }t  }| || || |S r   )r   r3  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   r5  r   r   r   rd   rf   re   rg   r   r6  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)  r3  r4  r7  r?  r@  r   rB  rC  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@   rD  r   r;   r;   r;   r<   rE    s   rE  c                   @   s   e Zd ZdZdZdS )HorizontalBarChartz5Horizontal bar chart with multiple side-by-side bars.r,   NrF  r;   r;   r;   r<   rG    s   rG  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   rK  r9   r;   r;   r<   r     s    z_FakeGroup.sort)N)r>   r?   r@   r=   rb   r  r   r;   r;   r;   r<   rH    s   
rH  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 kr$| j}| j}|d kr8| j}| jjdkrZ|| |d |  }n|d|  }|| j	9 }| j
| | _| j| | _d S )Nrt   r,   r   )rB   r   r   rP  rI   rQ  rK   rN   ri   r   rN  Z_3d_dxrO  Z_3d_dy)r:   r  rP  rQ  Z	_3d_depthr;   r;   r<   r     s    
  
zBarChart3D.calcBarPositionsc                 C   sZ   | j }|d kr| j}| j}|d kr(| j}| jjdkrL| j|||  |  }n
| j| }|S )Nrt   )rP  rI   rQ  rK   rN   ri   r   )r:   rc   rP  rQ  z0r;   r;   r<   _calc_z0  s      
zBarChart3D._calc_z0c                 C   s   | j }|d kr| j}| j}	|	d kr(| j}	| |}
|
|| j  }|dk rV||7 }| }||
| j 7 }||
| j 7 }| jr||	7 }n||	7 }|	d|
|||||||f	 d S )Nr   )
rP  rI   rQ  rK   rS  r   rN  rO  r   rb   )r:   rl   rd   re   rf   rg   rc   ri   rP  rQ  rR  z1r;   r;   r<   r)    s"      

zBarChart3D._makeBarc                 C   sv   |  |}| j}	|	d kr| j}	|}
||| j 7 }||| j 7 }| jrN||	7 }n||	7 }|d||
||||||f	 d S )Nr,   )rS  rQ  rK   rN  rO  r   rb   )r:   rl   rc   r   rd   re   rf   rg   rR  rQ  rT  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rd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     s     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     s     z&BarChart3D.makeBars.<locals>.<genexpr>r,   g?)r/   ZfillColorShadedr.   r0   Zshading)Z!reportlab.graphics.charts.utils3drU  rH  _cmpZr3  r   r   rN  rO  r  rN   ri   reverser   r/   r.   r0   rB   r  )r:   rU  Zfgrl   rN  rO  Zfg_valuer   rV  rR  rT  rd   re   rf   rg   rc   ri   Zdzr   r;   r;   r<   r     s:    
   zBarChart3D.makeBars)r>   r?   r@   r   rB   r   r   rA   rN  rO  rP  rQ  r   rS  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>%      zVerticalBarChart3D.<lambda>Nr>   r?   r@   rW  r;   r;   r;   r<   rY  $  s   rY  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'   rZ  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   rE  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<   	sampleV0bJ  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   rE  rd   re   rg   rf   rO   r   r   r.   rM   rn  ro  rp  rN   r  r   r  r  rr  rb   rs  r;   r;   r<   	sampleV0ch  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     s     zsampleV1.<locals>.<listcomp>)r   rE  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   rE  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   rE  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$tdt | t |ks<t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)\(?gp=
ף?g)\(?g)\(?r  r  bad datar_  r   r   rv      r  r<  r}   r  r   r~   r  r   r,   i   i)$r_   r   r   rE  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   rE  rd   re   rg   rf   rO   r   r   r.   rM   rn  ro  rp  rN   r  r   r  rr  rb   rs  r;   r;   r<   	sampleV4ad  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   iirc  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   dataSample5rE  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  rE  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   rG  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     s     zsampleH1.<locals>.<listcomp>Zbarchart)r   rG  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   rG  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   rG  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   rG  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<   	sampleH2ch  sD    








r  c                  C   s"  d} d}d}t | t |ks$tdt | t |ks<t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   r   rG  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   rG  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  rG  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  rG  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<   	sampleH5bY  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<   
sampleH5c1y  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  rE  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  rE  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| ||f|| 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=   rG  rd   re   rg   rf   r  rO   r   r   r.   rH   rI   rJ   rK   rM   rn  ro  rp  rN   r  r   rr  rb   r@  )r:   rf   rg   argskwr   r;   r;   r<   r=   j	  s&    
zSampleH5c4.__init__N)r_  r   )r>   r?   r@   rD  r=   r;   r;   r;   r<   r  g	  s   r  )h__version__rD  r  rI  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   rE  rG  rH  rq   rY  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