o
    e#                    @   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.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;   SD:\Projects\ConvertPro\env\Lib\site-packages\reportlab/graphics/charts/barcharts.py__init__,   s
   
zBarChartProperties.__init__)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r	   _attrMapr=   r;   r;   r;   r<   r)      s    





r)   c                   @   sF  e Zd ZdZedgi dedeeeee	e
ffddddee
dd	d
ee
dd	dee
dd	deddd	deddd	deddd	deddd	deddd	deddd	dedddddeddd	deed ddd!eed"ddd#edd$d	d%ee
d&d	d'eed(d)d*d+d	d,edd-ddd.eed/d	d0eed1ddd2eeeed3d3dd4d3ddd4d5Zd6d7 Zdhd8d9Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFdG ZdHdI ZdJdK ZdLdM ZdNdO ZdidQdRZdjdSdTZdUdV Z dWdX Z!dYdZ Z"d[d\ Z#d]d^ Z$d_d` Z%dadb Z&dcdd Z'dedf Z(dS )kBarChartz(Abstract base class, unusable by itself.BASEuseAbsolutezrFlag to use absolute spacing values; use string of gsb for finer control
(g=groupSpacing,s=barSpacing,b=barWidth).r,   r-   barWidthzThe width of an individual bar.r*   groupSpacingzWidth between groups of bars.
barSpacingzWidth between individual bars.barsNzHandle of the individual bars.	valueAxiszHandle of the value axis.categoryAxiszHandle of the category axis.dataz/Data to be plotted, list of (lists of) numbers.	barLabelsz!Handle to the list of bar labels.barLabelFormatzZFormatting string or function used for bar labels. Can be a list or list of lists of such.barLabelCallOutz`Callout function(label)
label._callOutInfo = (self,g,rowNo,colNo,x,y,width,height,x00,y00,x0,y0)barLabelArrayzGexplicit array of bar label values, must match size of data if present.reversePlotOrderz,If true, reverse common category plot order.naLabelzLabel to use for N/A values.annotationsz<list of callables, will be called with self, xscale, yscale.categoryLabelBarSizez=width to leave for a category label to go between categories.categoryLabelBarOrderfirstlastautoz,where any label bar should appear first/last	barRecordzJcallable(bar,label=labelText,value=value,**kwds) to record bar informationzIndexOverridesa!  None (the default ie use old z ordering scheme) or a ',' separated list of key=value (int/float) for new zIndex ordering. If used defaults are
    background=0,
    categoryAxis=1,
    valueAxis=2,
    bars=3,
    barLabels=4,
    categoryAxisGrid=5,
    valueAxisGrid=6,
    annotations=7categoryNALabelz'Label to use for a group of N/A values.seriesOrderr   )ZemptyOKZNoneOKloz#dynamic 'mixed' category style casec              
   C   sn  | j }|t| }|| }t|dt|dd }	t|dt|dd }
t|dt|dd }t|dt|dd }t|dt|dd }|rPt|||d  ||d  |
S t|ddr||d  }t|d	re|j}nt|d	rn|j}nd }t|||| ||jp||j|j	|j
d
}|rt|||d  ||jp|j}|r|rt }|| || |S |p|S t||||||	||
dS )Nr.   r/   r1   r0   r4          @r6   Fr2   r.   r0   r1   )r0   r.   r1   r/   )rH   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`   rH   )r:   idefaultr;   r;   r<   getSeriesNamez   s   zBarChart.getSeriesNamec                 C   s&  | j jdvsJ d| j j | jrt | _t | _nt | _t | _t	dddd| jj
d _t|  d| _d| _d	d
g| _d| _d| _d| _d| _tt| _d| j_d| j_d | _d | _d| j_tt| _d| j_tj | j_!d | j_"tj#| jd _$tj%| jd _$tj&| jd _$d  | _'| _(d | _)d S )N)rB   
BarChart3DzAbstract Class %s Instantiatedstackedparallelparallel_3dmixedri   r   )d   n   x      )F   P   U   Z   
      cmiddler,      )*	__class__r>   _flipXYr!   rJ   r"   rI   r   r    r   rA   validater%   r=   rG   rP   rK   rD   rE   rF   r   r#   rL   	boxAnchor
