33
32
# Helper variables and functions
34
33
# -----------------------------------------------------------------------------
37
36
__author__ = 'Gerald Kaszuba'
39
38
reo_colour = re.compile('^([A-Fa-f0-9]{2,2}){3,4}$')
164
163
raise DataOutOfRangeException()
165
164
encoded_data.append(','.join(sub_data))
166
return 'chd=t:' + '%7c'.join(encoded_data)
165
return 'chd=t:' + '|'.join(encoded_data)
169
168
def scale_value(cls, value, range):
347
345
# optional arguments
349
347
url_bits.append('chtt=%s' % self.title)
350
if self.title_colour and self.title_font_size:
351
url_bits.append('chts=%s,%s' % (self.title_colour, \
352
self.title_font_size))
354
url_bits.append('chdl=%s' % '%7c'.join(self.legend))
349
url_bits.append('chdl=%s' % '|'.join(self.legend))
355
350
if self.legend_position:
356
351
url_bits.append('chdlp=%s' % (self.legend_position))
358
353
url_bits.append('chco=%s' % ','.join(self.colours))
359
354
if self.colours_within_series:
360
url_bits.append('chco=%s' % '%7c'.join(self.colours_within_series))
355
url_bits.append('chco=%s' % '|'.join(self.colours_within_series))
361
356
ret = self.fill_to_url()
363
358
url_bits.append(ret)
376
371
style.append(','.join(values))
377
url_bits.append('chls=%s' % '%7c'.join(style))
372
url_bits.append('chls=%s' % '|'.join(style))
379
374
url_bits.append('chg=%s' % self.grid)
401
396
self.title = None
403
def set_title_style(self, colour, font_size):
404
if not colour is None:
405
_check_colour(colour)
406
self.title_colour = colour
407
self.title_font_size = font_size
409
398
def set_legend(self, legend):
410
399
"""legend needs to be a list, tuple or None"""
411
400
assert(isinstance(legend, list) or isinstance(legend, tuple) or
458
447
assert(angle >= 0 and angle <= 90)
459
448
assert(len(args) % 2 == 0)
460
449
args = list(args) # args is probably a tuple and we need to mutate
461
for a in xrange(int(len(args) / 2)):
450
for a in xrange(len(args) / 2):
462
451
col = args[a * 2]
463
452
offset = args[a * 2 + 1]
464
453
_check_colour(col)
485
474
areas.append('%s,%s,%s' % (area, self.fill_types[area], \
486
475
self.fill_area[area]))
488
return 'chf=' + '%7c'.join(areas)
477
return 'chf=' + '|'.join(areas)
491
480
# -------------------------------------------------------------------------
615
604
def set_axis_labels(self, axis_type, values):
616
605
assert(axis_type in Axis.TYPES)
617
values = [urllib.quote(str(a)) for a in values]
606
values = [urllib.quote(a) for a in values]
618
607
axis_index = len(self.axis)
619
608
axis = LabelAxis(axis_index, axis_type, values)
620
609
self.axis.append(axis)
665
654
url_bits.append('chxt=%s' % ','.join(available_axis))
667
url_bits.append('chxl=%s' % '%7c'.join(label_axis))
656
url_bits.append('chxl=%s' % '|'.join(label_axis))
669
url_bits.append('chxr=%s' % '%7c'.join(range_axis))
658
url_bits.append('chxr=%s' % '|'.join(range_axis))
671
url_bits.append('chxp=%s' % '%7c'.join(positions))
660
url_bits.append('chxp=%s' % '|'.join(positions))
673
url_bits.append('chxs=%s' % '%7c'.join(styles))
662
url_bits.append('chxs=%s' % '|'.join(styles))
674
663
return '&'.join(url_bits)
676
665
# Markers, Ranges and Fill area (chm)
677
666
# -------------------------------------------------------------------------
679
668
def markers_to_url(self):
680
return 'chm=%s' % '%7c'.join([','.join(a) for a in self.markers])
669
return 'chm=%s' % '|'.join([','.join(a) for a in self.markers])
682
671
def add_marker(self, index, point, marker_type, colour, size, priority=0):
683
672
self.markers.append((marker_type, colour, str(index), str(point), \
687
676
self.markers.append(('r', colour, '0', str(start), str(stop)))
689
678
def add_data_line(self, colour, data_set, size, priority=0):
690
self.markers.append(('D', colour, str(data_set), '0', str(size), \
679
self.markers.append(('D', colour, str(data_set), '0', str(size), str(priority)))
693
def add_marker_text(self, string, colour, data_set, data_point, size, \
695
self.markers.append((str(string), colour, str(data_set), \
696
str(data_point), str(size), str(priority)))
681
def add_marker_text(self, string, colour, data_set, data_point, size, priority=0):
682
self.markers.append((str(string), colour, str(data_set), str(data_point), str(size), str(priority)))
698
684
def add_vertical_range(self, colour, start, stop):
699
685
self.markers.append(('R', colour, '0', str(start), str(stop)))
899
885
def get_url_bits(self, data_class=None):
900
886
url_bits = Chart.get_url_bits(self, data_class=data_class)
901
887
if self.pie_labels:
902
url_bits.append('chl=%s' % '%7c'.join(self.pie_labels))
888
url_bits.append('chl=%s' % '|'.join(self.pie_labels))
905
891
def annotated_data(self):
908
894
for dataset in self.data:
909
895
yield ('x', dataset)
911
def scaled_data(self, data_class, x_range=None, y_range=None):
913
x_range = [0, sum(self.data[0])]
914
return Chart.scaled_data(self, data_class, x_range, self.y_range)
917
898
class PieChart2D(PieChart):
1003
984
if self.encoding:
1004
985
url_bits.append('choe=%s' % self.encoding)
1005
986
if self.ec_level:
1006
url_bits.append('chld=%s%%7c%s' % (self.ec_level, self.margin))
987
url_bits.append('chld=%s|%s' % (self.ec_level, self.margin))
1009
990
def set_encoding(self, encoding):