"Pie within a pie" from reportlab.graphics.charts.legends import Legend from reportlab.graphics.charts.piecharts import Pie from reportlab.pdfbase.pdfmetrics import stringWidth, EmbeddedType1Face, registerTypeFace, Font, registerFont from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, Line from reportlab.lib.colors import PCMYKColor, Color, CMYKColor class PieChart06(_DrawingEditorMixin,Drawing): ''' Chart Features -------------- This chart is created by adding two pies and some graphics on the same canvas. It may seem a bit fiddly to do all this to lay out a single chart, but if you consider the fact that this single python module can now be used to generate batches of thousands of charts, with different data for each passed in dynamically, you can appreciate that a bit of work up front to get an exact template can save massively. ''' def __init__(self,width=155,height=262,*args,**kw): Drawing.__init__(self,width,height,*args,**kw) fontName = 'Helvetica' fontSize = 7 colorsList1= [PCMYKColor(0,0,0,100,spotName='XXX X',alpha=100), PCMYKColor(50,0,25,30,spotName='7475C',alpha=100), PCMYKColor(50,0,25,30,spotName='7475C',density=40,alpha=100), PCMYKColor(0,0,0,50,spotName='XXX X',alpha=100), PCMYKColor(0,0,0,25,spotName='XXX X',alpha=100), PCMYKColor(0,0,0,40,spotName='XXX X',alpha=100), PCMYKColor(50,0,25,30,spotName='7475C',density=25,alpha=100), PCMYKColor(0,0,0,25,spotName='XXX X',alpha=100)] colorsList2= [CMYKColor(0,0,0,.64,spotName='XXX X',density=.8,alpha=1), CMYKColor(0,0,0,.48,spotName='XXX X',density=.6,alpha=1), CMYKColor(0,0,0,.32,spotName='XXX X',density=.4,alpha=1), CMYKColor(0,0,0,.2,spotName='XXX X',density=.25,alpha=1), CMYKColor(0,0,0,.8,spotName='XXX X',alpha=1)] self._add(self,Pie(),name='pie1',validate=None,desc=None) self._add(self,Legend(),name='legend1',validate=None,desc=None) self._add(self,Pie(),name='pie2',validate=None,desc=None) self._add(self,Legend(),name='legend2',validate=None,desc=None) # pie 1 self.pie1.data = [85.799999999999997, 1.5, 11.199999999999999, 1.6000000000000001] self.pie1.width = 77 self.pie1.height = 77 self.pie1.sameRadii=1 for i in range(len(self.pie1.data)): self.pie1.slices[i].fillColor = colorsList1[i] self.pie1.slices.strokeColor = PCMYKColor(0,0,0,0) self.pie1.slices.strokeWidth = 0.5 # pie2 self.pie2.data = [86.0, 14.0] self.pie2.width = 46 self.pie2.height = 46 self.pie2.sameRadii = 1 for i in range(len(self.pie2.data)): self.pie2.slices[i].fillColor = colorsList2[i] self.pie2.slices.strokeColor = PCMYKColor(0,0,0,0) self.pie2.slices.strokeWidth = 0.5 # legend 1 self.legend1.alignment='right' self.legend1.fontName = fontName self.legend1.fontSize = fontSize self.legend1.dx = 7 self.legend1.dy = 7 self.legend1.yGap = 0 self.legend1.deltax = 10 self.legend1.deltay = 20 self.legend1.strokeWidth = 0 self.legend1.strokeColor = PCMYKColor(0,0,0,0) self.legend1.columnMaximum = 10 # legend 2 self.legend2.alignment='right' self.legend2.fontName = fontName self.legend2.fontSize = fontSize self.legend2.dx = 7 self.legend2.dy = 7 self.legend2.yGap = 0 self.legend2.deltax = 10 self.legend2.deltay = 20 self.legend2.strokeWidth = 0 self.legend2.strokeColor = PCMYKColor(0,0,0,0) self.legend2.columnMaximum = 10 self.legend2.colorNamePairs = [(CMYKColor(0,0,0,.64,spotName='XXX X',density=.8,alpha=1), u'Grants: 86.0%'), (CMYKColor(0,0,0,.48,spotName='XXX X',density=.6,alpha=1), u'Loans: 14.0%')] self._add(self,Line(85,230,85,184),name='vline',validate=None,desc=None) self.vline.strokeColor = PCMYKColor(0,0,0,75) self._add(self,Line(85,230,93,230),name='topline',validate=None,desc=None) self.topline.strokeColor = PCMYKColor(0,0,0,75) self._add(self,Line(77,207,85,207),name='midline',validate=None,desc=None) self.midline.strokeColor = PCMYKColor(0,0,0,75) self._add(self,Line(85,184,93,184),name='butline',validate=None,desc=None) self.butline.strokeColor = PCMYKColor(0,0,0,75) self.width = 400 self.height = 200 self.legend1.boxAnchor = 'nw' self.legend1.y = 100 self.legend1.x = 12 self.legend2.y = 100 self.legend2.x = 100 self.pie1.y = 112 self.pie1.x = 12 self.pie2.x = 105 self.pie2.y = 112 self.topline.x1 = 97 self.topline.x2 = 105 self.topline.y1 = 112 self.topline.y2 = 112 self.butline.y2 = 160 self.butline.y1 = 160 self.butline.x1 = 97 self.butline.x2 = 105 self.vline.x1 = 97 self.vline.x2 = 97 self.vline.y2 = 112 self.vline.y1 = 160 self.midline.y1 = 137 self.midline.y2 = 137 self.midline.x1 = 89 self.midline.x2 = 97 self.pie1.slices[0].fillColor = PCMYKColor(100,60,0,50,spotName='XXX X',alpha=100) self.pie1.slices[1].fillColor = PCMYKColor(66,13,0,22,spotName='7475C',alpha=100) self.pie1.slices[2].fillColor = PCMYKColor(0,100,100,40,alpha=100) self.pie1.slices[3].fillColor = PCMYKColor(100,0,90,50,spotName='XXX X',alpha=100) self.legend1.colorNamePairs = [(PCMYKColor(100,60,0,50,spotName='XXX X',alpha=100), u'Government\nFunds: 85.8%'), (PCMYKColor(66,13,0,22,spotName='7475C',alpha=100), u'Contributions: 1.5%'), (PCMYKColor(0,100,100,40,alpha=100), u'Investments: 11.2%'), (PCMYKColor(100,0,90,50,spotName='XXX X',alpha=100), u'other: 1.6%')] if __name__=="__main__": #NORUNTESTS PieChart06().save(formats=['pdf'],outDir='.',fnRoot=None)