textAnchorrM   rO   nudger)   rH   r0   r   blackr.   r1   redr/   greenr8   rQ   rZ   rY   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 }|rI||8 }||O }||8 }|rV|t| ||8 }q'|re|dd t	|D  |rs|d	d t	|D  || _
d S )
Nr[   c                 S   s   g | ]}|fqS r;   r;   .0ssr;   r;   r<   
<listcomp>   s    z+BarChart.getSeriesOrder.<locals>.<listcomp>c                    s(   h | ]}d |  kr krn n|qS )r   r;   r   )nr;   r<   	<setcomp>   s   ( z*BarChart.getSeriesOrder.<locals>.<setcomp>c                    s   h | ]}  |d dr|qS )r6   F)	checkAttrr   rH   r;   r<   r      s    c                 s       | ]}|fV  qd S Nr;   r   r;   r;   r<   	<genexpr>       z*BarChart.getSeriesOrder.<locals>.<genexpr>c                 s   r   r   r;   r   r;   r;   r<   r      r   )r`   r_   rK   rangerH   setappendtupleextendsorted_seriesOrder)r:   bsRZunseenlinessrl   glr;   )rH   r   r<   getSeriesOrder   s0   

zBarChart.getSeriesOrderc                    s   | j j}| jtttt} |dvr<g fdd}|dkr'|   n|   | jD ]}| fdd|D   q.| _	d S )Nrs   rt   c                     s   t dd | D dg }|d d  }| D ]$}t|D ]\}}|p!d}|dkr/||  |7  < q||  |7  < qq |  | d S )Nc                 s   s    | ]}t |V  qd S r   )r_   )r   dr;   r;   r<   r          zBBarChart._getConfigureData.<locals>._accumulate.<locals>.<genexpr>r   ư)max	enumerater   )DZpdataZndatar   rn   v)rK   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>)
rJ   ri   rK   r   listmapr_   r   r   _configureData)r:   cAStyleccr   br;   )r   rK   r<   _getConfigureData   s   


zBarChart._getConfigureDatac                 C   s&   |    | j| j | jj| jjfS )z Attempt to return the data range)r   rI   Z	_setRanger   	_valueMin	_valueMaxr9   r;   r;   r<   
_getMinMax   s   zBarChart._getMinMaxc                 C   sX   | j }|| j| j| |   || j |d}|js(||kr*||| kr*|S |S )z8Position and configure value axis, return crossing valuer   )	rI   setPositionrd   re   r   	configurer   scaleZ	forceZero)r:   orglengthvAZ	crossesAtr;   r;   r<   
_drawBegin   s   
"zBarChart._drawBeginc                    sR  | j }| j}|| j |   t }t| dd}|s||   t|dd}t|dd}|s9|j	|| |j
d |sD|j	|| |j
d ||   || || |r`|j	|| |j
d |rk|j	|| |j
d t| ddD ]}||| |j|j qq| `|S tdd	d
dddddd | dD ]w}| }|sqz	|d\}	}
W n   td||d fddt  D f |	 vrtd|	 d fddt  D f zt|
}
t|
ttfsJ W n   td|
||d fddt  D f |
 |	< qdd   D     |  }|jd} D ]}\}
}	|	dkr9||   q'|	dkrE|| q'|	dkrU|j	|| |j
d q'|	d kra|| q'|	d!krq|j	|| |j
d q'|	d"kr}|| q'|	d#kr|| q'|	dkrt| ddD ]}||| |j|j qq'| `|S )$z"finalize the drawing of a barchartrY   NZdrawGridLastF)parentdimrR   r;   r   r,   r         r         )
backgroundrJ   rI   rH   rL   categoryAxisGridvalueAxisGridrR   ,=z?Badly formatted zIndex clause %r in %r
allowed variables are
%s
c                       g | ]
}d | | f qS z%s=%rr;   r   kZr;   r<   r   1      z(BarChart._drawFinish.<locals>.<listcomp>z9Unknown zIndex variable %r in %r
allowed variables are
%sc                    r   r   r;   r   r   r;   r<   r   3  r   zCBad zIndex value %r in clause %r of zIndex
allowed variables are
%sc                    r   r   r;   r   r   r;   r<   r   8  r   c                 S   s   g | ]\}}||fqS r;   r;   )r   r   r   r;   r;   r<   r   :  s    r   rJ   r   rI   r   rH   rL   )rJ   rI   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   

(1
..0








*zBarChart._drawFinishc           %         s  | j r	| j
n| j
| j}|j| j}t| }| _tt	t
t| | _}| j}| j}| j}t| dd}t| dd}	|	dkrGrEdpFd}	|	dk}	|j| jtfddt|D }
||
 }d	kr| j}t||
 }|| }|d
 | }|d
kr|}|}nd }}|| dg dd n*dv rd
}|| }|d
 | }|}|}n|}|dg dd |}d } }}|| |  | _| jrttsdndd
dv   ddv   ddv   ndtdd
 }|| }dkr|  | _ } }}ndkrd } }}|j npd
