- Timestamp:
- 03/17/09 05:27:31 (3 years ago)
- Location:
- trunk
- Files:
-
- 17 modified
-
examples/barchart.py (modified) (1 diff)
-
examples/hbarchart.png (modified) (previous)
-
examples/linechart.png (modified) (previous)
-
examples/linechart.py (modified) (1 diff)
-
examples/piechart.png (modified) (previous)
-
examples/scatterchart.png (modified) (previous)
-
examples/scatterchart.py (modified) (1 diff)
-
examples/stackedbarchart.py (modified) (1 diff)
-
examples/vbarchart.png (modified) (previous)
-
pycha/bar.py (modified) (1 diff)
-
pycha/chart.py (modified) (5 diffs)
-
pycha/color.py (modified) (3 diffs)
-
pycha/line.py (modified) (2 diffs)
-
pycha/pie.py (modified) (1 diff)
-
pycha/scatter.py (modified) (1 diff)
-
tests/chart.py (modified) (1 diff)
-
tests/color.py (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/examples/barchart.py
r136 r169 49 49 'lineColor': '#444444' 50 50 }, 51 'colorScheme': 'red', 51 'colorScheme': { 52 'name': 'gradient', 53 'args': { 54 'initialColor': 'red', 55 }, 56 }, 52 57 'legend': { 53 58 'hide': True, -
trunk/examples/linechart.py
r136 r169 44 44 'lineColor': '#444444' 45 45 }, 46 'colorScheme': 'blue', 46 'colorScheme': { 47 'name': 'gradient', 48 'args': { 49 'initialColor': 'blue', 50 }, 51 }, 47 52 'legend': { 48 53 'hide': True, -
trunk/examples/scatterchart.py
r136 r169 36 36 'lineColor': '#444444' 37 37 }, 38 'colorScheme': 'blue', 38 'colorScheme': { 39 'name': 'gradient', 40 'args': { 41 'initialColor': 'blue', 42 }, 43 }, 39 44 'legend': { 40 45 'hide': True, -
trunk/examples/stackedbarchart.py
r165 r169 37 37 'lineColor': '#444444', 38 38 }, 39 'colorScheme': 'red', 39 'colorScheme': { 40 'name': 'gradient', 41 'args': { 42 'initialColor': 'red', 43 }, 44 }, 40 45 'legend': { 41 46 'hide': True, -
trunk/pycha/bar.py
r149 r169 86 86 87 87 if self.options.shouldFill: 88 cx.set_source_rgb(*self. options.colorScheme[bar.name])88 cx.set_source_rgb(*self.colorScheme[bar.name]) 89 89 cx.fill_preserve() 90 90 -
trunk/pycha/chart.py
r149 r169 21 21 import cairo 22 22 23 from pycha.color import (defaultColorscheme, getColorscheme, hex2rgb, 24 DEFAULT_COLOR) 23 from pycha.color import ColorScheme, hex2rgb, DEFAULT_COLOR 25 24 26 25 … … 57 56 self._initSurface(surface) 58 57 58 self.colorScheme = None 59 59 60 def addDataset(self, dataset): 60 61 """Adds an object containing chart data to the storage hash""" … … 113 114 114 115 def _setColorscheme(self): 115 """Sets the colorScheme used for the chart using the color in the116 """Sets the colorScheme used for the chart using the 116 117 options.colorScheme option 117 118 """ 118 scheme = self.options.colorScheme119 name = self.options.colorScheme.name 119 120 keys = self._getDatasetsKeys() 120 if isinstance(scheme, dict): 121 if not scheme: 122 self.options.colorScheme = defaultColorscheme(keys) 123 elif isinstance(scheme, basestring): 124 self.options.colorScheme = getColorscheme(scheme, keys) 125 else: 126 raise TypeError("Color scheme is invalid!") 121 colorSchemeClass = ColorScheme.getColorScheme(name, None) 122 if colorSchemeClass is None: 123 raise ValueError('Color scheme is invalid!') 124 125 kwargs = dict(self.options.colorScheme.args) 126 self.colorScheme = colorSchemeClass(keys, **kwargs) 127 127 128 128 def _initSurface(self, surface): … … 552 552 def drawKey(key, x, y, text_height): 553 553 cx.rectangle(x, y, bullet, bullet) 554 cx.set_source_rgb(*self. options.colorScheme[key])554 cx.set_source_rgb(*self.colorScheme[key]) 555 555 cx.fill_preserve() 556 556 cx.set_source_rgb(0, 0, 0) … … 670 670 barWidthFillFraction=0.75, 671 671 pieRadius=0.4, 672 colorScheme=DEFAULT_COLOR, 672 colorScheme=Option( 673 name='gradient', 674 args=Option(initialColor=DEFAULT_COLOR), 675 ), 673 676 title=None, 674 677 titleFont='Tahoma', -
trunk/pycha/color.py
r140 r169 1 1 # Copyright(c) 2007-2009 by Lorenzo Gil Sanchez <lorenzo.gil.sanchez@gmail.com> 2 # 2009 by Yaco S.L. <lgs@yaco.es> 2 3 # 3 4 # This file is part of PyCha. … … 53 54 54 55 55 def generateColorscheme(masterColor, keys): 56 """Generates a dictionary where the keys match the keys argument and 57 the values are colors derivated from the masterColor. 58 59 Each color is a lighter version of masterColor. This difference is 60 computed based on the number of keys. 61 62 The masterColor is given in a hex string format. 63 """ 64 r, g, b = hex2rgb(masterColor) 65 light = 1.0 / (len(keys)*2) 66 return dict([(key, lighten(r, g, b, light * i)) 67 for i, key in enumerate(keys)]) 68 69 70 def defaultColorscheme(keys): 71 """Return the default color scheme (derived from a dark green)""" 72 return generateColorscheme(DEFAULT_COLOR, keys) 73 74 75 def getColorscheme(color, keys): 76 """Get a color scheme from the six predefined ones or makes another 77 one if the color is not found 78 """ 79 return generateColorscheme(colorSchemes.get(color, color), keys) 80 81 82 # default colors for color schemes 83 colorSchemes = dict( 56 basicColors = dict( 84 57 red='#6d1d1d', 85 58 green=DEFAULT_COLOR, … … 89 62 darkcyan='#305755', 90 63 ) 64 65 66 class ColorSchemeMetaclass(type): 67 """This metaclass is used to autoregister all ColorScheme classes""" 68 69 def __new__(mcs, name, bases, dict): 70 klass = type.__new__(mcs, name, bases, dict) 71 klass.registerColorScheme() 72 return klass 73 74 75 class ColorScheme(dict): 76 """A color scheme is a dictionary where the keys match the keys 77 constructor argument and the values are colors""" 78 79 __metaclass__ = ColorSchemeMetaclass 80 __registry__ = {} 81 82 def __init__(self, keys): 83 super(ColorScheme, self).__init__() 84 85 @classmethod 86 def registerColorScheme(cls): 87 key = cls.__name__.replace('ColorScheme', '').lower() 88 if key: 89 cls.__registry__[key] = cls 90 91 @classmethod 92 def getColorScheme(cls, name, default=None): 93 return cls.__registry__.get(name, default) 94 95 96 class GradientColorScheme(ColorScheme): 97 """In this color scheme each color is a lighter version of initialColor. 98 99 This difference is computed based on the number of keys. 100 101 The initialColor is given in a hex string format. 102 """ 103 104 def __init__(self, keys, initialColor=DEFAULT_COLOR): 105 super(GradientColorScheme, self).__init__(keys) 106 if initialColor in basicColors: 107 initialColor = basicColors[initialColor] 108 109 r, g, b = hex2rgb(initialColor) 110 light = 1.0 / (len(keys) * 2) 111 112 for i, key in enumerate(keys): 113 self[key] = lighten(r, g, b, light * i) -
trunk/pycha/line.py
r140 r169 74 74 cx.close_path() 75 75 else: 76 cx.set_source_rgb(*self. options.colorScheme[storeName])76 cx.set_source_rgb(*self.colorScheme[storeName]) 77 77 cx.stroke() 78 78 … … 93 93 94 94 # fill the line 95 cx.set_source_rgb(*self. options.colorScheme[storeName])95 cx.set_source_rgb(*self.colorScheme[storeName]) 96 96 preparePath(storeName) 97 97 cx.fill() -
trunk/pycha/pie.py
r140 r169 112 112 for slice in self.slices: 113 113 if slice.isBigEnough(): 114 cx.set_source_rgb(*self. options.colorScheme[slice.name])114 cx.set_source_rgb(*self.colorScheme[slice.name]) 115 115 if self.options.shouldFill: 116 116 slice.draw(cx, self.centerx, self.centery, self.radius) -
trunk/pycha/scatter.py
r140 r169 44 44 # TODO: self.options.stroke.shadow 45 45 for key in self._getDatasetsKeys(): 46 cx.set_source_rgb(*self. options.colorScheme[key])46 cx.set_source_rgb(*self.colorScheme[key]) 47 47 preparePath(key) 48 48 cx.stroke() -
trunk/tests/chart.py
r143 r169 133 133 134 134 def test_colorscheme(self): 135 ch = pycha.chart.Chart(None, {'colorScheme': '#000000'}) 135 options = {'colorScheme': {'name': 'gradient', 136 'args': {'initialColor': '#000000'}}} 137 ch = pycha.chart.Chart(None, options) 136 138 dataset = (('dataset1', ([0, 1], [1, 1])), ) 137 139 ch.addDataset(dataset) 138 140 ch._setColorscheme() 139 self.assert_(isinstance(ch.options.colorScheme, dict)) 140 self.assertEqual(ch.options.colorScheme, {'dataset1': (0.0, 0.0, 0.0)}) 141 142 ch = pycha.chart.Chart(None, {'colorScheme': {}}) 143 ch.addDataset(dataset) 144 ch._setColorscheme() 145 self.assert_(isinstance(ch.options.colorScheme, dict)) 146 self.assertEqual(ch.options.colorScheme.keys(), ['dataset1']) 147 148 ch = pycha.chart.Chart(None, {'colorScheme': (0.0, 0.0, 0.0)}) 149 self.assertRaises(TypeError, ch._setColorscheme) 141 self.assert_(isinstance(ch.colorScheme, dict)) 142 self.assertEqual(ch.colorScheme, {'dataset1': (0.0, 0.0, 0.0)}) 143 144 options = {'colorScheme': {'name': 'foo'}} 145 ch = pycha.chart.Chart(None, options) 146 ch.addDataset(dataset) 147 self.assertRaises(ValueError, ch._setColorscheme) 150 148 151 149 def test_updateXY(self): -
trunk/tests/color.py
r112 r169 1 # Copyright (c) 2007-2008 by Lorenzo Gil Sanchez <lorenzo.gil.sanchez@gmail.com> 1 # Copyright(c) 2007-2008 by Lorenzo Gil Sanchez <lorenzo.gil.sanchez@gmail.com> 2 # 2009 by Yaco S.L. <lgs@yaco.es> 2 3 # 3 4 # This file is part of PyCha. … … 19 20 20 21 import pycha.color 22 23 24 class SimpleColorScheme(pycha.color.ColorScheme): 25 pass 26 21 27 22 28 class ColorTests(unittest.TestCase): … … 63 69 self.assertAlmostEqual(c1[i], c2[i], precission) 64 70 65 def test_generateColorscheme(self): 66 keys = ('k1', 'k2', 'k3', 'k4') 67 color = '#ff0000' 68 scheme = pycha.color.generateColorscheme(color, keys) 69 70 self._assertColors(scheme['k1'], (1, 0, 0), 3) 71 self._assertColors(scheme['k2'], (1, 0.125, 0.125), 3) 72 self._assertColors(scheme['k3'], (1, 0.250, 0.250), 3) 73 self._assertColors(scheme['k4'], (1, 0.375, 0.375), 3) 74 75 def test_defaultColorScheme(self): 76 keys = ('k1', 'k2', 'k3', 'k4') 77 scheme1 = pycha.color.defaultColorscheme(keys) 78 color = pycha.color.DEFAULT_COLOR 79 scheme2 = pycha.color.generateColorscheme(color, keys) 80 self.assertEqual(scheme1, scheme2) 81 82 def test_colorScheme(self): 71 def test_basicColors(self): 83 72 colors = ('red', 'green', 'blue', 'grey', 'black', 'darkcyan') 84 73 for color in colors: 85 self.assert_(pycha.color.colorSchemes.has_key(color)) 74 self.assert_(color in pycha.color.basicColors) 75 76 def test_ColorSchemeRegistry(self): 77 self.assertEquals(SimpleColorScheme, 78 pycha.color.ColorScheme.getColorScheme('simple')) 79 self.assertEquals(None, 80 pycha.color.ColorScheme.getColorScheme('foo')) 81 82 def test_GradientColorScheme(self): 83 keys = range(5) 84 scheme = pycha.color.GradientColorScheme(keys, "000000") 85 self._assertColors(scheme[0], (0.0, 0.0, 0.0), 3) 86 self._assertColors(scheme[1], (0.1, 0.1, 0.1), 3) 87 self._assertColors(scheme[2], (0.2, 0.2, 0.2), 3) 88 self._assertColors(scheme[3], (0.3, 0.3, 0.3), 3) 89 self._assertColors(scheme[4], (0.4, 0.4, 0.4), 3) 86 90 87 91 def test_autoLighting(self): … … 94 98 keys = range(n) 95 99 color = '#ff0000' 96 scheme = pycha.color. generateColorscheme(color, keys)100 scheme = pycha.color.GradientColorScheme(keys, color) 97 101 98 102 # ensure that the last color is not completely white 99 103 color = scheme[n-1] 100 self.assertAlmostEqual(color[0], 1.0, 4) # the red component was already 1 104 105 # the red component was already 1 106 self.assertAlmostEqual(color[0], 1.0, 4) 101 107 self.assertNotAlmostEqual(color[1], 1.0, 4) 102 108 self.assertNotAlmostEqual(color[2], 1.0, 4) 109 103 110 104 111 def test_suite(): … … 107 114 )) 108 115 116 109 117 if __name__ == '__main__': 110 118 unittest.main(defaultTest='test_suite')
