10dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif# Copyright 2011 Google Inc. All Rights Reserved. 2e55d35ee104a41e5f7ae96f4e326f33f6beaf412Yunlian Jiang"""Module to draw column chart.""" 30dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif 4f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano 50dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharifclass ColumnChart(object): 6e55d35ee104a41e5f7ae96f4e326f33f6beaf412Yunlian Jiang """class to draw column chart.""" 7f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano 80dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif def __init__(self, title, width, height): 90dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif self.title = title 100dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif self.chart_div = filter(str.isalnum, title) 110dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif self.width = width 120dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif self.height = height 130dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif self.columns = [] 140dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif self.rows = [] 150dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif self.series = [] 160dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif 170dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif def AddSeries(self, column_name, series_type, color): 180dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif for i in range(len(self.columns)): 190dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif if column_name == self.columns[i][1]: 200dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif self.series.append((i - 1, series_type, color)) 210dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif break 220dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif 230dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif def AddColumn(self, name, column_type): 240dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif self.columns.append((column_type, name)) 250dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif 260dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif def AddRow(self, row): 270dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif self.rows.append(row) 280dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif 290dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif def GetJavascript(self): 30f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano res = 'var data = new google.visualization.DataTable();\n' 310dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif for column in self.columns: 320dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif res += "data.addColumn('%s', '%s');\n" % column 33f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano res += 'data.addRows(%s);\n' % len(self.rows) 340dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif for row in range(len(self.rows)): 350dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif for column in range(len(self.columns)): 360dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif val = self.rows[row][column] 370dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif if isinstance(val, str): 380dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif val = "'%s'" % val 39f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano res += 'data.setValue(%s, %s, %s);\n' % (row, column, val) 400dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif 41f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano series_javascript = '' 420dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif for series in self.series: 430dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif series_javascript += "%s: {type: '%s', color: '%s'}, " % series 440dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif 450dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif chart_add_javascript = """ 460dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharifvar chart_%s = new google.visualization.ComboChart( 470dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif document.getElementById('%s')); 480dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharifchart_%s.draw(data, {width: %s, height: %s, title: '%s', legend: 'none', 490dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif seriesType: "bars", lineWidth: 0, pointSize: 5, series: {%s}, 500dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif vAxis: {minValue: 0}}) 510dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif""" 52f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano 530dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif res += chart_add_javascript % (self.chart_div, self.chart_div, 54f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano self.chart_div, self.width, self.height, 55f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano self.title, series_javascript) 560dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif return res 570dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif 580dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif def GetDiv(self): 590dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif return "<div id='%s' class='chart'></div>" % self.chart_div 60