kr)d}|| ||   }}n^dkr;d}|| ||   }}nLdkrRd }}|rO|| | | nd}n5dkrdd}|| ||   }}n#dkrvd }}|| | | }ndkrd
 }}|| | | }|| _|| _|| _| j}|j|j |j!}}|d  kr|krn 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rtd} t(|D ]H\}!g |r8|d
 |! n|!||  )|!dd		rY| d
7 } ||d
 | d  n| | 8 t|D ]}"||"|" qc| q)dS d} t(| jD ]a\}#}$t|$d
krdnd|$D ]N}!|r|d
 |# n|#||  g ||! )|!dd		r| d
7 } ||d
 | d  n| | 8 t|D ]}"||"|"| |#  q| qq{d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.
        rS   r   rT   rW   rV   rU   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 u r&d }}nXdvrbsb|dkrI| }|kr<}|  |7  < | }n| }|k rU}|  |7  < | }n}|| }d|  k rtdkr~n nd}|dk r~d} 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   rD   vScalerf   xValr;   r<   _addBar  s0   

&z*BarChart.calcBarPositions.<locals>._addBarr6   Frs   rr   )*r   re   rd   rJ   r   rK   r_   _seriesCountr   r   r   Z
_rowLengthrF   rG   rE   r`   ri   rH   sumr   r   Z_groupWidthrD   r   strr   _normFactorZ_scaleZ_normFactorBZ_normFactorGZ_normFactorSrI   r   r   Z	_baseLinelabelsZlabelPosFrac_barPositionsr   rP   r   r   )%r:   r   rK   seriesCountZ	rowLengthZwGrG   rE   ZclbsZclboZ	lineCountZseriesMLineCountr   ZbarsPerGroupZwBZwSZbGapBZbGapSZaW0ZaWZfBZfGZfSr   vmZvMZoffsZbGapZlbpfZaBPrP   r   ZlineSeenrc   r   sbZsgr;   )r   r   r   r   rH   r   r   r   r   r6   r   r   ri   rD   r   rf   r   r<   r   S  s
  

*












 *
 zBarChart.calcBarPositionsc                 C   s   | j }t|ttfr|| }t|ttfr|| }|du r!d}|S |dkr.| j| | }|S t|r=|| j| |  }|S t|drM|| j| | }|S d| }t|)zreturn formatted label textNvalues__call__z6Unknown formatter type %s, expected string or function)	rM   r   r   r   rO   r   rK   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| }| }	}
|rd}
|d|  }|dkr&dp'd| }|dkr5||d  }n4|d	krL|
dkrD||
 | }n%|| }|	 }	n|d
krc|
dkr[||
 | }n|| }|	 }	n||
 | }|	|_|||	fS )zCompute x, y for a labelZ	boxTargetnormalantir   r7   r,   r   midhir\   )r   r`   Z_pmv)r:   labelrd   re   rf   rg   r   Zbtr  pmvaluer   r   r;   r;   r<   _labelXY%  s.   

zBarChart._labelXYc           	      C   s<   |  ||}|r| || j||f |||||||	 d S d S r   )r  	_addLabelrL   )	r:   rl   rc   r   rd   re   rf   rg   textr;   r;   r<   _addBarLabelB  s   (zBarChart._addBarLabelFc
                 C   sv   |	d u r| j }	|	r7|	jr9t|	}	| jjdkrdpd}
|d u r!|
}|d u r'|
}| j|	j|	||||||||d
S d S d S )Nr   r   r   )calcOnly)rQ   r  copyrI   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 urF|| |}||}}|rC|}n|}n|rQ|}||	d  }n||d  }|}t|dd }|d urp|| |}|rn|}n|}|dk r|r~d|j }d}nd|j	 }d}nd }}|
r|| || fS |
|| ||  || |j|j}}|r|r|dt||||||d || t| dd }|r| |||||||	||||f|_|| |`d S d S d S )NfixedEndr]   
fixedStartr   )r.   r0   rN   )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r|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 ]\}}t|D ]\}\}}}}d ||fvr=d||< q+q#g j}g j}t|D ]\}}t|}|| }|| }|	|dd}g j}t|D ]m\}\}}}}||f|v r}|||f p~|}d ||fv r|r||v r| 
||||||| nR|r||	vr| 
|||||||d|	}|r||
 | \}}}}| 
||
|||||d|	}|d |d  d }|d |d  d }| j
||
|||dd|d	 |	| |r|d  qhd }t|d
rt|j}nt| j d
r	| j j}t|dd }|r<|r)|dk r"t|j |}nt|j|}n|dk r6t|j |}nt|j|}|ry|sM|| }||d  }n
|| }||d  }|| || |rxtt|||||jpo|j} | rx||  nR|r||_||_||_||_|| n=t|dkrt|dkr|jd us|jd ur| ||||||| |r||jd | ||| j| | ||d | ||||||| qht |j!D ]}|r|t"||jp|j|j#|j$d qqI|j!D ]}!||! q|j!D ]} ||  qd S )NrX   r,   r6   FTr   r]   g-C6?)r  r2   r5   r7   gHz>r   )r  r  rc   r   r^   )%rH   r`   r  r   rZ   r_   rK   r   r   r   r  ra   r  deepcopyr2   minr5   r   r   r   r.   r/   rd   re   rf   rg   rb   absr0  r   r  r  r   __self__r   r0   r1   )"r:   rl   lgrH   brBPr   ZcatNALZcatNNAZCBLZrowNoLrc   r   r   rd   re   rf   rg   r   ZlineSymsZ
styleCountrh   ZrowStyler6   ZlinePtsri   Zr0r1r2   r5   ZyLZxLsymplr;   r;   r<   	_makeBars  s   



