def __init__(self, width=400, height=200, *args, **kw): Drawing.__init__(self, width, height, *args, **kw) # Width and height of chart. self.width = 772 self.height = 280 # Add title self._add(self, Label(), name='title', validate=None, desc=None) self.title._text = 'Simple Bar Chart' self.title.fontSize = 24 self.title.fontName = "Calibri" # Position Title self.title.x = 386 self.title.y = 240 # Add Bar chart to the Drawing. self._add(self, VerticalBarChart(), name="chart", validate=None, desc=None) # Bar Chart Position self.chart.x = 150 self.chart.y = 20 # Bar Chart Dimensions self.chart.width = 400 self.chart.height = 150 # Data will be sent from RML. However, defaults can be initialized here. self.chart.data = [] self.chart.barLabelArray = None # Ticks invisible on X-Axis self.chart.categoryAxis.visibleTicks = 0 # X-Axis visible self.chart.categoryAxis.visibleAxis = 1 # X-Axis labels. Data will be sent from RML. However, defaults can be initialized here. self.chart.categoryAxis.categoryNames = [] # Vertically display X-Axis labels self.chart.categoryAxis.labels.angle = 90 # Offset for X-Axis Labels self.chart.categoryAxis.labels.dy = -15 # Show bars one on top of the other. # self.chart.categoryAxis.style = 'stacked' # Y-Axis Visible self.chart.valueAxis.visibleAxis = 1 self.chart.valueAxis.labelTextFormat = None # Avoid assuming minimum value as origin self.chart.valueAxis.avoidBoundSpace = (5, 0) # Offset for Y-Axis Labels self.chart.valueAxis.labels.dx = -8 # Add Description Label for Y-Axis self._add(self, Label(), name='yAxistitle', validate=None, desc=None) # Label properties self.yAxistitle.angle = 90 self.yAxistitle._text = 'Y axis text' self.yAxistitle.x = 110 self.yAxistitle.y = 80 # Color the bars self.chart.bars[0].fillColor = toColor(0xae1a09) self.chart.bars[0].strokeColor = toColor( 0xae1a09) # Color(.290196, .427451, .741176, 1) self.chart.bars[1].fillColor = toColor(0x0079c1) self.chart.bars[1].strokeColor = toColor(0x0079c1)
def add_findings_by_provider_chart(): drawing = Drawing(300, 200) data = get_findings_by_provider() maxVal = max(data[0]) if (maxVal > 1000): multiplier = 1000 step = 4 * multiplier else: multiplier = 100 step = 4 * multiplier value_step = int(ceil(maxVal / step)) * multiplier if (value_step < 10): value_step = 10 bar = HorizontalBarChart() bar.x = 30 bar.y = 0 bar.height = 100 bar.width = 400 bar.data = data bar.strokeColor = colors.white bar.valueAxis.valueMin = 0 bar.valueAxis.valueMax = maxVal * 2 ## graph displa twice as much as max violation bar.valueAxis.valueStep = value_step ## Convert to neartest 100 bar.categoryAxis.labels.boxAnchor = 'ne' bar.categoryAxis.labels.dx = -10 bar.categoryAxis.labels.dy = -2 bar.categoryAxis.labels.fontName = 'Helvetica' bar.categoryAxis.categoryNames = ["AWS", "Azure"] bar.bars[(0, 0)].fillColor = HexColor("#434476") bar.bars[(0, 1)].fillColor = HexColor("#B170DB") bar.barWidth = 3.5 bar.barSpacing = 0.1 bar.barLabelFormat = '%d' bar.barLabels.nudge = 15 bar.bars[0].strokeColor = None drawing.add(bar) # add_legend(drawing, bar) yLabel = Label() yLabel.setText("Number of Findings") yLabel.fontSize = 10 yLabel.fontName = 'Helvetica' yLabel.dx = 250 yLabel.dy = -30 chartLabel = Label() chartLabel.setText("Findings by Provider") chartLabel.fontSize = 10 chartLabel.fillColor = HexColor("#737373") chartLabel.fontName = 'Helvetica-Bold' chartLabel.dx = 250 chartLabel.dy = 160 drawing.add(chartLabel) drawing.add(yLabel) fields.append(drawing)
def __init__(self,title,ylable): self.drawing = Drawing(400,200) self.lp = LinePlot() self.lp.x = 50 self.lp.y = 50 self.lp.height = 125 self.lp.width = 300 #title设置 self.title = Label() self.title.fontSize = 12 title_text = title self.title._text = title_text self.title.x = 190 self.title.y = 190 self.title.textAnchor ='middle' #x轴设置 self.Xlabel = Label() self.Xlabel._text = 'time' self.Xlabel.fontSize = 12 self.Xlabel.x = 380 self.Xlabel.y = 30 self.Xlabel.textAnchor ='middle' #y轴设置 self.Ylabel = Label() self.Ylabel._text = ylable self.Ylabel.fontSize = 12 self.Ylabel.x = 40 self.Ylabel.y = 190 self.Ylabel.textAnchor ='middle'
def drawing_chinese(): from reportlab.graphics.charts.lineplots import LinePlot from reportlab.graphics.charts.textlabels import Label from reportlab.graphics import renderPDF from reportlab.graphics.widgets.markers import makeMarker data = [((1, 100), (2, 200), (3, 300), (4, 400), (5, 500)), ((1, 50), (2, 80), (3, 400), (4, 40), (5, 70))] drawing = Drawing(500, 300) lp = LinePlot() lp.x = 50 #������������ lp.y = 30 lp.height = 250 lp.width = 400 lp.data = data lp.joinedLines = 1 lp.lines.symbol = makeMarker('FilledCircle') lp.xValueAxis.valueMin = 1 lp.xValueAxis.valueMax = 5 lp.xValueAxis.valueStep = 1 lp.yValueAxis.valueMin = 0 lp.yValueAxis.valueMax = 500 lp.yValueAxis.valueStep = 100 drawing.add(lp) title = Label() #����Ҫ��ʾ���ģ���Ҫ��ע��һ���������� title.fontName = "msyh" title.fontSize = 12 title_text = u'你好吗' #title_text = "abc" title._text = title_text title.x = 250 title.y = 280 title.textAnchor = 'middle' drawing.add(title) Xlabel = Label() Xlabel._text = 'x' Xlabel.fontSize = 12 Xlabel.x = 480 Xlabel.y = 30 Xlabel.textAnchor = 'middle' drawing.add(Xlabel) Ylabel = Label() Ylabel._text = "y" Ylabel.fontSize = 12 Ylabel.x = 40 Ylabel.y = 295 Ylabel.textAnchor = 'middle' drawing.add(Ylabel) try: drawing.save(formats=['gif'], outDir=".", fnRoot="abc") except: import traceback traceback.print_exc()
def addChromosomes(drawing, chrNames, chrSizes, xmap, ymap, w=0.1 * DPI, fillColor=colors.skyblue, strokeColor=colors.skyblue): for i, chrom in enumerate(chrNames): x = xmap(i + 1) y = ymap(chrSizes[chrom]) h = ymap(1) - ymap(chrSizes[chrom]) chromosome = Rect(x, y, w, h, strokeColor=strokeColor, fillColor=fillColor) drawing.add(chromosome) topCap = Wedge(x + 0.5 * w, y + h, 0.5 * w, 0, 180, strokeColor=strokeColor, fillColor=fillColor) bottomCap = Wedge(x + 0.5 * w, y, 0.5 * w, 180, 0, strokeColor=strokeColor, fillColor=fillColor) drawing.add(topCap) drawing.add(bottomCap) label = Label() label.setOrigin(xmap(i + 1) + w / 2, ymap(0)) label.boxAnchor = 's' label.textAnchor = 'middle' label.dx = 0 label.dy = DPI / 10 label.setText(chrom) label.fontSize = 36 label.fontName = 'Helvetica' drawing.add(label) chrLength = Label() chrLength.setOrigin(xmap(i + 1) + w / 2, ymap(chrSizes[chrom])) chrLength.boxAnchor = 'n' chrLength.textAnchor = 'middle' chrLength.dx = 0 chrLength.dy = -DPI / 10 chrLength.setText('%iMb' % int(chrSizes[chrom] / 1e6)) chrLength.fontSize = 24 chrLength.fontName = 'Helvetica' drawing.add(chrLength)
def __init__(self, xList, yList, width=400, height=200, *args, **kw): Drawing.__init__(self, width, height, *args, **kw) self.width = 80 * 1.2 * 2.5 self.height = 60 * 0.8 * 2.5 self._add(self, VerticalBarChart(), name='chart', validate=None, desc=None) self.chart.y = 11.2 * 2 self.chart.x = 20 * 2 #self.chart.data = [[0.05, 0.05, 0.1, 0.1, 0.05, 0.05, 0.955555]] self.chart.data = yList self.chart.width = self.width * 0.75 self.chart.height = self.height * 0.75 self.chart.bars.strokeColor = None self.chart.bars[0].fillColor = colors.blue maxTmp = (max(yList[0]) / 1000) * 1000 valueStepsTmp = [] for i in [0.2, 0.4, 0.6, 0.8, 1.0]: valueStepsTmp.append(i * maxTmp) self.chart.valueAxis.valueSteps = valueStepsTmp self.chart.categoryAxis.visibleTicks = False self.chart.barLabels.fontSize = 2.8 * 2.5 self.chart.barLabels.fontName = 'Helvetica-Bold' self.chart.valueAxis.labels.fontSize = 2.8 * 2.5 self.chart.valueAxis.labels.fontName = 'Helvetica-Bold' xListNew = [] interval = (max([int(item) for item in xList]) - min([int(item) for item in xList])) / 10 for i in range(len(xList)): if i % interval == 0: xListNew.append(xList[i]) else: xListNew.append('') self.chart.categoryAxis.categoryNames = xListNew self.chart.categoryAxis.labels.fontSize = 2.8 * 2.5 self.chart.categoryAxis.labels.fontName = 'Helvetica-Bold' self._add(self, Label(), name='XLabel', validate=None, desc='Percentage') self.XLabel.fontSize = 4.4 * 2 self.XLabel.fontName = 'Helvetica-Bold' self.XLabel._text = 'Read length' self.XLabel.dx = 48 * 2.5 self.XLabel.dy = 2 self._add(self, Label(), name='YLabel', validate=None, desc='Percentage') self.YLabel.fontSize = 4.4 * 2 self.YLabel.fontName = 'Helvetica-Bold' self.YLabel._text = 'Counts' self.YLabel.dx = 0.8 self.YLabel.dy = 32 * 2.5 self.YLabel.angle = 90
def comparison_graphs(comparison_values, location, emission, default_emissions, default_location): s = Spacer(9 * inch, .2 * inch) Elements.append(s) drawing = Drawing(0, 0) if not default_location: bc = gen_bar_graphs(comparison_values, location, emission) bc.y = -120 bc.height = 125 bc.width = 300 drawing.add(bc) else: bc1 = gen_bar_graphs(default_emissions[:3], location, emission) bc2 = gen_bar_graphs(default_emissions[3:6], location, emission) bc3 = gen_bar_graphs(default_emissions[6:], location, emission) offset = -257 bc1.x = -10 + offset bc2.x = 190 + offset bc3.x = 390 + offset drawing.add(bc1) drawing.add(bc2) drawing.add(bc3) label_offset = offset + 80 label1, label2, label3 = Label(), Label(), Label() label1.setText("Global (excluding Europe and US)") label1.x, label1.y = -17 + label_offset, -160 label1.fontName = "Times-Bold" label2.setText("Europe") label2.x, label2.y = 185 + label_offset, -160 label2.fontName = "Times-Bold" label3.setText("United States") label3.x, label3.y = 385 + label_offset, -160 label3.fontName = "Times-Bold" drawing.add(label1) drawing.add(label2) drawing.add(label3) if_elsewhere_para = Paragraph( '<font face="times" size=12>Kilograms of CO<sub rise = -10 size' + ' = 8>2 </sub> emissions for the function if the computation had been performed elsewhere</font>', style=styles["Normal"]) graph_data = [['Emission Comparison'], [if_elsewhere_para], [drawing]] graph_table = Table(graph_data, [6.5 * inch], [.25 * inch, .25 * inch, .25 * inch], hAlign="CENTER") graph_table.setStyle( TableStyle([('FONT', (0, 0), (0, 0), "Times-Bold"), ('FONT', (0, 1), (0, 1), "Times-Roman"), ('FONTSIZE', (0, 0), (0, 0), 13), ('FONTSIZE', (0, 1), (0, 1), 12), ('ALIGN', (0, 0), (-1, -1), "CENTER")])) Elements.append(graph_table)
def draw_recent_week_pdf(filename, data_list): """ 画最近七天的流量计报表 :param filename: :param data_list :return: """ data = [] max_val = 0 for index in range(0, len(data_list)): data.append((index + 1, data_list[index])) max_val = max(max_val, data_list[index]) drawing = Drawing(500, 800) lp = LinePlot() lp.x = 50 lp.y = 80 lp.height = 600 lp.width = 400 lp.data = [data] lp.joinedLines = 1 lp.lines.symbol = makeMarker('FilledCircle') lp.xValueAxis.valueMin = 1 lp.xValueAxis.valueMax = 7 lp.xValueAxis.valueStep = 1 lp.yValueAxis.valueMin = 0 lp.yValueAxis.valueMax = (int(max_val / 100) + 1) * 100 lp.yValueAxis.valueStep = 100 drawing.add(lp) x_title = Label() # 若需要显示中文,需要先注册一个中文字体 pdfmetrics.registerFont(ttfonts.TTFont("haha", "simsun.ttc")) x_title.fontName = "haha" x_title.fontSize = 12 title_text = '用气量' x_title._text = title_text x_title.x = 20 x_title.y = 100 x_title.textAnchor = 'middle' drawing.add(x_title) y_title = Label() # 若需要显示中文,需要先注册一个中文字体 pdfmetrics.registerFont(ttfonts.TTFont("haha", "simsun.ttc")) y_title.fontName = "haha" y_title.fontSize = 12 title_text = '最近七天' y_title._text = title_text y_title.x = 80 y_title.y = 50 y_title.textAnchor = 'middle' drawing.add(y_title) drawing.save(formats=['pdf'], outDir=TMP_FILE_DIRECTORY_PATH, fnRoot=filename)
def getHumPlot(): drawing = Drawing(400, 200) humedad = [getHumedad()] lp = LinePlot() lp.x = 50 lp.y = 50 lp.height = 125 lp.width = 300 lp.data = humedad ydlabel = Label() ydlabel.setText("Humedad (%)") ydlabel.angle = 90 ydlabel.setOrigin(20, 120) lp.joinedLines = 2 lp.lines[0].symbol = makeMarker('Circle') lp.lines[0].strokeColor = colors.blue lp.xValueAxis.valueMin = 0 lp.xValueAxis.valueMax = 30 lp.yValueAxis.valueMin = 0 lp.yValueAxis.valueMax = 100 #lp.xValueAxis.visible=False #lp.yValueAxis.visible=False #Hide 2nd plot its Yaxis drawing.add(lp) drawing.add(ydlabel) drawing.add(String(130, 200, "Gráfico de humedad", fontSize=16)) return drawing
def colorTest(self): from reportlab.graphics.shapes import Rect from reportlab.graphics.charts.textlabels import Label self.colorRangeStatic(130) dim=25 width = self.PAGE_WIDTH-150 inrow = 8 #int(width/dim) height = int(len(self.colors)/inrow) if len(self.colors)%inrow > 0: height +=1 height *= dim drawing = Drawing(width, height) for i,col in enumerate(self.colors): x = (i%inrow)*dim y = int(i/inrow)*dim rec = Rect(x=x,y=y,width=dim,height=dim) rec.fillColor = col drawing.add(rec) lab = Label() lab.x=x+dim/2 lab.y=y+dim/2 lab.setText('%d'%i) drawing.add(lab) return drawing
def draw(self): # general widget bits w = float(self.length) h = float(self.height) g = shapes.Group() body = shapes.Polygon( [self.x-0.5*w, self.y-0.5*w, self.x-0.5*w, self.y+0.5*w, self.x+0.5*w, self.y], fillColor=self.fillColor, strokeColor=self.strokeColor, strokeWidth=self.strokeWidth) g.add(body) if self.label: b = g.getBounds() s = Label() s.setText(self.label) s.setOrigin(self.x+0.5*w, self.y-h/2+b[3]-b[1]+4) s.boxAnchor = self.boxAnchor s.textAnchor = self.textAnchor s.fontName = 'Helvetica' s.fontSize = self.fontSize s.angle = self.labelAngle g.add(s) return g
def addScale(drawing, xmap, y, start, end, tickLen=10, dx=3, dy=6, textAnchor='middle', boxAnchor='s', fontSize=12, strokeWidth=1, strokeColor=colors.black, scale=1.0, format='%ibp'): x1 = xmap(start) x2 = xmap(end) line = Line(x1+dx,y,x2-dx,y, strokeWidth=strokeWidth, strokeColor=strokeColor) drawing.add(line) leftTick = Line(x1+dx,y-0.5*tickLen,x1+dx,y+0.5*tickLen, strokeWidth=strokeWidth, strokeColor=strokeColor) drawing.add(leftTick) rightTick = Line(x2-dx,y-0.5*tickLen,x2-dx,y+0.5*tickLen, strokeWidth=strokeWidth, strokeColor=strokeColor) drawing.add(rightTick) label = Label() label.setOrigin(0.5*(x1+x2), y+dy) distance = float(end-start)/scale label.setText(format % (distance/scale)) label.fontSize = fontSize label.textAnchor = textAnchor label.boxAnchor = boxAnchor drawing.add(label)
def __init__(self,width=200,height=150,*args,**kw): Drawing.__init__(self,width,height,*args,**kw) self._add(self,ScatterPlot(),name='chart',validate=None,desc="The main chart") self.chart.width = 115 self.chart.height = 80 self.chart.x = 30 self.chart.y = 40 self.chart.lines[0].strokeColor = color01 self.chart.lines[1].strokeColor = color02 self.chart.lines[2].strokeColor = color03 self.chart.lines[3].strokeColor = color04 self.chart.lines[4].strokeColor = color05 self.chart.lines[5].strokeColor = color06 self.chart.lines[6].strokeColor = color07 self.chart.lines[7].strokeColor = color08 self.chart.lines[8].strokeColor = color09 self.chart.lines[9].strokeColor = color10 self.chart.fillColor = backgroundGrey self.chart.lineLabels.fontName = 'Helvetica' self.chart.xValueAxis.labels.fontName = 'Helvetica' self.chart.xValueAxis.labels.fontSize = 7 self.chart.xValueAxis.forceZero = 0 self.chart.data = [((100,100), (200,200), (250,210), (300,300), (400,500)), ((100,200), (200,300), (250,200), (300,400), (400, 600))] self.chart.xValueAxis.avoidBoundFrac = 1 self.chart.xValueAxis.gridEnd = 115 self.chart.xValueAxis.tickDown = 3 self.chart.xValueAxis.visibleGrid = 1 self.chart.yValueAxis.tickLeft = 3 self.chart.yValueAxis.labels.fontName = 'Helvetica' self.chart.yValueAxis.labels.fontSize = 7 self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") self.Title.fontName = 'Helvetica-Bold' self.Title.fontSize = 7 self.Title.x = 100 self.Title.y = 135 self.Title._text = 'Chart Title' self.Title.maxWidth = 180 self.Title.height = 20 self.Title.textAnchor ='middle' self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] self.Legend.fontName = 'Helvetica' self.Legend.fontSize = 7 self.Legend.x = 153 self.Legend.y = 85 self.Legend.dxTextSpace = 5 self.Legend.dy = 5 self.Legend.dx = 5 self.Legend.deltay = 5 self.Legend.alignment ='right' self.chart.lineLabelFormat = None self.chart.xLabel = 'X Axis' self.chart.y = 30 self.chart.yLabel = 'Y Axis' self.chart.yValueAxis.labelTextFormat = '%d' self.chart.yValueAxis.forceZero = 1 self.chart.xValueAxis.forceZero = 1 self._add(self,0,name='preview',validate=None,desc=None)
def __init__(self, width=400, height=200, *args, **kw): Drawing.__init__(self, width, height, *args, **kw) # Width and height of chart. self.width = 772 self.height = 280 # Add title self._add(self, Label(), name='title', validate=None, desc=None) self.title._text = 'Simple Pie Chart' self.title.fontSize = 24 self.title.fontName = "Calibri" # Position Title self.title.x = 386 self.title.y = 240 # Add Bar chart to the Drawing. self._add(self, Pie(), name="chart", validate=None, desc=None) # Bar Chart Dimensions self.chart.width = 150 self.chart.height = 150 self.chart.slices[2].popout = 15 # Bar Chart Position self.chart.x = (self.width - self.chart.width) / 2 self.chart.y = 20 # Data will be sent from RML. However, defaults can be initialized here. self.chart.data = [] # Sector Labels. Data will be sent from RML. However, defaults can be initialized here. self.chart.labels = [] # Start angle for Pie Chart. 90 indicates 12'o Clock position. self.chart.startAngle = 90 # Pie Chart direction. self.chart.direction = 'clockwise'
def getTalkRect(self, startTime, duration, trackId, text): "Return shapes for a specific talk" g = Group() y_bottom = self.scaleTime(startTime + duration) y_top = self.scaleTime(startTime) y_height = y_top - y_bottom if trackId is None: #spans all columns x = self._colLeftEdges[1] width = self.width - self._colWidths[0] else: #trackId is 1-based and these arrays have the margin info in column #zero, so no need to add 1 x = self._colLeftEdges[trackId] width = self._colWidths[trackId] lab = Label() lab.setText(text) lab.setOrigin(x + 0.5 * width, y_bottom + 0.5 * y_height) lab.boxAnchor = 'c' lab.width = width lab.height = y_height lab.fontSize = 6 r = Rect(x, y_bottom, width, y_height, fillColor=colors.cyan) g.add(r) g.add(lab) #now for a label # would expect to color-code and add text return g
def make_x_axis(self, x_label, x_min, x_max, x_step): self._add(self, Label(), name='XLabel', validate=None, desc="The label on the horizontal axis") self.XLabel.fontName = 'Helvetica' self.XLabel.fontSize = 10 self.XLabel.x = 22 self.XLabel.y = 45 self.XLabel.textAnchor = 'middle' self.XLabel.maxWidth = 500 self.XLabel.height = 20 self.XLabel._text = x_label self.chart.xValueAxis = XValueAxis() self.chart.xValueAxis.labels.boxAnchor = 'autox' self.chart.xValueAxis.valueMin = x_min self.chart.xValueAxis.valueMax = x_max self.chart.xValueAxis.valueStep = x_step self.chart.xValueAxis.labels.fontName = "Helvetica" self.chart.xValueAxis.labels.fontSize = 10 self.chart.xValueAxis.visibleTicks = 1 self.chart.xValueAxis.labels.rightPadding = 0 self.chart.xValueAxis.labels.dx = 1
def __init__(self, width=A4[0], height=A4[0] / 2, left_margin=0, right_margin=0, top_margin=0, bottom_margin=0, label_font_size=10, label_font_name='simsun'): self.label_font_size = label_font_size self.label_font_name = label_font_name self.width = width self.height = height # self.chart_width = self.width # self.chart_height = self.height self.chart_width = self.chart_height = min( self.width - left_margin - right_margin, self.height - top_margin - bottom_margin) self.chart = Pie() # self.chart.x = 0 # self.chart.y = 0 self.chart.x = (self.width - self.chart_width) / 2 self.chart.y = (self.height - self.chart_height) / 2 self.chart.width = self.chart_width self.chart.height = self.chart_height self.title = Label()
def graphout_stackedBar(data, labels, X, Y): drawing = Drawing(X*inch, Y*inch) bar = VerticalBarChart() bar.x = 50 bar.y = 50 bar.width = (X-2)*inch bar.height = (Y-1)*inch bar.data = data bar.bars.strokeWidth = 0 bar.categoryAxis.style='stacked' bar.categoryAxis.labels.boxAnchor = 'ne' bar.categoryAxis.labels.dx = -2 bar.categoryAxis.labels.dy = -2 bar.categoryAxis.labels.angle = 45 bar.categoryAxis.categoryNames = labels # ensure bar chart and legend coloring matches for i in range(len(data)): bar.bars[i].fillColor = colorList[i] # Create a title for the y-axis yLabel = Label() yLabel.setOrigin(0, 50) # for reference, the graph origin is (50, 50) yLabel.boxAnchor = 'c' yLabel.angle = 90 yLabel.setText('Data Storage [GB]') yLabel.fontSize=16 yLabel.dy = 1.25*inch drawing.add(yLabel) drawing.add(bar) return drawing
def add_trends_new_resolved_findings_chart(): drawing = Drawing(200, 200) data, month = get_new_resolved_trends() max_val_new_findings = max(data[0]) max_val_resolved_findings = max(data[1]) maxVal = max(max_val_new_findings, max_val_resolved_findings) if (maxVal > 1000): multiplier = 1000 step = 4 * multiplier else: multiplier = 100 step = 4 * multiplier value_step = int(ceil(maxVal / step)) * multiplier if (value_step < 10): value_step = 1 bar = VerticalBarChart() bar.x = 25 bar.y = -35 bar.height = 100 bar.width = doc.width bar.barWidth = 2 bar.data = data bar.valueAxis.valueMin = 0 bar.valueAxis.valueMax = int( maxVal * 2) ## graph displa twice as much as max violation bar.valueAxis.valueStep = value_step ## Convert to neartest step bar.categoryAxis.categoryNames = month bar.bars[0].strokeColor = None bar.bars[1].strokeColor = None bar.bars[0].fillColor = HexColor("#E57300") bar.bars[1].fillColor = HexColor("#408F00") chartLabel = Label() chartLabel.setText("Trends - New Findings") chartLabel.fontSize = 10 chartLabel.fillColor = HexColor("#737373") chartLabel.fontName = 'Helvetica-Bold' chartLabel.dx = 250 chartLabel.dy = 90 legend = Legend() legend.alignment = 'right' legend.colorNamePairs = [[HexColor("#E57300"), "New Findings"], [HexColor("#408F00"), "Resolved Findings"]] legend.columnMaximum = 2 legend.x = 400 legend.y = 120 drawing.add(legend) drawing.add(chartLabel) drawing.add(bar) fields.append(drawing)
def write_label(label, width, height, person): text = "\n".join((person['name'], person['addresses'][0])) lab = Label() lab.setOrigin(8, height - 5) lab.fontSize = 14 lab.setText(text) lab.boxAnchor = 'nw' label.add(lab)
def title_draw(self, x, y, text): chart_title = Label() chart_title.x = x chart_title.y = y chart_title.fontName = 'FreeSansBold' chart_title.fontSize = 16 chart_title.textAnchor = 'middle' chart_title.setText(text) return chart_title
def header_draw(self, x, y, text): chart_title = Label() chart_title.x = x chart_title.y = y chart_title.fontName = 'RobotoBold' chart_title.fontSize = 9 chart_title.textAnchor = 'middle' chart_title.setText(text) return chart_title
def draw(self): ascent = getFont(self.xValueAxis.labels.fontName).face.ascent if ascent == 0: ascent = 0.718 # default (from helvetica) ascent = ascent * self.xValueAxis.labels.fontSize # normalize #basic LinePlot - does the Axes, Ticks etc lp = LinePlot.draw(self) xLabel = self.xLabel if xLabel: #Overall label for the X-axis xl = Label() xl.x = (self.x + self.width) / 2.0 xl.y = 0 xl.fontName = self.xValueAxis.labels.fontName xl.fontSize = self.xValueAxis.labels.fontSize xl.setText(xLabel) lp.add(xl) yLabel = self.yLabel if yLabel: #Overall label for the Y-axis yl = Label() yl.angle = 90 yl.x = 0 yl.y = (self.y + self.height / 2.0) yl.fontName = self.yValueAxis.labels.fontName yl.fontSize = self.yValueAxis.labels.fontSize yl.setText(yLabel) lp.add(yl) # do a bounding box - in the same style as the axes if self.outerBorderOn: lp.add( Rect(self.x, self.y, self.width, self.height, strokeColor=self.outerBorderColor, strokeWidth=self.yValueAxis.strokeWidth, fillColor=None)) lp.shift(self.leftPadding, self.bottomPadding) return lp
def __init__( self, width=A4[0], height=A4[1] * 0.25, leftMargin=inch, rightMargin=inch, axis_font_size=10, axis_font_name='simsun', ): self.axis_font_name = axis_font_name self.axis_font_size = axis_font_size self.width = width self.height = height self.chart_width = self.width - leftMargin - rightMargin self.chart_height = self.height self.chart = HorizontalBarChart() self.chart.x = 0 self.chart.y = 0 self.chart.width = self.chart_width self.chart.height = self.chart_height self.chart.bars.strokeColor = None # 设置柱状图的柱子颜色 self.chart.bars[0].fillColor = deepskyblue # 设置在柱状图后增加该坐标的值 self.chart.barLabelFormat = '%0.2f' self.chart.barLabels.boxAnchor = 'w' # 锚点,用不好.. self.chart.barLabels.dx = 0.1 * cm # 柱状图的值向右偏移0.1CM # 设置柱状图的柱宽 self.chart.barWidth = height * 0.05 self.title = Label() self.x_unit = Label() self.y_unit = Label() self.title.setText('') self.x_unit.setText('') self.y_unit.setText('') self.x_unit.fontName = self.axis_font_name self.y_unit.fontName = self.axis_font_name
def __init__(self, width=200, height=150, *args, **kw): Drawing.__init__(self, width, height, *args, **kw) self._add(self, SpiderChart(), name='chart', validate=None, desc="The main chart") self.chart.width = 90 self.chart.height = 90 self.chart.x = 45 self.chart.y = 25 self.chart.strands[0].fillColor = color01 self.chart.strands[1].fillColor = color02 self.chart.strands[2].fillColor = color03 self.chart.strands[3].fillColor = color04 self.chart.strands[4].fillColor = color05 self.chart.strands[5].fillColor = color06 self.chart.strands[6].fillColor = color07 self.chart.strands[7].fillColor = color08 self.chart.strands[8].fillColor = color09 self.chart.strands[9].fillColor = color10 self.chart.strandLabels.fontName = 'Helvetica' self.chart.strandLabels.fontSize = 6 self.chart.fillColor = backgroundGrey self.chart.data = [(125, 180, 200), (100, 150, 180)] self.chart.labels = ['North', 'South', 'Central'] self._add(self, Label(), name='Title', validate=None, desc="The title at the top of the chart") self.Title.fontName = 'Helvetica-Bold' self.Title.fontSize = 7 self.Title.x = 100 self.Title.y = 135 self.Title._text = 'Chart Title' self.Title.maxWidth = 180 self.Title.height = 20 self.Title.textAnchor = 'middle' self._add(self, Legend(), name='Legend', validate=None, desc="The legend or key for the chart") self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] self.Legend.fontName = 'Helvetica' self.Legend.fontSize = 7 self.Legend.x = 153 self.Legend.y = 85 self.Legend.dxTextSpace = 5 self.Legend.dy = 5 self.Legend.dx = 5 self.Legend.deltay = 5 self.Legend.alignment = 'right' self._add(self, 0, name='preview', validate=None, desc=None)
def draw(self): # general widget bits w = float(self.length) h = float(self.height) # print self.label,w,h # Set minimum size if abs(w)<self.wmin: xmid = self.x+0.5*w w = w/abs(w) * self.wmin self.x = xmid-0.5*w g = shapes.Group() if abs(w)>self.wNoTail: # arrow specific bits body = shapes.Rect(x=self.x, y=self.y-self.aspectRatio*h/2, width=2*(w/3), height=self.aspectRatio*h, fillColor=self.fillColor, strokeColor=self.strokeColor, strokeWidth=self.strokeWidth) g.add(body) head = shapes.Polygon( points=[self.x+w, self.y, self.x+2*(w/3), self.y+h/2, self.x+2*(w/3), self.y-h/2, self.x+w, self.y], fillColor=self.fillColor, strokeColor=self.strokeColor, strokeWidth=self.strokeWidth) g.add(head) else: head = shapes.Polygon( points=[self.x+w, self.y, self.x, self.y+h/2, self.x, self.y-h/2, self.x+w, self.y], fillColor=self.fillColor, strokeColor=self.strokeColor, strokeWidth=self.strokeWidth) g.add(head) if self.label: b = g.getBounds() s = Label() s.setText(self.label) s.setOrigin(self.x+0.5*w+self.labeldx, self.y-h/2+b[3]-b[1]+self.labeldy) s.boxAnchor = self.boxAnchor s.textAnchor = self.textAnchor s.fontName = 'Helvetica' s.fontSize = self.fontSize s.angle = self.labelAngle g.add(s) return g
def _test0(self): "Perform original test function." pdfPath = outputfile('test_charts_textlabels.pdf') c = Canvas(pdfPath) label = Label() demoLabel = label.demo() demoLabel.drawOn(c, 0, 0) c.save()
def __init__(self,width=200,height=150,*args,**kw): Drawing.__init__(self,width,height,*args,**kw) self._add(self,Pie(),name='chart',validate=None,desc="The main chart") self.chart.width = 100 self.chart.height = 100 self.chart.x = 25 self.chart.y = 25 self.chart.slices[0].fillColor = color01 self.chart.slices[1].fillColor = color02 self.chart.slices[2].fillColor = color03 self.chart.slices[3].fillColor = color04 self.chart.slices[4].fillColor = color05 self.chart.slices[5].fillColor = color06 self.chart.slices[6].fillColor = color07 self.chart.slices[7].fillColor = color08 self.chart.slices[8].fillColor = color09 self.chart.slices[9].fillColor = color10 self.chart.data = (100, 150, 180) self.chart.startAngle = -90 self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") self.Title.fontName = 'Helvetica-Bold' self.Title.fontSize = 7 self.Title.x = 100 self.Title.y = 135 self.Title._text = 'Chart Title' self.Title.maxWidth = 180 self.Title.height = 20 self.Title.textAnchor ='middle' self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") self.Legend.colorNamePairs = [(color01, 'North'), (color02, 'South'), (color03, 'Central')] self.Legend.fontName = 'Helvetica' self.Legend.fontSize = 7 self.Legend.x = 160 self.Legend.y = 85 self.Legend.dxTextSpace = 5 self.Legend.dy = 5 self.Legend.dx = 5 self.Legend.deltay = 5 self.Legend.alignment ='right' self.Legend.columnMaximum = 10 self.chart.slices.strokeWidth = 1 self.chart.slices.fontName = 'Helvetica' self.background = ShadedRect() self.background.fillColorStart = backgroundGrey self.background.fillColorEnd = backgroundGrey self.background.numShades = 1 self.background.strokeWidth = 0.5 self.background.x = 20 self.background.y = 20 self.chart.slices.popout = 5 self.background.height = 110 self.background.width = 110 self._add(self,0,name='preview',validate=None,desc=None)
def _makeProtoLabel(self): "Return a label prototype for further modification." protoLabel = Label() protoLabel.dx = 0 protoLabel.dy = 0 protoLabel.boxStrokeWidth = 0.1 protoLabel.boxStrokeColor = colors.black protoLabel.boxFillColor = colors.yellow # protoLabel.text = 'Hello World!' # Does not work as expected. return protoLabel
def __init__(self, width=400, height=200, *args, **kw): Drawing.__init__(self, width, height, *args, **kw) self.add(VerticalBarChart(), name='chart') self.add(Label(), name='ylabel') self.add(Label(), name='xlabel') self.chart.x = 110 self.chart.y = -80 self.chart.width = self.width - self.chart.x - 10 self.chart.height = self.height - self.chart.y - 10 self.chart.barSpacing = 1 self.ylabel.fontName = 'Helvetica' self.ylabel.fontSize = 15 self.ylabel.angle = 90 self.ylabel.x = 80 self.ylabel.y = (self.chart.y + self.chart.height * 0.5) self.xlabel.fontSize = 15 self.xlabel.height = 0 self.xlabel.maxWidth = 100 self.xlabel.fontName = 'Helvetica' self.xlabel.x = (self.chart.x + self.chart.width * 1.2) self.xlabel.y = -80