/+junk/pygooglechart-py3k

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/%2Bjunk/pygooglechart-py3k

« back to all changes in this revision

Viewing changes to pygooglechart.py

  • Committer: gak
  • Date: 2008-04-26 02:22:39 UTC
  • Revision ID: git-v1:6f68026c3d27fd960434d3b33dcaad14c5c48bcf
Autoscale fixes and refactoring by Grahm Ullrich

Show diffs side-by-side

added added

removed removed

Lines of Context:
79
79
        assert(type(self) != Data)  # This is an abstract class
80
80
        self.data = data
81
81
 
 
82
    @classmethod
 
83
    def float_scale_value(cls, value, range):
 
84
        lower, upper = range
 
85
        max_value = cls.max_value()
 
86
        scaled = (value-lower) * (float(max_value)/(upper-lower))
 
87
        return scaled
 
88
 
 
89
    @classmethod
 
90
    def clip_value(cls, value):
 
91
        clipped = max(0, min(value, cls.max_value()))
 
92
        return clipped
 
93
 
 
94
    @classmethod
 
95
    def int_scale_value(cls, value, range):
 
96
        scaled = int(round(cls.float_scale_value(value, range)))
 
97
        return scaled
 
98
 
 
99
    @classmethod
 
100
    def scale_value(cls, value, range):
 
101
        scaled = cls.int_scale_value(value, range)
 
102
        clipped = cls.clip_value(scaled)
 
103
        return clipped
82
104
 
83
105
class SimpleData(Data):
84
106
    enc_map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
103
125
    def max_value():
104
126
        return 61
105
127
 
106
 
    @classmethod
107
 
    def scale_value(cls, value, range):
108
 
        lower, upper = range
109
 
        max_value = cls.max_value()
110
 
        scaled = int(round((float(value) - lower) * max_value / upper))
111
 
        clipped = max(0, min(scaled, max_value))
112
 
        return clipped
113
 
 
114
128
class TextData(Data):
115
129
 
116
130
    def __repr__(self):
143
157
        else:
144
158
            return lower
145
159
 
 
160
    @classmethod
 
161
    def scale_value(cls, value, range):
 
162
        # use float values instead of integers because we don't need an encode
 
163
        # map index
 
164
        scaled = cls.float_scale_value(value,range)
 
165
        clipped = cls.clip_value(scaled)
 
166
        return clipped
146
167
 
147
168
class ExtendedData(Data):
148
169
    enc_map = \
173
194
    def max_value():
174
195
        return 4095
175
196
 
176
 
    @classmethod
177
 
    def scale_value(cls, value, range):
178
 
        lower, upper = range
179
 
        max_value = cls.max_value()
180
 
        scaled = int(round((float(value) - lower) * max_value / upper))
181
 
        clipped = max(0, min(scaled, max_value))
182
 
        return clipped
183
 
 
184
197
 
185
198
# Axis Classes
186
199
# -----------------------------------------------------------------------------
302
315
    # URL generation
303
316
    # -------------------------------------------------------------------------
304
317
 
305
 
    def get_url(self):
306
 
        url_bits = self.get_url_bits()
 
318
    def get_url(self, data_class=None):
 
319
        url_bits = self.get_url_bits(data_class=data_class)
307
320
        return self.BASE_URL + '&'.join(url_bits)
308
321
 
309
 
    def get_url_bits(self):
 
322
    def get_url_bits(self, data_class=None):
310
323
        url_bits = []
311
324
        # required arguments
312
325
        url_bits.append(self.type_to_url())
313
326
        url_bits.append('chs=%ix%i' % (self.width, self.height))
314
 
        url_bits.append(self.data_to_url())
 
327
        url_bits.append(self.data_to_url(data_class=data_class))
315
328
        # optional arguments
316
329
        if self.title:
317
330
            url_bits.append('chtt=%s' % self.title)
434
447
            # simple encoding. I've found that this isn't sufficient,
435
448
            # e.g. examples/line-xy-circle.png. Let's try 100px.
436
449
            return SimpleData
437
 
        elif self.height < 500:
438
 
            return TextData
439
450
        else:
440
451
            return ExtendedData
441
452
 
645
656
        self.grid = '%s,%s,%s,%s' % (x_step, y_step, line_segment, \
646
657
            blank_segment)
647
658
 
648
 
    def get_url_bits(self):
649
 
        url_bits = Chart.get_url_bits(self)
 
659
    def get_url_bits(self, data_class=None):
 
660
        url_bits = Chart.get_url_bits(self, data_class=data_class)
650
661
        if self.line_styles:
651
662
            style = []
652
663
            # for index, values in self.line_style.items():
700
711
    def set_bar_width(self, bar_width):
701
712
        self.bar_width = bar_width
702
713
 
703
 
    def get_url_bits(self):
704
 
        url_bits = Chart.get_url_bits(self)
 
714
    def get_url_bits(self, data_class=None):
 
715
        url_bits = Chart.get_url_bits(self, data_class=data_class)
705
716
        if self.bar_width is not None:
706
717
            url_bits.append('chbh=%i' % self.bar_width)
707
718
        return url_bits
742
753
        """Set spacing between groups of bars."""
743
754
        self.group_spacing = spacing
744
755
 
745
 
    def get_url_bits(self):
 
756
    def get_url_bits(self, data_class=None):
746
757
        # Skip 'BarChart.get_url_bits' and call Chart directly so the parent
747
758
        # doesn't add "chbh" before we do.
748
 
        url_bits = Chart.get_url_bits(self)
 
759
        url_bits = Chart.get_url_bits(self, data_class=data_class)
749
760
        if self.group_spacing is not None:
750
761
            if self.bar_spacing is None:
751
762
                raise InvalidParametersException('Bar spacing is required to ' \
795
806
    def set_pie_labels(self, labels):
796
807
        self.pie_labels = [urllib.quote(a) for a in labels]
797
808
 
798
 
    def get_url_bits(self):
799
 
        url_bits = Chart.get_url_bits(self)
 
809
    def get_url_bits(self, data_class=None):
 
810
        url_bits = Chart.get_url_bits(self, data_class=data_class)
800
811
        if self.pie_labels:
801
812
            url_bits.append('chl=%s' % '|'.join(self.pie_labels))
802
813
        return url_bits