40

zBarChart._makeBarsc	                 C   sB  |j rt||j|j}	| j}
|
r| |||||\}}}n| |||||\}}}t|dd }|d urF|| |}||}}|
rC|}n|}n|
rQ|}||d  }n||d  }|}t|dd }|d urp|| |}|
rn|}n|}|dk r|
r~d|j }d}nd|j	 }d}nd }}|
|| ||  || || fS d S )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  sF   



zBarChart._computeLabelPositionc                 C   s~   | j | j}}|r||_|r||_| jr$|| | j| j| j| j	 n|| j| | j| j	| j |
| j |   dS )zRInformation function, can be called by charts which want to with space around barsN)rJ   rI   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}|rS| j}|| j }	| j| j	 }
|D ]+}|D ]&\}}}}|| }|| }|t
||t||t
||| |	t|| f q*q&n<| j}|| j	 }	| j| j }
|D ]+}|D ]&\}}}}|| }|| }|t
||t||t
||| |	t|| f qgqc|  |d g}|D ]@}|d }|d |d k r|d |d k rt
|d |d t|d |d t
|d |d t
|d |d f|d< q|| q|}d}d}t|}t|D ]\}}|d }|| }||
kr ||fS |}d }}||k r6|| d |kr6t
|| d |}t
|| d |}|d7 }||k r6|| d |ks||krg||krf|}|rQ|||| || dfp[|||| || df}||krf ||fS q||kr|}|r}|	| ||	|| dfp||	| || |	df}||kr ||fS q||fS )	ak  helper for madmen who want to put stuff inside their barcharts
        basically after _computebarPositions we slide a line of length size
        down the bar profile on either side of the bars to find the
        maximum space. If the space at any point is >= required then we're
        done. Otherwise we return the largest space location and amount.
        r   r   r,   r   r   i  Ni)r   r?  r_   rK   r  r   rd   rf   re   rg   r2  r   r   r   )r:   sizerequiredr   ZlenDatar7  CZaCr\   r  endbprd   re   whr   r   r   r   r/  ZmaxSZmaxPZnCrn   ciZv0v1r   ZaloZahir;   r;   r<   _computeMaxSpace*  s~   

2
2
 J


4
4 zBarChart._computeMaxSpacec                 C   s  | j | j}}|r||_|r||_| jr$|| | j| j| j| j	 n|| j| | j| j	| j |
| j |   | j}g j}| j}t|D ]w\}}g j}t|D ]f\}	\}
}}}d||fv r| j}|r|jrt|}| jjdkrxdpyd}|du r|}|du r|}|| |j|||	|
||| qU|d qU| ||	}|r|| || j||	f ||	|
||| qU|d qU||j qJ|jS )zLInformation function, can be called by charts which want to mess with labelsNr   r   r   )rJ   rI   r=  r   r   r   rd   rf   re   rg   r   r   r   rH   r   r  r   rQ   r  r  r   r<  r  rL   r4  )r:   r   r   rH   r   r7  rc   r   rB  r   rd   re   rf   rg   r  r   r  r;   r;   r<   _computeSimpleBarLabelPositionsj  s:   

 

 
(
z(BarChart._computeSimpleBarLabelPositionsc                 C   s&   t  }t  }| || || |S r   )r   r;  rb   )r:   rl   r5  r;   r;   r<   r     s
   
zBarChart.makeBarsc                 C   s^   | j j}| j}t|}tttt|}|dkr%|d | j || j  }n| j}|| j	|  S )z:for dynamically computing the desired category axis lengthrs   r,   )
rJ   ri   rK   r_   r   r   r   rG   rE   rF   )r:   ri   rK   r   mr   r;   r;   r<   _desiredCategoryAxisLength  s   z#BarChart._desiredCategoryAxisLengthc                 C   st   | j | j}}|r||_|r||_| jr'|| | j| j| j| j	 | 
 S || j| | j| j	| j | 
 S r   )rJ   rI   r=  r   r   r   rd   rf   re   rg   r   r>  r;   r;   r<   draw  s   

