08 Apr 2017

  • Removed support for compress flag on Graphs. Simply invoke zlib.compress on the data if needed.
  • Graph.burn now returns the rendered SVG as a Unicode string without XML declaration and without pretty-printing. To customize the XML rendering, override or replace the Graph.render static method.


04 Jan 2017

  • #17: Fix issue in subclassed Line charts.


23 Dec 2016

  • Minor tweak to README for better rendering in PyPI.


23 Dec 2016

  • Update docs link.


04 Nov 2016

  • #16: Restore support for passing iterable data elements.


15 Aug 2016

Issue #14:

  • svg.charts.plot.Plot (and hence its subclass svg.charts.time_series.Plot) now accept data as a sequence of pairs. Example:

    import svg.charts.plot
    g = svg.charts.plot.Plot()
                    data=[(1, 1), (2, 4), (3, 9)]))
  • data point labels that are drawn when show_data_values = True can have their label changed from the default (which is the y-value) by giving a data item a .text attribute. It is convenient to used namedtuple() for this:

    import svg.charts.plot
    from collections import namedtuple
    Datum = nametuple("Datum", 'x y text')
    g = svg.charts.plot.Plot()
                    data=[Datum(1, 1, 'first'),
                          Datum(2, 4, 'second'),
                          Datum(3, 9, 'third')]))

    (in fact data items can have any extra attribute; only .text is used currently)


30 Jul 2016

  • #13: Fix issues in lazy-evaluated iterators.


22 Mar 2016

  • #12: The library now provides an svg.charts.graph.DrawHooks mix-in for customizing the draw behavior.
  • Cleaned up documentation.


22 Mar 2016

  • #8: Subtitle is now rendering the subtitle and not the title again.

  • #9: Bar objects now expose a _fill_class method for overriding the default CSS fill class. It’s now possible to create a custom subclass that generates the fill based on the field index as well. For example:

    class VerticalBar(svg.charts.bar.VerticalBar):
        key = False
        def _fill_class(self, dataset_index, field_index):
            fill_index = 1 + dataset_index + field_index*len(self.data)
            return 'fill%s' % fill_index


25 Apr 2015

  • Adding a couple small dependencies eliminated a lot of duplicated code in the util module.
  • Corrected error when stacked was used in Line charts.


23 Apr 2015

  • Dropped support for Python 2.6.
  • Requires setuptools for installation.
  • Filter out comments when parsing CSS.
  • Corrected errors in Graph.render_inline_styles.


21 Jan 2014

  • #4: Added hook in Graph to allow overriding of the attributes on the root SVG element. One can now override or monkeypatch Graph._get_root_attributes to alter the rendering of the root attributes such as width and height. For example, to omit width and height:

    class MyPlot(plot.Plot):
        def _get_root_attributes(self):
            attrs = super(MyPlot, self)._get_root_attributes()
            del attrs['width']
            del attrs['height']
            return attrs


21 Jan 2014

  • #1: Fixed javascript ID names in TimeSeries labels.


21 Jan 2014

  • #5: Fixed references to class attributes in graph.py.


10 Nov 2013


23 Sep 2013

  • Project now builds and tests pass on Python 3 without 2to3.


12 Oct 2011

  • Corrected buggy logic in y-axis label rendering (thanks to Emmanuel Blot).
  • Converted to Unix line endings.


31 Jul 2011

  • Updated to latest cssutils with Python 3 support. Thanks Christof!
  • Fixed a few remaining issues with Python 3 compatibility.


02 Apr 2011

  • Fixed bug in rendering of Pie Chart styles.
  • Improved testing framework. Now samples are at least generated as part of the test suite.
  • Fixed bug in javascript when label ids had spaces. See #3139197.
  • Fixed build issue where package data wasn’t included due to 2to3 technique. Now using distribute technique and installation on Python 3 requires distribute.


27 Mar 2011

  • Fixed bug where x axis labels would not be rendered properly if the largest value was the same as the largest visible x value on the chart.


  • Altered the way CSS files are loaded, so they can be more easily customized by subclasses (and less dependent on the class names).


  • A small attempt to improve the documentation - added links to examples that already exist.


  • Fix IndexError in svg.charts.plot.Plot.field_size when there are only two values returned by float_range (in the case there are only two different ‘y’ values in the data) and scale_y_integers == True. Credit to Jean Schurger for the patch.
  • Fixed problem in setup.py installing on Unix OS (case sensitivity of readme.txt). Credit to Luke Miller and Jean Schurger for supplying a patch for this issue.


  • Updated cssutils dependency to 0.9.6 (currently in beta) to require the CSS profiles support.
  • Completed an SVG CSS profile according to the SVG 1.1 spec.


  • Added preliminary SVG CSS profile, suitable for stock CSS properties.


  • First major divergence from the Ruby reference implementation
  • Now implemented as a namespace package (svg.charts instead of svg_charts)
  • Changed XML processor to lxml
  • Enabled extensible css support using cssutils, greatly reducing static CSS
  • Renamed modules and methods to be more consistent with PEP-8 naming convention

Upgrading from 1.x to 2.0

I suggest removing SVG 1.0 from the python installation. This involves removing the SVG directory (or svg_chart*) from site-packages.

Change import statements to import from the new namespace, so:

from SVG import Bar


from svg.charts import bar


  • Bug fixes


  • First public release