xref: /aosp_15_r20/external/toolchain-utils/crosperf/column_chart.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li# -*- coding: utf-8 -*-
2*760c253cSXin Li# Copyright 2011 The ChromiumOS Authors
3*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be
4*760c253cSXin Li# found in the LICENSE file.
5*760c253cSXin Li
6*760c253cSXin Li"""Module to draw column chart."""
7*760c253cSXin Li
8*760c253cSXin Li
9*760c253cSXin Liclass ColumnChart(object):
10*760c253cSXin Li    """class to draw column chart."""
11*760c253cSXin Li
12*760c253cSXin Li    def __init__(self, title, width, height):
13*760c253cSXin Li        self.title = title
14*760c253cSXin Li        self.chart_div = "".join(t for t in title if t.isalnum())
15*760c253cSXin Li        self.width = width
16*760c253cSXin Li        self.height = height
17*760c253cSXin Li        self.columns = []
18*760c253cSXin Li        self.rows = []
19*760c253cSXin Li        self.series = []
20*760c253cSXin Li
21*760c253cSXin Li    def AddSeries(self, column_name, series_type, color):
22*760c253cSXin Li        for i in range(len(self.columns)):
23*760c253cSXin Li            if column_name == self.columns[i][1]:
24*760c253cSXin Li                self.series.append((i - 1, series_type, color))
25*760c253cSXin Li                break
26*760c253cSXin Li
27*760c253cSXin Li    def AddColumn(self, name, column_type):
28*760c253cSXin Li        self.columns.append((column_type, name))
29*760c253cSXin Li
30*760c253cSXin Li    def AddRow(self, row):
31*760c253cSXin Li        self.rows.append(row)
32*760c253cSXin Li
33*760c253cSXin Li    def GetJavascript(self):
34*760c253cSXin Li        res = "var data = new google.visualization.DataTable();\n"
35*760c253cSXin Li        for column in self.columns:
36*760c253cSXin Li            res += "data.addColumn('%s', '%s');\n" % column
37*760c253cSXin Li        res += "data.addRows(%s);\n" % len(self.rows)
38*760c253cSXin Li        for row in range(len(self.rows)):
39*760c253cSXin Li            for column in range(len(self.columns)):
40*760c253cSXin Li                val = self.rows[row][column]
41*760c253cSXin Li                if isinstance(val, str):
42*760c253cSXin Li                    val = "'%s'" % val
43*760c253cSXin Li                res += "data.setValue(%s, %s, %s);\n" % (row, column, val)
44*760c253cSXin Li
45*760c253cSXin Li        series_javascript = ""
46*760c253cSXin Li        for series in self.series:
47*760c253cSXin Li            series_javascript += "%s: {type: '%s', color: '%s'}, " % series
48*760c253cSXin Li
49*760c253cSXin Li        chart_add_javascript = """
50*760c253cSXin Livar chart_%s = new google.visualization.ComboChart(
51*760c253cSXin Li  document.getElementById('%s'));
52*760c253cSXin Lichart_%s.draw(data, {width: %s, height: %s, title: '%s', legend: 'none',
53*760c253cSXin Li  seriesType: "bars", lineWidth: 0, pointSize: 5, series: {%s},
54*760c253cSXin Li  vAxis: {minValue: 0}})
55*760c253cSXin Li"""
56*760c253cSXin Li
57*760c253cSXin Li        res += chart_add_javascript % (
58*760c253cSXin Li            self.chart_div,
59*760c253cSXin Li            self.chart_div,
60*760c253cSXin Li            self.chart_div,
61*760c253cSXin Li            self.width,
62*760c253cSXin Li            self.height,
63*760c253cSXin Li            self.title,
64*760c253cSXin Li            series_javascript,
65*760c253cSXin Li        )
66*760c253cSXin Li        return res
67*760c253cSXin Li
68*760c253cSXin Li    def GetDiv(self):
69*760c253cSXin Li        return "<div id='%s' class='chart'></div>" % self.chart_div
70