zBarChart.drawr;   r   )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  r0  r;  r<  r?  rI  rJ  r   rL  rM  r;   r;   r;   r<   rB   4   s    	
" 
#=	H ?

	4	e,@%rB   c                   @      e Zd ZdZdZdS )VerticalBarChartz3Vertical bar chart with multiple side-by-side bars.r   Nr>   r?   r@   rN  r   r;   r;   r;   r<   rP        rP  c                   @   rO  )HorizontalBarChartz5Horizontal bar chart with multiple side-by-side bars.r,   NrQ  r;   r;   r;   r<   rS    rR  rS  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   rW  r9   r;   r;   r<   r     s   z_FakeGroup.sortr   )r>   r?   r@   r=   rb   r  r   r;   r;   r;   r<   rT    s
    
rT  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)rC   theta_xtheta_yzDepthzSpacer7   Nc                 C   s   t |  | j}| j}|d u r| j}| j}|d u r| j}| jjdkr-|| |d |  }n|d|  }|| j	9 }| j
| | _| j| | _d S )Nrt   r,   r   )rB   r   r  r\  rE   r]  rG   rJ   ri   r  rZ  Z_3d_dxr[  Z_3d_dy)r:   r  r\  r]  Z	_3d_depthr;   r;   r<   r     s   

zBarChart3D.calcBarPositionsc                 C   s\   | j }|d u r
| j}| j}|d u r| j}| jjdkr'| j|||  |  }|S | j| }|S )Nrt   )r\  rE   r]  rG   rJ   ri   r  )r:   rc   r\  r]  z0r;   r;   r<   _calc_z0  s   
zBarChart3D._calc_z0c                 C   s   | j }|d u r
| j}| j}	|	d u r| j}	| |}
|
|| j  }|dk r+||7 }| }||
| j 7 }||
| j 7 }| jrA||	7 }n||	7 }|	d|
|||||||f	 d S )Nr   )
r\  rE   r]  rG   r_  r  rZ  r[  r   rb   )r:   rl   rd   re   rf   rg   rc   ri   r\  r]  r^  z1r;   r;   r<   r0    s   

 zBarChart3D._makeBarc                 C   sv   |  |}| j}	|	d u r| j}	|}
||| j 7 }||| j 7 }| jr'||	7 }n||	7 }|d||
||||||f	 d S )Nr,   )r_  r]  rG   rZ  r[  r   rb   )r:   rl   rc   r   rd   re   rf   rg   r^  r]  r`  r;   r;   r<   r    s   

 zBarChart3D._addBarLabelc                 C   s>  ddl m} t| jd}| || |  t }| j}| j}|	 }| j
j}|dkr0| }n|dkrBdd tdd	 |D D }|D ]5}|d dkry|d
d  \}	}
}}}}}}|
|	 }||||| ||| || || |jd |j|jdd qD|D ] }|d
kr|d
d  \}	}
}}}}}}t| ||||||| q||S )Nr   )_draw_3d_barr'   rr   ru   c                 S   s   g | ]}|d  qS )r,   r;   r   r;   r;   r<   r         z'BarChart3D.makeBars.<locals>.<listcomp>c                 s   s0    | ]}|d  |d |d |d f|fV  qdS )r,   r   r   r   Nr;   )r   tr;   r;   r<   r     s   . z&BarChart3D.makeBars.<locals>.<genexpr>r,   g?)r/   ZfillColorShadedr.   r0   Zshading)Z!reportlab.graphics.charts.utils3dra  rT  _cmpZr;  r   r   rZ  r[  r  rJ   ri   reverser   r/   r.   r0   rB   r  )r:   ra  Zfgrl   rZ  r[  Zfg_valuer   rc  r^  r`  rd   re   rf   rg   rc   ri   Zdzr   r;   r;   r<   r     s:   
 zBarChart3D.makeBars)r>   r?   r@   r   rB   r   r   rA   rZ  r[  r\  r]  r   r_  r0  r  r   r;   r;   r;   r<   rq     s     



