#Autogenerated by ReportLab guiedit do not edit "A dispersion chart; data is date boxlo boxmid boxhi hi inv" from reportlab.graphics.charts.linecharts import HorizontalLineChart from reportlab.lib.colors import toColor from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin from reportlab.graphics.widgets.markers import makeMarker from reportlab.graphics.charts.legends import Legend from reportlab.graphics.widgetbase import CandleSticks from reportlab.lib.utils import recursiveSetAttr class DispersionChart(_DrawingEditorMixin,Drawing): def __init__(self,width=400,height=200,*args,**kw): Drawing.__init__(self,width,height,*args,**kw) self._add(self,HorizontalLineChart(),name='chart',validate=None,desc=None) self._add(self,Legend(),name='legend',validate=None,desc=None) self.width = 518 self.height = int((700 - 3*20)/3) self.chart.x = 30 self.chart.y = 40 self._boxFillColor = toColor('pink') self._boxWidth = 20 self._crossWidth = 10 self._candleStrokeWidth = 0.5 self._candleStrokeColor = toColor('black') self.chart.valueAxis.rangeRound='both' self.chart.valueAxis.avoidBoundSpace = 5 self.chart.height = self.height - self.chart.y - 5 self.chart.width = self.width - self.chart.x - 5 self._data=[[0.01,0.25,0.5,0.75,0.99,"Portfolio"],["12/18",0.0022584,0.009625,0.01015,0.016825,0.0410996,0.0096],["01/19",-0.0346472,-0.025057999999999997,0.00455,0.020100000000000003,0.053028200000000004,-0.0347],["02/19",-0.0593438,0.004275,0.014950000000000001,0.049697,0.0612048,0.0613],["03/19",-0.05455959999999999,0.004500000000000001,0.006200000000000001,0.010600000000000002,0.03065959999999999,0.004500000000000001],["04/19",0.001997,0.005175,0.00945,0.015674999999999998,0.018648,0.0169],["05/19",-0.043820399999999995,-0.02975600000000001,0.0073,0.015325,0.0679344,-0.044],["06/19",-0.005292399999999999,-0.004286,0.0049,0.031450000000000006,0.0607898,-0.0053]] self._invColor = toColor('blue') self.chart.categoryAxis.joinAxisMode='bottom' self.chart.valueAxis.labelTextFormat = '%d%%' self.legend.y = 20 self.legend.alignment='right' self.legend.x = self.chart.x for a in ('chart.valueAxis.labels.fontName','chart.categoryAxis.labels.fontName','legend.fontName'): recursiveSetAttr(self,a,'Helvetica') for a in ('chart.valueAxis.labels.fontSize','chart.categoryAxis.labels.fontSize','legend.fontSize'): recursiveSetAttr(self,a,12) self.chart.valueAxis.visibleGrid = 1 self.chart.valueAxis.strokeWidth = 0.5 self.chart.valueAxis.drawGridLast = 0 self.chart.categoryAxis.visibleAxis = 1 self.chart.categoryAxis.visibleGrid = 0 self.chart.categoryAxis.visibleAxis = 0 self.chart.categoryAxis.visibleTicks = 0 self.legend.dxTextSpace = 1 #self.legend.dx = def getContents(self): data = self._data name = data[0][-1] data = list(zip(*data[1:])) cnv = lambda x: [i*100 if isinstance(i,(int,float)) else None for i in x] self.legend.colorNamePairs=[(self._invColor,name)] self.legend.swatchMarker=makeMarker('FilledDiamond',strokeColor=self._invColor,size=7) lo = cnv(data[1]) boxLo = cnv(data[2]) boxMid = cnv(data[3]) boxHi = cnv(data[4]) hi = cnv(data[5]) inv = cnv(data[6]) chart = self.chart lfilt = lambda _V: [0 if _v is None else _v for _v in _V] lines = lfilt(boxMid+hi+lo+boxLo+boxHi+inv) chart.valueAxis.valueMin = min(lines) chart.valueAxis.valueMax = max(lines) r = chart.valueAxis.valueMax - chart.valueAxis.valueMin chart.valueAxis.valueStep = 5 if r<=75 else (10 if r<=150 else (20 if r<=300 else None)) chart.categoryAxis.categoryNames = [s for s in data[0]] lines = chart.lines lines[0].strokeColor = None lines[1].strokeColor = None lines[1].symbol = makeMarker('FilledDiamond',strokeColor=self._invColor,size=6) I = range(len(boxMid)) chart.data = [boxMid,inv] lines[0].symbol = candles = CandleSticks(chart=chart, boxFillColor=self._boxFillColor, boxWidth=self._boxWidth, crossWidth=self._crossWidth, strokeWidth=self._candleStrokeWidth, strokeColor=self._candleStrokeColor) for i in I: candles[i].setProperties(dict(position=i,boxMid=boxMid[i],crossLo=lo[i],crossHi=hi[i],boxLo=boxLo[i],boxHi=boxHi[i])) return Drawing.getContents(self) if __name__=="__main__": #NORUNTESTS DispersionChart().save(formats=['pdf'],outDir='.',fnRoot=None)