Sophie

Sophie

distrib > Mandriva > 2010.2 > i586 > media > contrib-backports > by-pkgid > a44f8c7e78ee9c5838c1fb080c9e7630 > files > 1177

python-matplotlib-doc-1.1.1-1mdv2010.1.noarch.rpm

.. _misc-svg_filter_pie:

misc example code: svg_filter_pie.py
====================================

[`source code <svg_filter_pie.py>`_]

::

    """
    Demonstrate SVG filtering effects which might be used with mpl.
    The pie chart drawing code is borrowed from pie_demo.py
    
    Note that the filtering effects are only effective if your svg rederer
    support it.
    """
    
    
    import matplotlib
    matplotlib.use("Svg")
    
    import matplotlib.pyplot as plt
    from matplotlib.patches import Shadow
    
    # make a square figure and axes
    fig1 = plt.figure(1, figsize=(6,6))
    ax = fig1.add_axes([0.1, 0.1, 0.8, 0.8])
    
    labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
    fracs = [15,30,45, 10]
    
    explode=(0, 0.05, 0, 0)
    
    # We want to draw the shadow for each pie but we will not use "shadow"
    # option as it does'n save the references to the shadow patches.
    pies = ax.pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%')
    
    for w in pies[0]:
        # set the id with the label.
        w.set_gid(w.get_label())
    
        # we don't want to draw the edge of the pie
        w.set_ec("none")
    
    for w in pies[0]:
        # create shadow patch
        s = Shadow(w, -0.01, -0.01)
        s.set_gid(w.get_gid()+"_shadow")
        s.set_zorder(w.get_zorder() - 0.1)
        ax.add_patch(s)
    
    
    # save
    from StringIO import StringIO
    f = StringIO()
    plt.savefig(f, format="svg")
    
    import xml.etree.cElementTree as ET
    
    
    # filter definition for shadow using a gaussian blur
    # and lighteneing effect.
    # The lightnening filter is copied from http://www.w3.org/TR/SVG/filters.html
    
    # I tested it with Inkscape and Firefox3. "Gaussian blur" is supported
    # in both, but the lightnening effect only in the inkscape. Also note
    # that, inkscape's exporting also may not support it.
    
    filter_def = """
      <defs  xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
        <filter id='dropshadow' height='1.2' width='1.2'>
          <feGaussianBlur result='blur' stdDeviation='2'/>
        </filter>
    
        <filter id='MyFilter' filterUnits='objectBoundingBox' x='0' y='0' width='1' height='1'>
          <feGaussianBlur in='SourceAlpha' stdDeviation='4%' result='blur'/>
          <feOffset in='blur' dx='4%' dy='4%' result='offsetBlur'/>
          <feSpecularLighting in='blur' surfaceScale='5' specularConstant='.75'
               specularExponent='20' lighting-color='#bbbbbb' result='specOut'>
            <fePointLight x='-5000%' y='-10000%' z='20000%'/>
          </feSpecularLighting>
          <feComposite in='specOut' in2='SourceAlpha' operator='in' result='specOut'/>
          <feComposite in='SourceGraphic' in2='specOut' operator='arithmetic'
        k1='0' k2='1' k3='1' k4='0'/>
        </filter>
      </defs>
    """
    
    
    tree, xmlid = ET.XMLID(f.getvalue())
    
    # insert the filter definition in the svg dom tree.
    tree.insert(0, ET.XML(filter_def))
    
    for i, pie_name in enumerate(labels):
        pie = xmlid[pie_name]
        pie.set("filter", 'url(#MyFilter)')
    
        shadow = xmlid[pie_name + "_shadow"]
        shadow.set("filter",'url(#dropshadow)')
    
    fn = "svg_filter_pie.svg"
    print "Saving '%s'" % fn
    ET.ElementTree(tree).write(fn)
    

Keywords: python, matplotlib, pylab, example, codex (see :ref:`how-to-search-examples`)