rq   c                   @      e Zd Zdd ZdS )VerticalBarChart3Dc                 C   B   t |d  |d |d |d  f|d  |d |d |d  fS )Nr,   r   r   r   r'   r:   r   r   r;   r;   r<   <lambda>%     B zVerticalBarChart3D.<lambda>Nr>   r?   r@   rd  r;   r;   r;   r<   rg  $      rg  c                   @   rf  )HorizontalBarChart3Dc                 C   rh  )Nr,   r   r   r   r'   ri  r;   r;   r<   rj  (  rk  zHorizontalBarChart3D.<lambda>Nrl  r;   r;   r;   r<   rn  '  rm  rn  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   rP  rd   re   rg   rf   rK   r   r   r.   rI   valueMinvalueMax	valueSteprJ   r  r   r%  r&  anglecategoryNamesrb   r   rK   r   r;   r;   r<   	sampleV0a+  s&   





r  c                  C   s   t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d|j
_d	|jj_d
|jj_d|jj_d|jj_dg|j_| | | S )z/A pathologic bar chart with only ONE data item.ro  r   *   rs  rt  ru  r   rw  rx  ry  r   rz  Jan-99r}  r  r;   r;   r<   	sampleV0bJ  s&   






r  c                  C   s   t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_d|jj_d|jj_g |j_| | | S )z8A really pathologic bar chart with NO data items at all!ro  r   r;   rs  rt  ru  r   rv  rw  rx  ry  r   )r   rP  rd   re   rg   rf   rK   r   r   r.   rI   r~  r  r  rJ   r  r   r%  r&  r  rb   r  r;   r;   r<   	sampleV0ch  s$   




r  c                  C   s   t dd} ddg}t }d|_d|_d|_d|_||_tj|_	d|j
_d	|j
_d
|j
_d|jj_d|jj_d|jj_d|jj_dd}dd |D }||j_| | | S )!Sample of multi-series bar chart.ro  r   rq  r   rr     %   -      r      r         &   .   rr  r   rs  rt  ru  r   rv  rw  rx  ry  r   rz  Jan Feb Mar Apr May Jun Jul Aug c                 S      g | ]}|d  qS z-99r;   r   r   r;   r;   r<   r     rb  zsampleV1.<locals>.<listcomp>)r   rP  rd   re   rg   rf   rK   r   r   r.   rI   r~  r  r  rJ   r  r   r%  r&  r  r   r  rb   r   rK   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 )r  333333@r   r   gffffff"@333333?皙r   g333333@zQ3 2000zYear to Datez	12 monthszAnnualised
3 yearszSince 07.10.99ro  r   rs  rx   ru  r   r~   rw  r   	Helveticary  r   r   r   rP  rd   re   rg   rf   rK   rG   rF   rE   rI   r~  r  r  r  r"  r#  r   r   rJ   r  r&  rb   rK   r  r   r   r;   r;   r<   	sampleV2a  6   








r  c                  C   s   ddg} d}t dd}t }d|_d|_d|_d|_| |_d	|_d
|_d
|_	d|j
_d|j
_d	|j
_d|j
j_d|j
j_d|j
j_d|j
j_||j_d|jj_d|jj_d|jj_|| |S )r  r  r  r  ro  r   rs  rx   ru  r   r~   r  rw  r  ry  r   r   r  r  r  r;   r;   r<   	sampleV2b  r  r  c                  C   s   ddg} d}t dd}t }d|_d|_d|_d|_| |_d	|_d
|_d
|_	d|j
_d|j
_d|j
_d|j
j_d|j
j_||j_d|jj_d|jj_d|j
j_d|j
j_d|jj_d
|j_d|_d|j_d|j_d|j_d|j_d|j_|| |S )r  r  r  r   r   {G#@r  r  r  r   r  r  ro  r   rs  rx   ru  r   r~   r  rw  r   r  ry  r   r   r  %0.2fr   r   )r   rP  rd   re   rg   rf   rK   rG   rF   rE   rI   r~  r  r  r  r"  r#  rJ   r  r   r   r&  rL   r   rM   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)\(?gp=
ף?g)\(?g)\(?r  r  bad dataro  r   r   rv      r  rE  r}   r  r   r~   r   r   r,   i   i)#r_   r   rP  rd   re   rg   rf   rK   r   r   rH   r/   rM   rL   r%  r&  r   r  r"  r#  r   rI   r!  r~  r  r  rJ   ZtickUpZtickDownr  r  r   	translaterotaterb   namesZseries1Zseries2r   r   rl   r;   r;   r<   sampleV3,  sN   









