117
115
def scale_value(cls, value, range):
118
116
scaled = cls.int_scale_value(value, range)
119
117
clipped = cls.clip_value(scaled)
118
Data.check_clip(scaled, clipped)
122
def check_clip(scaled, clipped):
120
123
if clipped != scaled:
121
124
warnings.warn('One or more of of your data points has been '
122
125
'clipped because it is out of range.')
126
128
class SimpleData(Data):
288
291
LINEAR_STRIPES = 'ls'
290
293
def __init__(self, width, height, title=None, legend=None, colours=None,
291
auto_scale=True, x_range=None, y_range=None):
294
auto_scale=True, x_range=None, y_range=None,
295
colours_within_series=None):
292
296
if type(self) == Chart:
293
297
raise AbstractClassException('This is an abstract class')
294
298
assert(isinstance(width, int))
341
349
url_bits.append('chtt=%s' % self.title)
343
351
url_bits.append('chdl=%s' % '|'.join(self.legend))
352
if self.legend_position:
353
url_bits.append('chdlp=%s' % (self.legend_position))
345
url_bits.append('chco=%s' % ','.join(self.colours))
355
url_bits.append('chco=%s' % ','.join(self.colours))
356
if self.colours_within_series:
357
url_bits.append('chco=%s' % '|'.join(self.colours_within_series))
346
358
ret = self.fill_to_url()
348
360
url_bits.append(ret)
349
361
ret = self.axis_to_url()
364
if self.trendline_data:
365
if not self.trendline_style: self.set_trendline_style()
366
url_bits.append('ewtr=0,%s,%.1f' % (self.trendline_colour, self.trendline_thickness))
367
url_bits.append(self.trendline_data_to_url(data_class=data_class))
353
url_bits.append(self.markers_to_url())
369
url_bits.append(self.markers_to_url())
354
370
if self.line_styles:
356
372
for index in xrange(max(self.line_styles) + 1):
395
411
self.legend = None
413
def set_legend_position(self, legend_position):
415
self.legend_position = urllib.quote(legend_position)
417
self.legend_position = None
398
420
# -------------------------------------------------------------------------
407
429
_check_colour(col)
408
430
self.colours = colours
432
def set_colours_within_series(self, colours):
433
# colours needs to be a list, tuple or None
434
assert(isinstance(colours, list) or isinstance(colours, tuple) or
436
# make sure the colours are in the right format
440
self.colours_within_series = colours
410
442
# Background/Chart colours
411
443
# -------------------------------------------------------------------------
626
658
# Markers, Ranges and Fill area (chm)
627
659
# -------------------------------------------------------------------------
629
def markers_to_url(self):
661
def markers_to_url(self):
630
662
return 'chm=%s' % '|'.join([','.join(a) for a in self.markers])
632
664
def add_marker(self, index, point, marker_type, colour, size, priority=0):
634
666
str(size), str(priority)))
636
668
def add_horizontal_range(self, colour, start, stop):
637
self.markers.append(('r', colour, '1', str(start), str(stop)))
669
self.markers.append(('r', colour, '0', str(start), str(stop)))
671
def add_data_line(self, colour, data_set, size, priority=0):
672
self.markers.append(('D', colour, str(data_set), '0', str(size), str(priority)))
674
def add_marker_text(self, string, colour, data_set, data_point, size, priority=0):
675
self.markers.append((str(string), colour, str(data_set), str(data_point), str(size), str(priority)))
639
677
def add_vertical_range(self, colour, start, stop):
640
self.markers.append(('R', colour, '1', str(start), str(stop)))
678
self.markers.append(('R', colour, '0', str(start), str(stop)))
642
680
def add_fill_range(self, colour, index_start, index_end):
643
681
self.markers.append(('b', colour, str(index_start), str(index_end), \