def __init__(self, graph): """Create the svg helper with the chart instance""" self.graph = graph if not graph.no_prefix: self.id = '#chart-%s ' % graph.uuid else: self.id = '' self.processing_instructions = [] if etree.lxml: attrs = {'nsmap': {None: self.ns, 'xlink': self.xlink_ns}} else: attrs = {'xmlns': self.ns} if hasattr(etree, 'register_namespace'): etree.register_namespace('xlink', self.xlink_ns) else: etree._namespace_map[self.xlink_ns] = 'xlink' self.root = etree.Element('svg', **attrs) self.root.attrib['id'] = self.id.lstrip('#').rstrip() self.root.attrib['class'] = 'pygal-chart' self.root.append( etree.Comment( u('Generated with pygal %s (%s) ©Kozea 2011-2015 on %s' % (__version__, 'lxml' if etree.lxml else 'etree', date.today().isoformat())))) self.root.append(etree.Comment(u('http://pygal.org'))) self.root.append(etree.Comment(u('http://github.com/Kozea/pygal'))) self.defs = self.node(tag='defs') self.title = self.node(tag='title') self.title.text = graph.title or 'Pygal' for def_ in self.graph.defs: self.defs.append(etree.fromstring(def_))
def _plot(self): map = etree.fromstring(MAP) map.set('width', str(self.view.width)) map.set('height', str(self.view.height)) for i, serie in enumerate(self.series): safe_vals = list(filter( lambda x: x is not None, cut(serie.values, 1))) if not safe_vals: continue min_ = min(safe_vals) max_ = max(safe_vals) for j, (country_code, value) in enumerate(serie.values): if value is None: continue if max_ == min_: ratio = 1 else: ratio = .3 + .7 * (value - min_) / (max_ - min_) try: country = map.find('.//*[@id="%s"]' % country_code) except SyntaxError: # Python 2.6 (you'd better install lxml) country = None for e in map: if e.attrib.get('id', '') == country_code: country = e if country is None: continue cls = country.get('class', '').split(' ') cls.append('color-%d' % i) country.set('class', ' '.join(cls)) country.set( 'style', 'fill-opacity: %f' % ( ratio)) metadata = serie.metadata.get(j) if metadata: node = decorate(self.svg, country, metadata) if node != country: country.remove(node) index = list(map).index(country) map.remove(country) node.append(country) map.insert(index, node) last_node = len(country) > 0 and country[-1] if last_node is not None and last_node.tag == 'title': title_node = last_node text = title_node.text + '\n' else: title_node = self.svg.node(country, 'title') text = '' title_node.text = text + '[%s] %s: %s' % ( serie.title, self.country_names[country_code], self._format(value)) self.nodes['plot'].append(map)
def _plot(self): map = etree.fromstring(MAP) map.set('width', str(self.view.width)) map.set('height', str(self.view.height)) for i, serie in enumerate(self.series): safe_vals = list( filter(lambda x: x is not None, cut(serie.values, 1))) if not safe_vals: continue min_ = min(safe_vals) max_ = max(safe_vals) for j, (country_code, value) in enumerate(serie.values): if value is None: continue if max_ == min_: ratio = 1 else: ratio = .3 + .7 * (value - min_) / (max_ - min_) try: country = map.find('.//*[@id="%s"]' % country_code) except SyntaxError: # Python 2.6 (you'd better install lxml) country = None for e in map: if e.attrib.get('id', '') == country_code: country = e if country is None: continue cls = country.get('class', '').split(' ') cls.append('color-%d' % i) country.set('class', ' '.join(cls)) country.set('style', 'fill-opacity: %f' % (ratio)) metadata = serie.metadata.get(j) if metadata: node = decorate(self.svg, country, metadata) if node != country: country.remove(node) index = list(map).index(country) map.remove(country) node.append(country) map.insert(index, node) last_node = len(country) > 0 and country[-1] if last_node is not None and last_node.tag == 'title': title_node = last_node text = title_node.text + '\n' else: title_node = self.svg.node(country, 'title') text = '' title_node.text = text + '[%s] %s: %s' % ( serie.title, self.country_names[country_code], self._format(value)) self.nodes['plot'].append(map)
def __init__(self, graph): """Create the svg helper with the chart instance""" self.graph = graph if not graph.no_prefix: self.id = '#chart-%s ' % graph.uuid else: self.id = '' self.processing_instructions = [ etree.ProcessingInstruction( u('xml'), u("version='1.0' encoding='utf-8'"))] if etree.lxml: attrs = { 'nsmap': { None: self.ns, 'xlink': self.xlink_ns } } else: attrs = { 'xmlns': self.ns } if hasattr(etree, 'register_namespace'): etree.register_namespace('xlink', self.xlink_ns) else: etree._namespace_map[self.xlink_ns] = 'xlink' self.root = etree.Element('svg', **attrs) self.root.attrib['id'] = self.id.lstrip('#').rstrip() self.root.attrib['class'] = 'pygal-chart' self.root.append( etree.Comment(u( 'Generated with pygal %s (%s) ©Kozea 2011-2015 on %s' % ( __version__, 'lxml' if etree.lxml else 'etree', date.today().isoformat())))) self.root.append(etree.Comment(u('http://pygal.org'))) self.root.append(etree.Comment(u('http://github.com/Kozea/pygal'))) self.defs = self.node(tag='defs') self.title = self.node(tag='title') self.title.text = graph.title or 'Pygal' for def_ in self.graph.defs: self.defs.append(etree.fromstring(def_))
def __init__(self, graph): """Create the svg helper with the chart instance""" self.graph = graph if not graph.no_prefix: self.id = "#chart-%s " % graph.uuid else: self.id = "" self.processing_instructions = [] if etree.lxml: attrs = {"nsmap": {None: self.ns, "xlink": self.xlink_ns}} else: attrs = {"xmlns": self.ns} if hasattr(etree, "register_namespace"): etree.register_namespace("xlink", self.xlink_ns) else: etree._namespace_map[self.xlink_ns] = "xlink" self.root = etree.Element("svg", **attrs) self.root.attrib["id"] = self.id.lstrip("#").rstrip() if graph.classes: self.root.attrib["class"] = " ".join(graph.classes) self.root.append( etree.Comment( u( "Generated with pygal %s (%s) ©Kozea 2012-2016 on %s" % (__version__, "lxml" if etree.lxml else "etree", date.today().isoformat()) ) ) ) self.root.append(etree.Comment(u("http://pygal.org"))) self.root.append(etree.Comment(u("http://github.com/Kozea/pygal"))) self.defs = self.node(tag="defs") self.title = self.node(tag="title") self.title.text = graph.title or "Pygal" for def_ in self.graph.defs: self.defs.append(etree.fromstring(def_))
def _plot(self): map = etree.fromstring(self.svg_map) map.set('width', str(self.view.width)) map.set('height', str(self.view.height)) for i, serie in enumerate(self.series): safe_vals = list(filter( lambda x: x is not None, cut(serie.values, 1))) if not safe_vals: continue min_ = min(safe_vals) max_ = max(safe_vals) for j, (area_code, value) in enumerate(serie.values): if isinstance(area_code, Number): area_code = '%2d' % area_code if value is None: continue if max_ == min_: ratio = 1 else: ratio = .3 + .7 * (value - min_) / (max_ - min_) try: areae = map.findall( ".//*[@class='%s%s %s map-element']" % ( self.area_prefix, area_code, self.kind)) except SyntaxError: # Python 2.6 (you'd better install lxml) areae = [] for g in map: for e in g: if '%s%s' % ( self.area_prefix, area_code ) in e.attrib.get('class', ''): areae.append(e) if not areae: continue for area in areae: cls = area.get('class', '').split(' ') cls.append('color-%d' % i) area.set('class', ' '.join(cls)) area.set('style', 'fill-opacity: %f' % (ratio)) metadata = serie.metadata.get(j) if metadata: node = decorate(self.svg, area, metadata) if node != area: area.remove(node) for g in map: if area not in g: continue index = list(g).index(area) g.remove(area) node.append(area) g.insert(index, node) last_node = len(area) > 0 and area[-1] if last_node is not None and last_node.tag == 'title': title_node = last_node text = title_node.text + '\n' else: title_node = self.svg.node(area, 'title') text = '' title_node.text = text + '[%s] %s: %s' % ( serie.title, self.area_names[area_code], self._format(value)) self.nodes['plot'].append(map)
def _plot(self): map = etree.fromstring(self.svg_map) map.set('width', str(self.view.width)) map.set('height', str(self.view.height)) for i, serie in enumerate(self.series): safe_vals = list( filter(lambda x: x is not None, cut(serie.values, 1))) if not safe_vals: continue min_ = min(safe_vals) max_ = max(safe_vals) for j, (area_code, value) in enumerate(serie.values): if isinstance(area_code, Number): area_code = '%2d' % area_code if value is None: continue if max_ == min_: ratio = 1 else: ratio = .3 + .7 * (value - min_) / (max_ - min_) try: areae = map.findall( ".//*[@class='%s%s %s map-element']" % (self.area_prefix, area_code, self.kind)) except SyntaxError: # Python 2.6 (you'd better install lxml) areae = [] for g in map: for e in g: if '%s%s' % (self.area_prefix, area_code) in e.attrib.get( 'class', ''): areae.append(e) if not areae: continue for area in areae: cls = area.get('class', '').split(' ') cls.append('color-%d' % i) area.set('class', ' '.join(cls)) area.set('style', 'fill-opacity: %f' % (ratio)) metadata = serie.metadata.get(j) if metadata: node = decorate(self.svg, area, metadata) if node != area: area.remove(node) for g in map: if area not in g: continue index = list(g).index(area) g.remove(area) node.append(area) g.insert(index, node) last_node = len(area) > 0 and area[-1] if last_node is not None and last_node.tag == 'title': title_node = last_node text = title_node.text + '\n' else: title_node = self.svg.node(area, 'title') text = '' title_node.text = text + '[%s] %s: %s' % ( serie.title, self.area_names[area_code], self._format(value)) self.nodes['plot'].append(map)
def _plot(self): """Insert a map in the chart and apply data on it""" map = etree.fromstring(self.svg_map) map.set('width', str(self.view.width)) map.set('height', str(self.view.height)) for i, serie in enumerate(self.series): safe_vals = list( filter(lambda x: x is not None, cut(serie.values, 1))) if not safe_vals: continue min_ = min(safe_vals) max_ = max(safe_vals) for j, (area_code, value) in self.enumerate_values(serie): area_code = self.adapt_code(area_code) if value is None: continue if max_ == min_: ratio = 1 else: ratio = .3 + .7 * (value - min_) / (max_ - min_) try: areae = map.findall( ".//*[@class='%s%s %s map-element']" % (self.area_prefix, area_code, self.kind)) except SyntaxError: # Python 2.6 (you'd better install lxml) raise ImportError('lxml is required under python 2.6') if not areae: continue for area in areae: cls = area.get('class', '').split(' ') cls.append('color-%d' % i) cls.append('serie-%d' % i) cls.append('series') area.set('class', ' '.join(cls)) area.set('style', 'fill-opacity: %f' % ratio) metadata = serie.metadata.get(j) if metadata: node = decorate(self.svg, area, metadata) if node != area: area.remove(node) for g in map: if area not in g: continue index = list(g).index(area) g.remove(area) node.append(area) g.insert(index, node) for node in area: cls = node.get('class', '').split(' ') cls.append('reactive') cls.append('tooltip-trigger') cls.append('map-area') node.set('class', ' '.join(cls)) alter(node, metadata) val = self._format(serie, j) self._tooltip_data(area, val, 0, 0, 'auto') self.nodes['plot'].append(map)
def _plot(self): """Insert a map in the chart and apply data on it""" map = etree.fromstring(self.svg_map) map.set('width', str(self.view.width)) map.set('height', str(self.view.height)) for i, serie in enumerate(self.series): safe_vals = list(filter( lambda x: x is not None, cut(serie.values, 1))) if not safe_vals: continue min_ = min(safe_vals) max_ = max(safe_vals) for j, (area_code, value) in self.enumerate_values(serie): area_code = self.adapt_code(area_code) if value is None: continue if max_ == min_: ratio = 1 else: ratio = .3 + .7 * (value - min_) / (max_ - min_) try: areae = map.findall( ".//*[@class='%s%s %s map-element']" % ( self.area_prefix, area_code, self.kind)) except SyntaxError: # Python 2.6 (you'd better install lxml) raise ImportError('lxml is required under python 2.6') if not areae: continue for area in areae: cls = area.get('class', '').split(' ') cls.append('color-%d' % i) cls.append('serie-%d' % i) cls.append('series') area.set('class', ' '.join(cls)) area.set('style', 'fill-opacity: %f' % ratio) metadata = serie.metadata.get(j) if metadata: node = decorate(self.svg, area, metadata) if node != area: area.remove(node) for g in map: if area not in g: continue index = list(g).index(area) g.remove(area) node.append(area) g.insert(index, node) for node in area: cls = node.get('class', '').split(' ') cls.append('reactive') cls.append('tooltip-trigger') cls.append('map-area') node.set('class', ' '.join(cls)) alter(node, metadata) value = self._get_value((area_code, value)) self._tooltip_data(area, value, 0, 0, 'auto') self.nodes['plot'].append(map)