r  c                  C      t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_d|jj_ddg|j_| | | S )AA bar chart showing value axis region starting at *exactly* zero.ro  r   rp  rs  rt  ru  r   rv  rw  r   r{  r|  r   rP  rd   re   rg   rf   rK   r   r   r.   rI   r~  r  r  rJ   r  r   r&  r  rb   r  r;   r;   r<   	sampleV4ad  "   



r  c                  C   r  )<A bar chart showing value axis region starting *below* zero.ro  r   rp  rs  rt  ru  rv  rw  r   r  r{  r|  r  r  r;   r;   r<   	sampleV4b  r  r  c                  C   r  )z;A bar chart showing value axis region staring *above* zero.ro  r   rp  rs  rt  ru  r~   rv  rw  r   r  r{  r|  r  r  r;   r;   r<   	sampleV4c  r  r  c                  C   r  )<A bar chart showing value axis region entirely *below* zero.ro  r   iirs  rt  ru  r  rw  r   r  r{  r|  r  r  r;   r;   r<   	sampleV4d  r  r  ))r~   rv  )rr  rs  )rz  (   )r  rz  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.ro  r   rs  rt  ru  r   rv  rw  r   r  r{  r|  )r   dataSample5rP  rd   re   rg   rf   rK   r   r   r.   rI   r~  r  r  rJ   r  r   r&  r  rb   r  r;   r;   r<   	sampleV5a  s"   



r  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d|j_d
|j_d|j_d|jj_d|jj_ddg|j_| | | S )-A simple bar chart with proportional spacing.ro  r   rs  rt  ru  r   r  rr  r~   rv  rw  r   r  r{  r|  r   r  rP  rd   re   rg   rf   rK   r   r   r.   rD   rE   rF   rG   rI   r~  r  r  rJ   r  r   r&  r  rb   r  r;   r;   r<   	sampleV5b  *   



r  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d|_d|j_d	|j_d
|j_d|jj_d|jj_ddg|j_| | | S )6Make sampe simple bar chart but with absolute spacing.ro  r   rs  rt  ru  r,   r  r   rv  rw  r   r  r{  r|  r  r  r;   r;   r<   
sampleV5c1  r  r  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d	|j_d
|j_d|j_d|jj_d|jj_ddg|j_| | | S )r  ro  r   rs  rt  ru  r,   r  rr  r   rv  rw  r   r  r{  r|  r  r  r;   r;   r<   
sampleV5c2<  r  r  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d|j_d
|j_d|j_d|jj_d|jj_ddg|j_| | | S )r  ro  r   rs  rt  ru  r,   r  r   r~   rv  rw  r   r  r{  r|  r  r  r;   r;   r<   
sampleV5c3]  r  r  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d
|j_d|j_d|j_d|jj_d|jj_ddg|j_| | | S )r  ro  r   rs  rt  ru  r,   r  rr  r~   r   rv  rw  r   r  r{  r|  r  r  r;   r;   r<   
sampleV5c4~  r  r  c                  C   r  )z>Make a slightly pathologic bar chart with only TWO data items.ro  r   rp  rs  rt  ru  r   rv  rw  serz  r{  r|  r   rS  rd   re   rg   rf   rK   r   r   r.   rI   r~  r  r  rJ   r  r   r  r  rb   r  r;   r;   r<   	sampleH0a  r  r  c                  C   s   t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d|j
_d	|jj_d
|jj_dg|j_| | | S )z4Make a pathologic bar chart with only ONE data item.ro  r   r  rs  rt  ru  r   rw  r  rz  r  r  r  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!ro  r   r;   rs  rt  ru  r   rv  rw  r  rz  r  r  r;   r;   r<   	sampleH0c  s"   



r  c                  C   s   t dd} ddg}t }d|_d|_d|_d|_||_tj|_	d|j
_d	|j
_d
|j
_d|jj_dd}dd |D }||j_| |d | S )r  ro  r   r  r  rs  rt  ru  r   rv  rw  er  r  c                 S   r  r  r;   r  r;   r;   r<   r     rb  zsampleH1.<locals>.<listcomp>Zbarchart)r   rS  rd   re   rg   rf   rK   r   r   r.   rI   r~  r  r  rJ   r  r   r   r  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 )r  r  r  r  ro  r   r{   rs  rx   ru  r   r~   r  rw  r   r  ry  r   r   j)r   rS  rd   re   rg   rf   rK   rG   rF   rE   rI   r~  r  r  r  r"  r#  r   r   r   rJ   r  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 )r  r  r  r  ro  r   r{   rs  rx   ru  r   r~   r  rw  r  ry  r   r   r  )r   rS  rd   re   rg   rf   rK   rG   rF   rE   rI   r~  r  r  r  r"  r#  r   r   rJ   r  r%  rb   r  r;   r;   r<   	sampleH2b?  r  r  c                  C   s   ddg} d}t dd}t }d|_d|_d|_d	|_| |_d
|_d|_d|_	d|j
_d|j
_d|j
_d|j
j_d|j
j_d|j
j_d|j
j_||j_d|jj_d|jj_d|jj_d|j_d|_d|j_d|j_d|j_d|j_d|j_|| |S )r  r  r  r  ro  r   r{   rs  rx   ru  r   r~   r  rw  r   r  ry  r   r   r  r  r   r   )r   rS  rd   re   rg   rf   rK   rG   rF   rE   rI   r~  r  r  r  r"  r#  r   r   rJ   r  r%  rL   r   rM   r&  rb   r  r;   r;   r<   	sampleH2ch  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  ro  r   rv   rr  r     r  r   rE  r  r   r~   r   r   r,   iV) r_   r   rS  rd   re   rg   rf   rK   r   r   rH   r/   rM   rL   r%  r&  r   r"  r#  r   rI   r!  r~  r  r  rJ   ZtickLeftZ	tickRightr  r  r   rb   r  r;   r;   r<   sampleH3  sD   






