Revision: 6642
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6642&view=rev
Author:   leejjoon
Date:     2008-12-17 07:32:18 +0000 (Wed, 17 Dec 2008)

Log Message:
-----------
added group id in Artist. added two svg filter example

Modified Paths:
--------------
    trunk/matplotlib/CHANGELOG
    trunk/matplotlib/lib/matplotlib/artist.py
    trunk/matplotlib/lib/matplotlib/backend_bases.py
    trunk/matplotlib/lib/matplotlib/backends/backend_svg.py
    trunk/matplotlib/lib/matplotlib/lines.py
    trunk/matplotlib/lib/matplotlib/patches.py
    trunk/matplotlib/lib/matplotlib/text.py

Added Paths:
-----------
    trunk/matplotlib/examples/misc/svg_filter_line.py
    trunk/matplotlib/examples/misc/svg_filter_pie.py

Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG  2008-12-17 00:55:52 UTC (rev 6641)
+++ trunk/matplotlib/CHANGELOG  2008-12-17 07:32:18 UTC (rev 6642)
@@ -1,3 +1,6 @@
+2008-12-17 Add group id support in artist. Two examples which
+           demostrate svg filter are added. -JJL
+
 2008-12-16 Another attempt to fix dpi-dependent behavior of Legend. -JJL
 
 2008-12-16 Fixed dpi-dependent behavior of Legend and fancybox in Text.

Added: trunk/matplotlib/examples/misc/svg_filter_line.py
===================================================================
--- trunk/matplotlib/examples/misc/svg_filter_line.py                           
(rev 0)
+++ trunk/matplotlib/examples/misc/svg_filter_line.py   2008-12-17 07:32:18 UTC 
(rev 6642)
@@ -0,0 +1,85 @@
+"""
+Demonstrate SVG filtering effects which might be used with mpl.
+
+Note that the filtering effects are only effective if your svg rederer
+support it. 
+"""
+
+import matplotlib
+
+matplotlib.use("Svg")
+
+import matplotlib.pyplot as plt
+import matplotlib.transforms as mtransforms
+
+fig1 = plt.figure()
+ax = fig1.add_axes([0.1, 0.1, 0.8, 0.8])
+
+# draw lines
+l1, = ax.plot([0.1, 0.5, 0.9], [0.1, 0.9, 0.5], "bo-",
+              mec="b", lw=5, ms=10, label="Line 1")
+l2, = ax.plot([0.1, 0.5, 0.9], [0.5, 0.2, 0.7], "rs-",
+              mec="r", lw=5, ms=10, color="r", label="Line 2")
+
+
+for l in [l1, l2]:
+
+    # draw shadows with same lines with slight offset and gray colors.
+
+    xx = l.get_xdata()
+    yy = l.get_ydata()
+    shadow, = ax.plot(xx, yy)
+    shadow.update_from(l)
+
+    # adjust color
+    shadow.set_color("0.2")
+    # adjust zorder of the shadow lines so that it is drawn below the
+    # original lines
+    shadow.set_zorder(l.get_zorder()-0.5)
+
+    # offset transform
+    ot = mtransforms.offset_copy(l.get_transform(), fig1,
+                                 x=4.0, y=-6.0, units='points')
+
+    shadow.set_transform(ot)
+
+    # set the id for a later use
+    shadow.set_gid(l.get_label()+"_shadow")
+
+
+ax.set_xlim(0., 1.)
+ax.set_ylim(0., 1.)
+
+# save the figure as a string in the svg format.
+from StringIO import StringIO
+f = StringIO()
+plt.savefig(f, format="svg")
+
+
+import xml.etree.cElementTree as ET
+
+# filter definition for a gaussian blur
+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='3'/>
+    </filter>
+  </defs>
+"""
+
+
+# read in the saved svg 
+tree, xmlid = ET.XMLID(f.getvalue())
+
+# insert the filter definition in the svg dom tree.
+tree.insert(0, ET.XML(filter_def))
+
+for l in [l1, l2]:
+    # pick up the svg element with given id
+    shadow = xmlid[l.get_label()+"_shadow"]
+    # apply shdow filter
+    shadow.set("filter",'url(#dropshadow)')
+
+fn = "svg_filter_line.svg"
+print "Saving '%s'" % fn
+ET.ElementTree(tree).write(fn)

Added: trunk/matplotlib/examples/misc/svg_filter_pie.py
===================================================================
--- trunk/matplotlib/examples/misc/svg_filter_pie.py                            
(rev 0)
+++ trunk/matplotlib/examples/misc/svg_filter_pie.py    2008-12-17 07:32:18 UTC 
(rev 6642)
@@ -0,0 +1,95 @@
+"""
+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)

Modified: trunk/matplotlib/lib/matplotlib/artist.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/artist.py   2008-12-17 00:55:52 UTC (rev 
6641)
+++ trunk/matplotlib/lib/matplotlib/artist.py   2008-12-17 07:32:18 UTC (rev 
6642)
@@ -52,6 +52,7 @@
         self.axes = None
         self._remove_method = None
         self._url = None
