def get_chart_url(data): chart = GroupedVerticalBarChart(800, 200, y_range=(0, max(data))) chart.set_bar_width(3) #should be calculated chart.set_bar_spacing(0) chart.set_colours(['4D89F9']) chart.add_data(data) return chart.get_url()
def grouped_vertical(): chart = GroupedVerticalBarChart(settings.width, settings.height, y_range=(0, 35)) chart.set_bar_width(5) chart.set_colours(['00ff00', 'ff0000']) chart.add_data([1,2,3,4,5]) chart.add_data([1,4,9,16,25]) chart.download('bar-vertical-grouped.png')
def bargraph(self, days, bars, output, title=""): data = [] min_count = 0 max_count = 0 date = lambda i: datetime.date.today() + datetime.timedelta(-days + i) for i in range(0, days + 1): count = bars[date(i)] max_count = max(count, max_count) min_count = min(count, min_count) data.append(count) # TOFIX: google chart API for negative numbers is too screwy, for now only >0 min_count = max(min_count, 0) chart = GroupedVerticalBarChart(800, 300, y_range=[min_count, max_count]) chart.add_data(data) chart.set_bar_width(500 / days) # Set the line colour to blue chart.set_colours(['0000FF']) # Set the horizontal dotted lines chart.set_grid(0, 25, 5, 5) if days >= 30: fmt = "%d" else: fmt = "%d/%m" chart.set_axis_labels(Axis.BOTTOM, \ [date(i).strftime(fmt) for i in range(0,days)]) # The Y axis labels contains 0 to 100 skipping every 25, but remove the # first number because it's obvious and gets in the way of the first X # label. delta = float(max_count - min_count) / 100 skip = max(int(delta) / 5 * 100, 100) left_axis = range(0, max_count + 1, skip) left_axis[0] = '' chart.set_axis_labels(Axis.LEFT, left_axis) if len(title) > 0: chart.set_title(title % days) chart.download(output)
def _bar_graph(data, legends, axis_labels, size, steps, type=StackedVerticalBarChart, multiline=False): if multiline: max_values = [] min_values = [] for row in data: max_values.append(max(row)) min_values.append(min(row)) max_value = max(max_values) min_value = min(min_values) else: max_value = max(data) min_value = min(data) #validando si hay datos para hacer grafico if max_value == 0: return None step = ((max_value * 1.05) - (min_value * 0.95)) / steps #validando en caso de el paso sea menor que uno y de cero en la conversion if step < 1: step = 1 tope = int(round(max_value * 1.05)) if tope < max_value: tope += 2 else: tope += 1 left_axis = range(int(round(min_value * 0.95)), tope, int(step)) left_axis[0] = '' if type == StackedHorizontalBarChart: graph = StackedHorizontalBarChart(size[0], size[1], x_range=(0, max_value * 1.05)) graph.set_axis_labels(Axis.BOTTOM, left_axis) if axis_labels: graph.set_axis_labels(Axis.LEFT, axis_labels) elif type == StackedVerticalBarChart: graph = StackedVerticalBarChart(size[0], size[1], y_range=(0, max_value * 1.05)) graph.set_axis_labels(Axis.LEFT, left_axis) if axis_labels: graph.set_axis_labels(Axis.BOTTOM, axis_labels) elif type == GroupedHorizontalBarChart: graph = GroupedHorizontalBarChart(size[0], size[1], x_range=(0, max_value * 1.05)) graph.set_axis_labels(Axis.BOTTOM, left_axis) if axis_labels: graph.set_axis_labels(Axis.LEFT, axis_labels) graph.set_bar_spacing(5) elif type == GroupedVerticalBarChart: graph = GroupedVerticalBarChart(size[0], size[1], y_range=(0, max_value * 1.05)) graph.set_axis_labels(Axis.LEFT, left_axis) if axis_labels: graph.set_axis_labels(Axis.BOTTOM, axis_labels) graph.set_bar_spacing(5) else: pass #raise exception if multiline: for fila in data: graph.add_data(fila) else: graph.add_data(data) graph.set_colours( ['FFBC13', '22A410', 'E6EC23', '2B2133', 'BD0915', '3D43BD']) graph.set_bar_width(44) graph.set_legend(legends) graph.set_legend_position('b') return graph
def PrintAverageCharts(dataviews): # another chart that shows the deviation from the average over the week, as a bar chart print '<table frame="border">' ncols = 3 print '<tr><td colspan="%d" align="center" style="font-family:Arial;">Averaged Pollutants per day of week</td></tr>' % ncols icharts = 0 for title, view in dataviews: weekchart = dict( [d, dict([k, []] for k in view.keys())] for d in range(7) ) # for each day of the week, and for each data type an empty list # for each dataset in this view, put datapoint into the list of the week day for k in view: data = view[k] for iday in range(len(data)): weekchart[(iday + firstweekday) % 7][k].append(data[iday]) # bar chart of averages per day datasets = [] max_y = None for k in view: data = [0. for i in range(7)] for d in weekchart: data[d] = sum(weekchart[d][k]) / len(weekchart[d][k]) datasets.append(data) max_y = max(max_y, max(data)) # bar chart c = GroupedVerticalBarChart(400, 250, y_range=[0, max_y]) c.set_bar_width(20 / len(datasets)) c.set_bar_spacing(0) if len(datasets) > 1: c.set_legend([k[0] for k in view.keys()]) # Set the line colours c.set_colours(['0000FF', 'FF0000']) for data in datasets: c.add_data(data) # y axis labels if max_y > 30: left_axis = range(0, int(max_y) + 1, 5) elif max_y > 10: left_axis = range(0, int(max_y) + 1, 1) elif max_y > 5: left_axis = [] v = 0. while v < max_y + 0.5: left_axis.append(v) v += 0.5 else: left_axis = [] v = 0. while v < max_y + 0.1: left_axis.append(v) v += 0.1 left_axis[0] = '' # no label at 0 c.set_axis_labels(Axis.LEFT, left_axis) c.set_axis_labels(Axis.BOTTOM, [weekdays[d] for d in weekchart.keys()]) if icharts % ncols == 0: print '%s<tr>' % (icharts > 0 and '</tr>' or '') print '<td><img src="%s&chtt=%s"></td>' % (c.get_url(), title) icharts += 1 print '</tr></table>'
def __bar_graphic__(data, legends, axis_labels, size, steps, type=StackedVerticalBarChart, multiline=False): if multiline: max_values = [] min_values = [] for row in data: max_values.append(max(row)) min_values.append(min(row)) max_value = max(max_values) min_value = min(min_values) else: max_value = max(data) min_value = min(data) step = ((max_value * 1.05) - (min_value * 0.95)) / steps left_axis = range(int(min_value * 0.95), int(max_value * 1.05), int(step)) left_axis[0] = '' if type == StackedHorizontalBarChart: graph = StackedHorizontalBarChart(size[0], size[1], x_range=(0, max_value * 1.05)) graph.set_axis_labels(Axis.BOTTOM, left_axis) graph.set_axis_labels(Axis.LEFT, axis_labels) elif type == StackedVerticalBarChart: graph = StackedVerticalBarChart(size[0], size[1], y_range=(0, max_value * 1.05)) graph.set_axis_labels(Axis.LEFT, left_axis) graph.set_axis_labels(Axis.BOTTOM, axis_labels) elif type == GroupedHorizontalBarChart: graph = GroupedHorizontalBarChart(size[0], size[1], x_range=(0, max_value * 1.05)) graph.set_axis_labels(Axis.BOTTOM, left_axis) graph.set_axis_labels(Axis.LEFT, axis_labels) graph.set_bar_spacing(5) elif type == GroupedVerticalBarChart: graph = GroupedVerticalBarChart(size[0], size[1], y_range=(0, max_value * 1.05)) graph.set_axis_labels(Axis.LEFT, left_axis) graph.set_axis_labels(Axis.BOTTOM, axis_labels) graph.set_bar_spacing(5) else: pass #raise exception if multiline: for fila in data: graph.add_data(fila) else: graph.add_data(data) graph.set_colours( ['FFBC13', '22A410', 'E6EC23', '2B2133', 'BD0915', '3D43BD']) graph.set_bar_width(40) graph.set_legend(legends) graph.set_legend_position('b') return graph