r  c                  C   x   t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_ddg|j_| | | S )r  ro  r   rp  rs  rt  ru  r   rv  rw  r  r{  r|  r   rS  rd   re   rg   rf   rK   r   r   r.   rI   r~  r  r  rJ   r  r   r  rb   r  r;   r;   r<   	sampleH4a      


r  c                  C   r  )r  ro  r   rp  rs  rt  ru  r  rv  rw  r  r{  r|  r  r  r;   r;   r<   	sampleH4b  r  r  c                  C   r  )z<A bar chart showing value axis region starting *above* zero.ro  r   rp  rs  rt  ru  r~   rv  rw  r  r{  r|  r  r  r;   r;   r<   	sampleH4c  r  r  c                  C   r  )r  ro  r   r  rs  rt  ru  r  r  rw  r  r{  r|  r  r  r;   r;   r<   	sampleH4d   r  r  c                  C   sv   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|j_d|j_d|j_d	|jj_d
dg|j_| | | S )r  ro  r   rs  rt  ru  r   rv  rw  r  r{  r|  )r   r  rS  rd   re   rg   rf   rK   r   r   r.   rI   r~  r  r  rJ   r  r   r  rb   r  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  ro  r   rs  rt  ru  r   r  rr  r~   rv  rw  r  r{  r|  r   r  rS  rd   re   rg   rf   rK   r   r   r.   rD   rE   rF   rG   rI   r~  r  r  rJ   r  r   r  rb   r  r;   r;   r<   	sampleH5bY  (   


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.ro  r   rs  rt  ru  r,   r~   r   rv  rw  r  r{  r|  r  r  r;   r;   r<   
sampleH5c1y  r  r  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d	|j_d
|j_d|j_d|jj_ddg|j_| | | S 'Simple bar chart with absolute spacing.ro  r   rs  rt  ru  r,   r~   rr  r   rv  rw  r  r{  r|  r  r  r;   r;   r<   
sampleH5c2  r  r  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d	|_d
|_d	|j_d|j_d|j_d|jj_ddg|j_| | | S )r  ro  r   rs  rr     ru  r,   r~   r   r   rv  rw  r  r{  r|  r  r  r;   r;   r<   
sampleH5c3  r  r  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d|_d	|j_d
|j_d|j_d|jj_ddg|j_| | | S r  r  r  r;   r;   r<   
sampleH5c4  r  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.ro  r   rs  rt  ru  r~   rw  r   r   rv  r  r{  r|  
ShadedRect
horizontalverticalr,   r   )#r   r  rP  rd   re   rg   rf   rK   r   r   r.   rE   rF   rG   rI   r~  r  r  rJ   r  r   r   reportlab.graphics.widgets.gridsr  fillColorStartr8   fillColorEndorientationr0   ZpinkwhitecylinderModerH   r2   rb   )r   rK   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  ro  r   rr   rs  rt  ru  r~   rw  r   r  r{  r|  r  r  r,   r   r   )#r   r  rP  rJ   ri   rd   re   rg   rf   rK   r   r   r.   rE   rF   rI   r~  r  r   r  r  r  rH   r2   r   r   r  r  r  r  r0   magentar   r8   rb   )r   rK   r   r  r;   r;   r<   sampleStacked1.	  sT   






r  c                   @   s   e Zd ZdZdddZdS )
SampleH5c4r  ro  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 )Nrs  rt  ru  r,   r~   rr  r   rv  rw  r  r{  r|  ZHBC)r3   )r   r=   rS  rd   re   rg   rf   r  rK   r   r   r.   rD   rE   rF   rG   rI   r~  r  r  rJ   r  r   r  rb   rJ  )r:   rf   rg   argskwr   r;   r;   r<   r=   j	  s&   
zSampleH5c4.__init__N)ro  r   )r>   r?   r@   rN  r=   r;   r;   r;   r<   r  g	  s    r  )h__version__rN  r  rU  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   rP  rS  rT  rq   rg  rn  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;   r;   r;   r<   <module>   s   8      ~b#))28!!!!!#*)22    69