+        self._gid = None
         self.x_isdata = True  # False to avoid updating Axes.dataLim with x
         self.y_isdata = True  #                                      with y
         self._snap = None
@@ -330,9 +331,26 @@
     def set_url(self, url):
         """
         Sets the url for the artist
+
+        ACCEPTS: a url string
         """
         self._url = url
 
+
+    def get_gid(self):
+        """
+        Returns the group id
+        """
+        return self._gid
+
+    def set_gid(self, gid):
+        """
+        Sets the (group) id for the artist
+
+        ACCEPTS: an id string
+        """
+        self._gid = gid
+
     def get_snap(self):
         """
         Returns the snap setting which may be:

Modified: trunk/matplotlib/lib/matplotlib/backend_bases.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backend_bases.py    2008-12-17 00:55:52 UTC 
(rev 6641)
+++ trunk/matplotlib/lib/matplotlib/backend_bases.py    2008-12-17 07:32:18 UTC 
(rev 6642)
@@ -52,10 +52,11 @@
     def __init__(self):
         self._texmanager = None
 
-    def open_group(self, s):
+    def open_group(self, s, gid=None):
         """
-        Open a grouping element with label *s*. Is only currently used by
-        :mod:`~matplotlib.backends.backend_svg`
+        Open a grouping element with label *s*. If *gid* is given, use
+        *gid* as the id of the group. Is only currently used by
+        :mod:`~matplotlib.backends.backend_svg`.
         """
         pass
 

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_svg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_svg.py     2008-12-17 
00:55:52 UTC (rev 6641)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_svg.py     2008-12-17 
07:32:18 UTC (rev 6642)
@@ -147,9 +147,16 @@
             self._clipd[path] = id
         return id
 
-    def open_group(self, s):
-        self._groupd[s] = self._groupd.get(s,0) + 1
-        self._svgwriter.write('<g id="%s%d">\n' % (s, self._groupd[s]))
+    def open_group(self, s, gid=None):
+        """
+        Open a grouping element with label *s*. If *gid* is given, use
+        *gid* as the id of the group. 
+        """
+        if gid:
+            self._svgwriter.write('<g id="%s">\n' % (gid))
+        else:
+            self._groupd[s] = self._groupd.get(s,0) + 1
+            self._svgwriter.write('<g id="%s%d">\n' % (s, self._groupd[s]))
 
     def close_group(self, s):
         self._svgwriter.write('</g>\n')

Modified: trunk/matplotlib/lib/matplotlib/lines.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/lines.py    2008-12-17 00:55:52 UTC (rev 
6641)
+++ trunk/matplotlib/lib/matplotlib/lines.py    2008-12-17 07:32:18 UTC (rev 
6642)
@@ -463,7 +463,7 @@
         if self._invalid:
             self.recache()
 
-        renderer.open_group('line2d')
+        renderer.open_group('line2d', self.get_gid())
 
         if not self._visible: return
         gc = renderer.new_gc()

Modified: trunk/matplotlib/lib/matplotlib/patches.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/patches.py  2008-12-17 00:55:52 UTC (rev 
6641)
+++ trunk/matplotlib/lib/matplotlib/patches.py  2008-12-17 07:32:18 UTC (rev 
6642)
@@ -264,7 +264,8 @@
     def draw(self, renderer):
         'Draw the :class:`Patch` to the given *renderer*.'
         if not self.get_visible(): return
-        #renderer.open_group('patch')
+
+        renderer.open_group('patch', self.get_gid())
         gc = renderer.new_gc()
 
         if cbook.is_string_like(self._edgecolor) and 
self._edgecolor.lower()=='none':
@@ -300,7 +301,7 @@
 
         renderer.draw_path(gc, tpath, affine, rgbFace)
 
-        #renderer.close_group('patch')
+        renderer.close_group('patch')
 
     def get_path(self):
         """

Modified: trunk/matplotlib/lib/matplotlib/text.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/text.py     2008-12-17 00:55:52 UTC (rev 
6641)
+++ trunk/matplotlib/lib/matplotlib/text.py     2008-12-17 07:32:18 UTC (rev 
6642)
@@ -447,6 +447,8 @@
         if not self.get_visible(): return
         if self._text=='': return
 
+        renderer.open_group('text', self.get_gid())
+
         bbox, info = self._get_layout(renderer)
         trans = self.get_transform()
 
@@ -499,6 +501,8 @@
                                self._fontproperties, angle,
                                ismath=ismath)
 
+        renderer.close_group('text')
+
     def get_color(self):
         "Return the color of the text"
         return self._color


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada.
The future of the web can't happen without you.  Join us at MIX09 to help
pave the way to the Next Web now. Learn more and register at
http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to