;ò
¸0sDc           @   s4  d  Z  d Z d k Z d k l Z l Z l Z d k l Z d k	 l
 Z
 l Z l Z l Z l Z l Z l Z l Z l Z l Z l Z l Z l Z l Z l Z l Z l Z l Z l Z l Z d k Td k l Z d k  l! Z! l" Z" l# Z# l$ Z$ l% Z% l& Z& l' Z' l( Z( l) Z) l* Z* d	 k+ l, Z, l- Z- l. Z. d
 k/ l0 Z0 d k1 l2 Z2 d k3 l4 Z4 l5 Z5 l6 Z6 d e. f d „  ƒ  YZ7 d e. f d „  ƒ  YZ8 d e2 f d „  ƒ  YZ9 d e9 f d „  ƒ  YZ: d „  Z; d e0 f d „  ƒ  YZ< d „  Z= d „  Z> e? d j o= e= ƒ  Z@ d kA lB ZB eB e@ d ƒ e> ƒ  Z@ eB e@ d ƒ n d S(   sà   Spider Chart

Normal use shows variation of 5-10 parameters against some 'norm' or target.
When there is more than one series, place the series with the largest
numbers first, as it will be overdrawn by each successive one.
s5    $Id: spider.py 2676 2005-09-06 10:25:00Z rgbecker $ N(   s   sins   coss   pi(   s   colors(   s   isColors   isNumbers   isListOfNumbersOrNones   isListOfNumberss   isColorOrNones   isStrings   isListOfStringsOrNones   OneOfs
   SequenceOfs	   isBooleans   isListOfColorss   isNumberOrNones   isNoneOrListOfNoneOrStringss   isTextAnchors   isNoneOrListOfNoneOrNumberss   isBoxAnchors   isStringOrNones   isStringOrNones   EitherOrs
   isCallable(   s   *(   s   Canvas(
   s   Groups   Drawings   Lines   Rects   Polygons   PolyLines   Ellipses   Wedges   Strings   STATE_DEFAULTS(   s   Widgets   TypedPropertyCollections
   PropHolder(   s   PlotArea(   s
   WedgeLabel(   s
   makeMarkers   uSymbol2Symbols   isSymbols   StrandPropertyc           B   sŒ   t  Z e d e e ƒ d e e ƒ d e e ƒ d e e ƒ d e e e e	 f ƒ d d ƒd e e d d	 ƒd
 e e d d ƒƒ Z
 d „  Z RS(   Ns   strokeWidths	   fillColors   strokeColors   strokeDashArrays   symbols   descs   Widget placed at data points.s
   symbolSizes   Symbol size.s   names   Name of the strand.c         C   sK   d |  _ t |  _ t d |  _ t d |  _ t |  _ d |  _ t |  _	 d  S(   Ni   s   strokeColors   strokeDashArrayi   (
   s   selfs   strokeWidths   Nones	   fillColors   STATE_DEFAULTSs   strokeColors   strokeDashArrays   symbols
   symbolSizes   name(   s   self(    (    s   ./spider.pys   __init__/   s    				(   s   __name__s
   __module__s   AttrMaps   AttrMapValues   isNumbers   isColorOrNones   isListOfNumbersOrNones   EitherOrs   isStringOrNones   isSymbols   _attrMaps   __init__(    (    (    s   ./spider.pys   StrandProperty#   s   s   SpokePropertyc           B   sh   t  Z e d e e ƒ d e e ƒ d e e ƒ d e e ƒ d e e ƒ d e e d d ƒƒ Z d	 „  Z	 RS(
   Ns   strokeWidths	   fillColors   strokeColors   strokeDashArrays   labelRadiuss   visibles   descs%   True if the spoke line is to be drawnc         K   sB   d |  _ t |  _ t d |  _ t d |  _ d |  _ d |  _ d  S(   Nf0.5s   strokeColors   strokeDashArrayi   f1.05(	   s   selfs   strokeWidths   Nones	   fillColors   STATE_DEFAULTSs   strokeColors   strokeDashArrays   visibles   labelRadius(   s   selfs   kw(    (    s   ./spider.pys   __init__B   s    			(
   s   __name__s
   __module__s   AttrMaps   AttrMapValues   isNumbers   isColorOrNones   isListOfNumbersOrNones	   isBooleans   _attrMaps   __init__(    (    (    s   ./spider.pys   SpokeProperty8   s   s
   SpokeLabelc           B   s   t  Z d „  Z RS(   Nc         K   s4   t  i |  |  d | i ƒ  j o d |  _ n d  S(   Ns   _texts    (   s
   WedgeLabels   __init__s   selfs   kws   keyss   _text(   s   selfs   kw(    (    s   ./spider.pys   __init__K   s     (   s   __name__s
   __module__s   __init__(    (    (    s   ./spider.pys
   SpokeLabelJ   s   s   StrandLabelc        	   B   sJ   t  Z e d e d e e e e f ƒ d ƒ d e e d ƒ ƒ Z	 d „  Z
 RS(   Ns   BASEs   formats   Format for the labels   dRs   radial shift for labelc         K   s&   d |  _ d |  _ t i |  |  d  S(   Ns    i    (   s   selfs   formats   dRs
   SpokeLabels   __init__s   kw(   s   selfs   kw(    (    s   ./spider.pys   __init__T   s    		(   s   __name__s
   __module__s   AttrMaps
   SpokeLabels   AttrMapValues   EitherOrs   isStringOrNones
   isCallables   isNumberOrNones   _attrMaps   __init__(    (    (    s   ./spider.pys   StrandLabelO   s   	c	   
      C   sa  |  ƒ  }	 | |	 _ | | | |	 _ | | | |	 _
 | d t |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i |	 _ | i  |	 _  | i! |	 _! | i" |	 _" | i# |	 _# |	 Sd  S(   Ni´   ($   s
   labelClasss   Ls   texts   _texts   cxs   radiuss   cars   xs   cys   sars   ys   angles   pis   _pmvs   stys	   boxAnchors   dxs   dys   boxStrokeColors   boxStrokeWidths   boxFillColors   strokeColors   strokeWidths   leadings   widths   maxWidths   heights
   textAnchors   visibles
   topPaddings   leftPaddings   rightPaddings   bottomPaddings   fontNames   fontSizes	   fillColor(
   s
   labelClasss   texts   radiuss   cxs   cys   angles   cars   sars   stys   L(    (    s   ./spider.pys   _setupLabelY   s:    		s   SpiderChartc           B   sø   t  Z e d e d e e d d ƒd e e d d ƒd e e d d ƒd	 e e d
 d ƒ d d ƒd e e d d ƒd e e d d ƒd e e d d ƒd e e d d ƒƒ 	Z	 d „  Z
 e d „ Z d „  Z d „  Z d d „ Z e d „ Z d „  Z RS(   Ns   BASEs   datas   descs/   Data to be plotted, list of (lists of) numbers.s   labelss2   optional list of labels to use for each data points
   startAngles6   angle of first slice; like the compass, 0 is due Norths	   directions	   clockwises   anticlockwises   'clockwise' or 'anticlockwise's   strandss'   collection of strand descriptor objectss   spokess&   collection of spoke descriptor objectss   strandLabelss-   collection of strand label descriptor objectss   spokeLabelss,   collection of spoke label descriptor objectsc         C   sÊ  |  i } | t | ƒ } | | }	 t |	 d t | d t ƒ ƒ } t |	 d t | d t ƒ ƒ }
 t |	 d t | d t ƒ ƒ } t |	 d t | d d ƒ ƒ } t |	 d t | d t ƒ ƒ } | | d } |
 t j o | t j	 o
 | d j o/ t | | | | | d | d | d | ƒ} nE |
 t j	 o1 t | | | | d | d | d | d |
 ƒ} n t } | oS t | | | d | t ƒ } | o+ t ƒ  } | i | ƒ | i | ƒ | Sq»n | p | Sd  S(   Ns   strokeColors	   fillColors   strokeDashArrays   strokeWidthi    s   symbolf2.0(   s   selfs   strandss	   baseStyles   rowNos   lens   styleIdxs   styles   getattrs   Nones   strokeColors	   fillColors   strokeDashArrays   strokeWidths   symbols   ys   heights   yms   Lines   xs   widths   bgs   Rects   uSymbol2Symbols   colors   Groups   gs   add(   s   selfs   rowNos   xs   ys   widths   heights   strokeDashArrays   bgs	   baseStyles   styles	   fillColors   styleIdxs   strokeWidths   yms   symbols   strokeColors   g(    (    s   ./spider.pys   makeSwatchSample„   s0    	
'	c         C   s   t  |  i | d | ƒ Sd S(   s   return series name i or defaults   nameN(   s   getattrs   selfs   strandss   is   default(   s   selfs   is   default(    (    s   ./spider.pys   getSeriesNameŸ   s     c         C   sæ   t  i |  ƒ d d d d d d g d d d d d d g g |  _ t |  _ d	 d
 d d d d g |  _ d |  _ d |  _ t t	 ƒ |  _
 t t ƒ |  _ t t ƒ |  _ t |  i _ t t ƒ |  _ d |  _ d |  _ d |  _ d |  _ d  S(   Ni
   i   i   i   i   i   i	   i   s   as   bs   cs   ds   es   fiZ   s	   clockwisei´   (   s   PlotAreas   __init__s   selfs   datas   Nones   labelss
   startAngles	   directions   TypedPropertyCollections   StrandPropertys   strandss   SpokePropertys   spokess
   SpokeLabels   spokeLabelss   _texts   StrandLabels   strandLabelss   xs   ys   widths   height(   s   self(    (    s   ./spider.pys   __init__£   s    3						c         C   s'   t  d d ƒ } | i t ƒ  ƒ | Sd  S(   NiÈ   (   s   Drawings   ds   adds   SpiderChart(   s   selfs   d(    (    s   ./spider.pys   demo¶   s    f0.0c         C   sÀ   |  i } t t t | ƒ ƒ d j p
 t d ‚ t t t | ƒ ƒ } | d | 9} | d j  o
 d } n | |  _ g  i	 } | D]5 } | g  i	 } | D] } | | | ƒ q— ~ ƒ q€ ~ Sd S(   s   Turns data into normalized ones where each datum is < 1.0,
        and 1.0 = maximum radius.  Adds 10% at outside edge by defaulti    s+   Cannot do spider plots of negative numbers!f1.0f1.0000000000000001e-09N(   s   selfs   datas   mins   maps   AssertionErrors   maxs   norms   outers   _norms   appends   _[1]s   rows   _[2]s   e(   s   selfs   outers   _[1]s   _[2]s   datas   es   norms   row(    (    s   ./spider.pys   normalizeData»   s     	& 
	c	      
   C   s	  | i }	 | |  i } |	 o
 t } nf t	 |	 t
 ƒ o( |	 d j o | i } q |	 | } n. t |	 ƒ o |	 | ƒ } n t d |	 ƒ ‚ | og | i } | o | | |  i 7} n t | | | | | | | | | ƒ	 }
 | d j  o d |
 _ qn t }
 |
 Sd S(   s*   Draw a label for a given item in the list.s   valuess6   Unknown formatter type %s, expected string or functioni    i   N(   s   stys   formats   fmts   radiuss   selfs   _norms   values   Nones   texts
   isinstances   strs   _texts   callables
   ValueErrors   dRs   _radiuss   _setupLabels
   labelClasss   cxs   cys   angles   cars   sars   Ls   _anti(   s   selfs   stys   radiuss   cxs   cys   angles   cars   sars
   labelClasss   fmts   Ls   values   texts   dR(    (    s   ./spider.pys   _innerDrawLabelÆ   s*     	
	$ c   1      C   sà  |  i ƒ  p t ƒ  }% |  i d } |  i d } t | | ƒ |  _	 } |  i | }
 |  i | }	 |  i ƒ  } t | ƒ |  _ t | d ƒ }) |  i t j o d g |) } n< |  i } |) t | ƒ }' |' d j o | d g |' } n g  }  g  }" g  } g  }$ g  } g  } |  i t d } |  i  d j o d p d } | d t t! |) ƒ } |  i# } |  i$ } xt% |) ƒ D]}' t& | ƒ | }( t( | ƒ | } | i* |( | | f ƒ |  i# |' }* |* i, o< t- |
 |	 |
 |( |	 | d	 |* i. d
 |* i/ d |* i0 ƒ} n |  i* | ƒ | |' }- |- i3 }, |, o | |' }, n |, o2 |  i* t5 t6 |, |* i7 |
 |	 | |( | |- ƒ	 ƒ n | | 7} qpWd }& |  i9 }/ |  i: }! x!| D]} |/ |& } g  }+ | d d  \ }( } | d } |+ i* |
 |( | ƒ |+ i* |	 | | ƒ xt% |) ƒ D]}' | |' \ }( } } | |' } |+ i* |
 |( | ƒ |+ i* |	 | | ƒ |  i? |! |& |' f | |
 |	 | |( | d t@ ƒ} | o | i* | ƒ n |/ |& |' f }0 |0 iC } | oP|
 |( | }. |	 | | } |0 iG } |0 i/ } |0 i. } d } |0 iL } tN | ƒ tN d ƒ j o: tO | d | d |. d | d | d
 | d	 | d | ƒ} n§ tP | |. | | ƒ } xŽ d | f d | f d |. f d | f d
 | f d	 | f d | f f D]G \ } } tS | | t ƒ t j o" y tT | | | ƒ Wq÷q÷Xq°q°W|$ i* | ƒ qqW| iG o; tU |+ ƒ }# | iG |# _G t |# _/ d |# _. | i* |# ƒ n | i/ o | i. oA tW |+ ƒ }# | i/ |# _/ | i. |# _. | i0 |# _0 |" i* |# ƒ n |& d 7}& q›WtX |% iY | |" |$ |  | ƒ |% Sd  S(   Nf2.0i    s    i´   s	   clockwiseiÿÿÿÿi   i   s   strokeWidths   strokeColors   strokeDashArrays
   labelClasss   sizes   xs   ys	   fillColors   angle(Z   s   selfs   makeBackgrounds   Groups   gs   widths   xradiuss   heights   yradiuss   mins   _radiuss   radiuss   xs   cxs   ys   cys   normalizeDatas   datas   lens   _seriesCounts   ns   labelss   Nones   is   Ss   STRANDSs   STRANDAREASs   symss   labss   csas
   startAngles   pis   angles	   directions   floats   angleBetweens   spokess   spokeLabelss   xranges   coss   cars   sins   sars   appends   sis   visibles   Lines   strokeWidths   strokeColors   strokeDashArrays   spokes   slis   _texts   texts   _setupLabels
   WedgeLabels   labelRadiuss   rowIdxs   strandss   strandLabelss   rows   rstys   pointss   rs   _innerDrawLabels   StrandLabels   Ls   stys   symbols   uSymbols   s_xs   s_ys	   fillColors   s_fillColors   s_strokeColors   s_strokeWidths   s_angles
   symbolSizes   s_sizes   types
   makeMarkers   uSymbol2Symbols   ks   vs   getattrs   setattrs   Polygons   strands   PolyLines   maps   add(1   s   selfs   rs   s_strokeColors   STRANDAREASs   labelss   s_angles	   directions   s_sizes   s_strokeWidths   cys   cxs   radiuss   spokess   sars   ks   rows   rstys   angles   spokes   s_ys   datas   csas   symbols   angleBetweens   yradiuss   xradiuss   spokeLabelss   uSymbols   vs   Ls   labss   s_fillColors   Ss   strandLabelss   STRANDSs   strands   symss   gs   rowIdxs   is   cars   ns   sis   pointss   texts   slis   s_xs   strandss   sty(    (    s   ./spider.pys   drawà   sÒ    			 
<
	 2		 

 
1 					F 
		 (   s   __name__s
   __module__s   AttrMaps   PlotAreas   AttrMapValues   Nones   isListOfStringsOrNones   isNumbers   OneOfs   _attrMaps   makeSwatchSamples   getSeriesNames   __init__s   demos   normalizeDatas   StrandLabels   _innerDrawLabels   draw(    (    (    s   ./spider.pys   SpiderChartx   s    				c          C   s8  t  d d ƒ } t ƒ  }  d |  _ d |  _ d |  _ d |  _ d d d d d d g d d	 d d d
 d g d d	 d d d d	 g g |  _ d d d d d d g |  _	 t
 i |  i d _ t
 i |  i d _ t
 i |  i d _ t
 i |  i d _ t
 i |  i d _ t
 i |  i d _ d d f |  i _ | i |  ƒ | Sd S(   s   Make a simple spider charti  i2   i,  i
   i   i   i   i   i   i	   i   i   i   i   s   as   bs   cs   ds   es   fi    i   i   N(   s   Drawings   ds   SpiderCharts   sps   xs   ys   widths   heights   datas   labelss   colorss   cornsilks   strandss   strokeColors   cyans	   palegreens	   fillColors   spokess   strokeDashArrays   add(   s   sps   d(    (    s   ./spider.pys   sample1\  s$     					Hc          C   s  t  d d ƒ }  t ƒ  } d | _ d | _ d | _ d | _ d d d d d d g d d	 d d d
 d g d d	 d d d d	 g g | _ d d d d d d g | _	 d | i
 _ t i | i
 d _ t i | i
 d _ t i | i
 d _ t i | i
 d _ t i | i
 d _ t i | i
 d _ d | i
 _ t d ƒ | i
 d _ d | i
 d i _ t i | i
 d i _ d | i
 _ d | i d d f _ d | i d d f _ d | i d d f _ d | i d d f _ d  | i d d f _ d! | i _ d" | i _ |  i | ƒ |  Sd# S($   s-   Make a spider chart with markers, but no filli  i2   i,  i
   i   i   i   i   i   i	   i   i   i   i   s   Us   Vs   Ws   Xs   Ys   Zi   i    i   s   FilledDiamonds   Circlef0.5s   speciali   s   ones   zeros   Earths   Marss   valuesiûÿÿÿN(   s   Drawings   ds   SpiderCharts   sps   xs   ys   widths   heights   datas   labelss   strandss   strokeWidths   colorss   pinks	   fillColors	   lightblues	   palegreens   reds   strokeColors   blues   greens   symbols
   makeMarkers   yellows
   symbolSizes   strandLabelss   _texts   formats   dRs   add(   s   ds   sp(    (    s   ./spider.pys   sample2q  s<     					Hs   __main__(   s
   drawToFiles
   spider.pdfs   spider2.pdf(C   s   __doc__s   __version__s   copys   maths   sins   coss   pis   reportlab.libs   colorss   reportlab.lib.validatorss   isColors   isNumbers   isListOfNumbersOrNones   isListOfNumberss   isColorOrNones   isStrings   isListOfStringsOrNones   OneOfs
   SequenceOfs	   isBooleans   isListOfColorss   isNumberOrNones   isNoneOrListOfNoneOrStringss   isTextAnchors   isNoneOrListOfNoneOrNumberss   isBoxAnchors   isStringOrNones   EitherOrs
   isCallables   reportlab.lib.attrmaps   reportlab.pdfgen.canvass   Canvass   reportlab.graphics.shapess   Groups   Drawings   Lines   Rects   Polygons   PolyLines   Ellipses   Wedges   Strings   STATE_DEFAULTSs   reportlab.graphics.widgetbases   Widgets   TypedPropertyCollections
   PropHolders   reportlab.graphics.charts.areass   PlotAreas	   piechartss
   WedgeLabels"   reportlab.graphics.widgets.markerss
   makeMarkers   uSymbol2Symbols   isSymbols   StrandPropertys   SpokePropertys
   SpokeLabels   StrandLabels   _setupLabels   SpiderCharts   sample1s   sample2s   __name__s   ds   reportlab.graphics.renderPDFs
   drawToFile(6   s
   SpokeLabels   OneOfs   Groups   Polygons   isColorOrNones   isBoxAnchors   Canvass   isListOfNumberss   EitherOrs   colorss   PolyLines   StrandPropertys   isNumberOrNones   pis   isStringOrNones   Widgets   isNumbers	   isBooleans
   SequenceOfs   isListOfStringsOrNones   SpokePropertys   isNoneOrListOfNoneOrNumberss   sample1s   Lines   __version__s   TypedPropertyCollections   sins   isTextAnchors   isListOfColorss   sample2s   isListOfNumbersOrNones   uSymbol2Symbols   StrandLabels
   isCallables   copys   Drawings   STATE_DEFAULTSs   Strings   Wedges   coss   isStrings   ds   SpiderCharts
   drawToFiles
   makeMarkers   PlotAreas   isNoneOrListOfNoneOrStringss   isColors
   PropHolders
   WedgeLabels   Rects   _setupLabels   isSymbols   Ellipse(    (    s   ./spider.pys   ?   s4   	C
	ä		!		