You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(115) |
Aug
(120) |
Sep
(137) |
Oct
(170) |
Nov
(461) |
Dec
(263) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(120) |
Feb
(74) |
Mar
(35) |
Apr
(74) |
May
(245) |
Jun
(356) |
Jul
(240) |
Aug
(115) |
Sep
(78) |
Oct
(225) |
Nov
(98) |
Dec
(271) |
2009 |
Jan
(132) |
Feb
(84) |
Mar
(74) |
Apr
(56) |
May
(90) |
Jun
(79) |
Jul
(83) |
Aug
(296) |
Sep
(214) |
Oct
(76) |
Nov
(82) |
Dec
(66) |
2010 |
Jan
(46) |
Feb
(58) |
Mar
(51) |
Apr
(77) |
May
(58) |
Jun
(126) |
Jul
(128) |
Aug
(64) |
Sep
(50) |
Oct
(44) |
Nov
(48) |
Dec
(54) |
2011 |
Jan
(68) |
Feb
(52) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2018 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <md...@us...> - 2007-10-23 16:54:56
|
Revision: 3986 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3986&view=rev Author: mdboom Date: 2007-10-23 09:54:51 -0700 (Tue, 23 Oct 2007) Log Message: ----------- Fix bug that broke draw_image Modified Paths: -------------- branches/transforms/src/_backend_agg.cpp Modified: branches/transforms/src/_backend_agg.cpp =================================================================== --- branches/transforms/src/_backend_agg.cpp 2007-10-23 16:40:25 UTC (rev 3985) +++ branches/transforms/src/_backend_agg.cpp 2007-10-23 16:54:51 UTC (rev 3986) @@ -48,17 +48,11 @@ PyArrayObject* matrix = NULL; try { - if (obj.ptr() == Py_None) { - if (errors) - throw Py::Exception(); - return agg::trans_affine(); - } + if (obj.ptr() == Py_None) + throw Py::Exception(); matrix = (PyArrayObject*) PyArray_FromObject(obj.ptr(), PyArray_DOUBLE, 2, 2); - if (!matrix) { - if (errors) - throw Py::Exception(); - return agg::trans_affine(); - } + if (!matrix) + throw Py::Exception(); if (matrix->nd == 2 || matrix->dimensions[0] == 3 || matrix->dimensions[1] == 3) { size_t stride0 = matrix->strides[0]; size_t stride1 = matrix->strides[1]; @@ -81,16 +75,16 @@ return agg::trans_affine(a, b, c, d, e, f); } + + throw Py::Exception(); } catch (...) { if (errors) { Py_XDECREF(matrix); - throw; + throw Py::TypeError("Invalid affine transformation matrix"); } } Py_XDECREF(matrix); - if (errors) - throw Py::TypeError("Invalid affine transformation matrix"); return agg::trans_affine(); } @@ -797,6 +791,7 @@ Py::Object RendererAgg::draw_image(const Py::Tuple& args) { _VERBOSE("RendererAgg::draw_image"); + args.verify_length(4, 6); float x = Py::Float(args[0]); @@ -807,7 +802,7 @@ agg::trans_affine clippath_trans; if (args.size() == 6) { clippath = args[4]; - clippath_trans = py_to_agg_transformation_matrix(args[5]); + clippath_trans = py_to_agg_transformation_matrix(args[5], false); } theRasterizer->reset_clipping(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2007-10-23 16:40:32
|
Revision: 3985 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3985&view=rev Author: mdboom Date: 2007-10-23 09:40:25 -0700 (Tue, 23 Oct 2007) Log Message: ----------- More progress on SVG. Refactored PS collection drawing to make it easier to reuse the (fairly complex) code. Modified Paths: -------------- branches/transforms/lib/matplotlib/backend_bases.py branches/transforms/lib/matplotlib/backends/backend_ps.py branches/transforms/lib/matplotlib/backends/backend_svg.py Modified: branches/transforms/lib/matplotlib/backend_bases.py =================================================================== --- branches/transforms/lib/matplotlib/backend_bases.py 2007-10-23 14:30:57 UTC (rev 3984) +++ branches/transforms/lib/matplotlib/backend_bases.py 2007-10-23 16:40:25 UTC (rev 3985) @@ -55,13 +55,90 @@ offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds): """ - MGDTODO: Document me. Explain that often the backend will not - want to override this. + This provides a fallback implementation of + draw_path_collection that makes multiple calls to draw_path. + Often, the backend will want to override this in order to + render each set of path data only once, and then reference + that path multiple times with the different offsets, colors, + styles etc. The methods _iter_collection_raw_paths and + _iter_collection are provided to help with (and standardize) + the implementation that in each backend. """ + path_ids = [] + for path, transform in self._iter_collection_raw_paths( + master_transform, paths, all_transforms): + path_ids.append((path, transform)) + + for xo, yo, path_id, gc, rgbFace in self._iter_collection( + path_ids, cliprect, clippath, clippath_trans, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds): + path, transform = path_id + transform = transform.frozen().translate(xo, yo) + self.draw_path(gc, path, transform, rgbFace) + + def _iter_collection_raw_paths(self, master_transform, paths, all_transforms): + """ + This is a helper method (along with _iter_collection) to make + it easier to write a space-efficent draw_path_collection + implementation in a backend. + + This method yields all of the base path/transform + combinations, given a master transform, a list of paths and + list of transforms. + + The arguments should be exactly what is passed in to + draw_path_collection. + + The backend should take each yielded path and transform and + create an object can be referenced (reused) later. + """ Npaths = len(paths) + Ntransforms = len(all_transforms) + N = max(Npaths, Ntransforms) + + if Npaths == 0: + return + + for i in xrange(N): + path = paths[i % Npaths] + transform = all_transforms[i % Ntransforms] + if transform is None: + transform = transforms.IdentityTransform() + transform += master_transform + yield path, transform + + def _iter_collection(self, path_ids, cliprect, clippath, clippath_trans, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds): + """ + This is a helper method (along with + _iter_collection_raw_paths) to make it easier to write a + space-efficent draw_path_collection implementation in a + backend. + + This method yields all of the path, offset and graphics + context combinations to draw the path collection. The caller + should already have looped over the results of + _iter_collection_raw_paths to draw this collection. + + The arguments should be the same as that passed into + draw_path_collection, with the exception of path_ids, which + is a list of arbitrary objects that the backend will use to + reference one of the paths created in the + _iter_collection_raw_paths stage. + + Each yielded result is of the form: + + xo, yo, path_id, gc, rgbFace + + where xo, yo is an offset; path_id is one of the elements of + path_ids; gc is a graphics context and rgbFace is a color to + use for filling the path. + """ + Npaths = len(path_ids) Noffsets = len(offsets) N = max(Npaths, Noffsets) - Ntransforms = min(len(all_transforms), N) Nfacecolors = len(facecolors) Nedgecolors = len(edgecolors) Nlinewidths = len(linewidths) @@ -71,16 +148,10 @@ if (Nfacecolors == 0 and Nedgecolors == 0) or Npaths == 0: return - ttransforms = [] - for i in range(Ntransforms): - transform = all_transforms[i] - if transform is None: - transform = transforms.IdentityTransform() - ttransforms.append((transform + master_transform).frozen()) - toffsets = offsetTrans.transform(offsets) gc = self.new_gc() + gc.set_clip_rectangle(cliprect) if clippath is not None: clippath = transforms.TransformedPath(clippath, clippath_trans) @@ -89,12 +160,9 @@ if Nfacecolors == 0: rgbFace = None - print linewidths, edgecolors - for i in xrange(N): - path = paths[i % Npaths] + path_id = path_ids[i % Npaths] xo, yo = toffsets[i % Noffsets] - transform = ttransforms[i % Ntransforms].frozen().translate(xo, yo) if Nfacecolors: rgbFace = facecolors[i % Nfacecolors] if Nedgecolors: @@ -103,8 +171,8 @@ gc.set_dashes(*linestyles[i % Nlinestyles]) gc.set_antialiased(antialiaseds[i % Naa]) - self.draw_path(gc, path, transform, rgbFace) - + yield xo, yo, path_id, gc, rgbFace + def get_image_magnification(self): """ Get the factor by which to magnify images passed to draw_image. Modified: branches/transforms/lib/matplotlib/backends/backend_ps.py =================================================================== --- branches/transforms/lib/matplotlib/backends/backend_ps.py 2007-10-23 14:30:57 UTC (rev 3984) +++ branches/transforms/lib/matplotlib/backends/backend_ps.py 2007-10-23 16:40:25 UTC (rev 3985) @@ -503,57 +503,22 @@ linestyles, antialiaseds): write = self._pswriter.write - Npaths = len(paths) - Noffsets = len(offsets) - N = max(Npaths, Noffsets) - Ntransforms = min(len(all_transforms), N) - Ntpaths = max(Npaths, Ntransforms) - Nfacecolors = len(facecolors) - Nedgecolors = len(edgecolors) - Nlinewidths = len(linewidths) - Nlinestyles = len(linestyles) - Naa = len(antialiaseds) - - if (Nfacecolors == 0 and Nedgecolors == 0) or Npaths == 0: - return - - for i in range(Ntpaths): - path = paths[i % Npaths] - transform = all_transforms[i % Ntransforms] - if transform is None: - transform = IdentityTransform() - transform += master_transform - + path_codes = [] + for i, (path, transform) in enumerate(self._iter_collection_raw_paths( + master_transform, paths, all_transforms)): ps_cmd = ['/p%x_%x {' % (self._path_collection_id, i), 'newpath', 'translate'] ps_cmd.append(self._convert_path(path, transform)) ps_cmd.extend(['} bind def\n']) write('\n'.join(ps_cmd)) + path_codes.append("p%x_%x" % (self._path_collection_id, i)) - toffsets = offsetTrans.transform(offsets) - - gc = self.new_gc() + for xo, yo, path_id, gc, rgbFace in self._iter_collection( + path_codes, cliprect, clippath, clippath_trans, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds): - gc.set_clip_rectangle(cliprect) - if clippath is not None: - clippath = transforms.TransformedPath(clippath, clippath_trans) - gc.set_clippath(clippath) - - if Nfacecolors == 0: - rgbFace = None - - for i in xrange(N): - path_id = i % Ntpaths - xo, yo = toffsets[i % Noffsets] - if Nfacecolors: - rgbFace = facecolors[i % Nfacecolors] - if Nedgecolors: - gc.set_foreground(edgecolors[i % Nedgecolors]) - gc.set_linewidth(linewidths[i % Nlinewidths]) - gc.set_dashes(*linestyles[i % Nlinestyles]) - gc.set_antialiased(antialiaseds[i % Naa]) - - ps = "%g %g p%x_%x" % (xo, yo, self._path_collection_id, path_id) + ps = "%g %g %s" % (xo, yo, path_id) self._draw_ps(ps, gc, rgbFace) self._path_collection_id += 1 @@ -786,7 +751,9 @@ cint = gc.get_capstyle() self.set_linecap(cint) self.set_linedash(*gc.get_dashes()) - + if self.linewidth > 0 and stroke: + self.set_color(*gc.get_rgb()[:3]) + cliprect = gc.get_clip_rectangle() if cliprect: x,y,w,h=cliprect.bounds Modified: branches/transforms/lib/matplotlib/backends/backend_svg.py =================================================================== --- branches/transforms/lib/matplotlib/backends/backend_svg.py 2007-10-23 14:30:57 UTC (rev 3984) +++ branches/transforms/lib/matplotlib/backends/backend_svg.py 2007-10-23 16:40:25 UTC (rev 3985) @@ -47,16 +47,16 @@ svgwriter.write(svgProlog%(width,height,width,height)) def _draw_svg_element(self, element, details, gc, rgbFace): - cliprect, clipid = self._get_gc_clip_svg(gc) + clipid = self._get_gc_clip_svg(gc) if clipid is None: clippath = '' else: clippath = 'clip-path="url(#%s)"' % clipid style = self._get_style(gc, rgbFace) - self._svgwriter.write ('%s<%s style="%s" %s %s/>\n' % ( - cliprect, element, style, clippath, details)) - + self._svgwriter.write ('<%s style="%s" %s %s/>\n' % ( + element, style, clippath, details)) + def _get_font(self, prop): key = hash(prop) font = self.fontd.get(key) @@ -108,36 +108,23 @@ cliprect = gc.get_clip_rectangle() clippath, clippath_trans = gc.get_clip_path() if clippath is not None: - pathkey = (hash(clippath), hash(clippath_trans)) - path = '' - if self._clipd.get(pathkey) is None: - self._clipd[pathkey] = clippath - path_data = self._convert_path(clippath, clippath_trans) - path = """\ -<defs> - <clipPath id="%(pathkey)s"> - <path d="%(path_data)s"/> - </clipPath> -</defs> -""" % locals() - return path, pathkey + path_data = self._convert_path(clippath, clippath_trans) + path = '<path d="%s"/>' % path_data elif cliprect is not None: - rectkey = hash(cliprect) - box = '' - if self._clipd.get(rectkey) is None: - self._clipd[rectkey] = cliprect - x, y, w, h = cliprect.bounds - y = self.height-(y+h) - box = """\ -<defs> - <clipPath id="%(rectkey)s"> - <rect x="%(x)s" y="%(y)s" width="%(w)s" height="%(h)s"/> - </clipPath> -</defs> -""" % locals() - return box, rectkey - - return '', None + x, y, w, h = cliprect.bounds + y = self.height-(y+h) + path = '<rect x="%(x)s" y="%(y)s" width="%(w)s" height="%(h)s"/>' % locals() + else: + return None + + id = self._clipd.get(path) + if id is None: + id = 'p%x' % len(self._clipd) + self._svgwriter.write('<defs>\n <clipPath id="%s">\n' % id) + self._svgwriter.write(path) + self._svgwriter.write('\n </clipPath>\n</defs>') + self._clipd[path] = id + return id def open_group(self, s): self._groupd[s] = self._groupd.get(s,0) + 1 @@ -193,17 +180,17 @@ def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): write = self._svgwriter.write - key = self._convert_path(marker_path, marker_trans + Affine2D().scale(0, -1.0)) + key = self._convert_path(marker_path, marker_trans + Affine2D().scale(1.0, -1.0)) name = self._markers.get(key) if name is None: - name = 'm_%x' % len(self._markers) + name = 'm%x' % len(self._markers) write('<defs><path id="%s" d="%s"/></defs>\n' % (name, key)) self._markers[key] = name trans_and_flip = self._make_flip_transform(trans) tpath = trans_and_flip.transform_path(path) for x, y in tpath.vertices: - details = 'xlink:href="#%s" transform="translate(%f, %f)"' % (name, x, y) + details = 'xlink:href="#%s" x="%f" y="%f"' % (name, x, y) self._draw_svg_element('use', details, gc, rgbFace) def draw_image(self, x, y, im, bbox): @@ -307,7 +294,7 @@ svg.append('<use xlink:href="#%s"' % charid) if currx != 0: - svg.append(' transform="translate(%s)"' % + svg.append(' x="%s"' % (currx * (self.FONT_SCALE / fontsize))) svg.append('/>\n') currx += (glyph.linearHoriAdvance / 65536.0) @@ -364,7 +351,7 @@ if step[0] != 4: currx, curry = step[-2], -step[-1] - char_num = 'c_%x' % len(self._char_defs) + char_num = 'c%x' % len(self._char_defs) path_element = '<path id="%s" d="%s"/>\n' % (char_num, ''.join(path_data)) self._char_defs[char_id] = (char_num, path_element) return char_num This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2007-10-23 14:30:59
|
Revision: 3984 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3984&view=rev Author: mdboom Date: 2007-10-23 07:30:57 -0700 (Tue, 23 Oct 2007) Log Message: ----------- Merged revisions 3962-3983 via svnmerge from http://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib ........ r3963 | mdboom | 2007-10-18 13:40:30 -0400 (Thu, 18 Oct 2007) | 1 line Major speedup in PDF backend by using hasattr() rather than 'in dir()' ........ r3964 | mdboom | 2007-10-18 14:07:06 -0400 (Thu, 18 Oct 2007) | 1 line Faster version of fill() for PDF writing ........ r3966 | jdh2358 | 2007-10-19 10:23:48 -0400 (Fri, 19 Oct 2007) | 2 lines fixed a verbose report bug in patches ........ r3967 | dsdale | 2007-10-19 10:43:21 -0400 (Fri, 19 Oct 2007) | 2 lines removed a gsave/grestore pair surrounding _draw_ps ........ r3968 | dsdale | 2007-10-19 11:37:41 -0400 (Fri, 19 Oct 2007) | 3 lines changed dependency check for ghostscript, which was failing to identify svn versions ........ r3969 | dsdale | 2007-10-19 11:41:25 -0400 (Fri, 19 Oct 2007) | 2 lines whitespace cleanup ........ r3975 | jdh2358 | 2007-10-21 12:02:07 -0400 (Sun, 21 Oct 2007) | 1 line added a show method for gtk fig manager ........ Modified Paths: -------------- branches/transforms/CHANGELOG branches/transforms/lib/matplotlib/__init__.py branches/transforms/lib/matplotlib/backends/backend_gtk.py branches/transforms/lib/matplotlib/backends/backend_ps.py branches/transforms/lib/matplotlib/collections.py branches/transforms/lib/matplotlib/config/checkdep.py branches/transforms/setup.py branches/transforms/setupext.py Property Changed: ---------------- branches/transforms/ Property changes on: branches/transforms ___________________________________________________________________ Name: svnmerge-integrated - /trunk/matplotlib:1-3961 + /trunk/matplotlib:1-3983 Modified: branches/transforms/CHANGELOG =================================================================== --- branches/transforms/CHANGELOG 2007-10-23 14:25:49 UTC (rev 3983) +++ branches/transforms/CHANGELOG 2007-10-23 14:30:57 UTC (rev 3984) @@ -1,3 +1,8 @@ +2007-10-19 Removed a gsave/grestore pair surrounding _draw_ps, which + was causing a loss graphics state info (see "EPS output + problem - scatter & edgecolors" on mpl-dev, 2007-10-29) + - DSD + 2007-10-15 Fixed a bug in patches.Ellipse that was broken for aspect='auto'. Scale free ellipses now work properly for equal and auto on Agg and PS, and they fall back on a Modified: branches/transforms/lib/matplotlib/__init__.py =================================================================== --- branches/transforms/lib/matplotlib/__init__.py 2007-10-23 14:25:49 UTC (rev 3983) +++ branches/transforms/lib/matplotlib/__init__.py 2007-10-23 14:30:57 UTC (rev 3984) @@ -149,13 +149,10 @@ # --verbose-silent or --verbose-helpful _commandLineVerbose = None - for arg in sys.argv[1:]: if not arg.startswith('--verbose-'): continue _commandLineVerbose = arg[10:] - - def __init__(self): self.set_level('silent') self.fileo = sys.stdout @@ -195,8 +192,6 @@ return True return False - - def wrap(self, fmt, func, level='helpful', always=True): """ return a callable function that wraps func and reports it @@ -225,6 +220,7 @@ verbose=Verbose() + def checkdep_dvipng(): try: stdin, stdout = os.popen4('dvipng -version') @@ -243,7 +239,7 @@ command = 'gs -v' stdin, stdout = os.popen4(command) line = stdout.readlines()[0] - v = line.split()[2] + v = line.split()[-2] vtest = '.'.join(v.split('.')[:2]) # deal with version numbers like '7.07.1' float(vtest) return vtest Modified: branches/transforms/lib/matplotlib/backends/backend_gtk.py =================================================================== --- branches/transforms/lib/matplotlib/backends/backend_gtk.py 2007-10-23 14:25:49 UTC (rev 3983) +++ branches/transforms/lib/matplotlib/backends/backend_gtk.py 2007-10-23 14:30:57 UTC (rev 3984) @@ -390,7 +390,7 @@ self.window = gtk.Window() self.window.set_title("Figure %d" % num) - + self.vbox = gtk.VBox() self.window.add(self.vbox) self.vbox.show() @@ -439,7 +439,10 @@ gtk.main_level() >= 1: gtk.main_quit() - + def show(self): + # show the figure window + self.window.show() + def full_screen_toggle (self): self._full_screen_flag = not self._full_screen_flag if self._full_screen_flag: Modified: branches/transforms/lib/matplotlib/backends/backend_ps.py =================================================================== --- branches/transforms/lib/matplotlib/backends/backend_ps.py 2007-10-23 14:25:49 UTC (rev 3983) +++ branches/transforms/lib/matplotlib/backends/backend_ps.py 2007-10-23 14:30:57 UTC (rev 3984) @@ -777,7 +777,6 @@ """ # local variable eliminates all repeated attribute lookups write = self._pswriter.write - # write('gsave\n') if debugPS and command: write("% "+command+"\n") @@ -818,7 +817,6 @@ write("grestore\n") if cliprect: write("grestore\n") - #write('grestore\n') class GraphicsContextPS(GraphicsContextBase): Modified: branches/transforms/lib/matplotlib/collections.py =================================================================== --- branches/transforms/lib/matplotlib/collections.py 2007-10-23 14:25:49 UTC (rev 3983) +++ branches/transforms/lib/matplotlib/collections.py 2007-10-23 14:30:57 UTC (rev 3984) @@ -288,7 +288,6 @@ raise ValueError() except ValueError: raise ValueError('Do not know how to convert %s to dashes'%ls) - self._linestyles = dashes set_dashes = set_linestyle = set_linestyles Modified: branches/transforms/lib/matplotlib/config/checkdep.py =================================================================== --- branches/transforms/lib/matplotlib/config/checkdep.py 2007-10-23 14:25:49 UTC (rev 3983) +++ branches/transforms/lib/matplotlib/config/checkdep.py 2007-10-23 14:30:57 UTC (rev 3984) @@ -1,4 +1,7 @@ -import os, re, sys +import os +import re +import sys +import warnings import distutils.version as version def dvipng(): @@ -19,7 +22,7 @@ command = 'gs -v' stdin, stdout = os.popen4(command) line = stdout.readlines()[0] - v = line.split()[2] + v = line.split()[-2] vtest = '.'.join(v.split('.')[:2]) # deal with version numbers like '7.07.1' float(vtest) return vtest @@ -130,4 +133,4 @@ 'unless ghostscript-%s or later is ' 'installed on your system') % gs_req) - return flag \ No newline at end of file + return flag Modified: branches/transforms/setup.py =================================================================== --- branches/transforms/setup.py 2007-10-23 14:25:49 UTC (rev 3983) +++ branches/transforms/setup.py 2007-10-23 14:30:57 UTC (rev 3984) @@ -24,8 +24,8 @@ # it. It makes very nice antialiased output and also supports alpha # blending BUILD_AGG = 1 -BUILD_GTKAGG = 'auto' -BUILD_GTK = 'auto' +BUILD_GTKAGG = 1 +BUILD_GTK = 1 # build TK GUI with Agg renderer ; requires Tkinter Python extension # and Tk includes @@ -271,7 +271,7 @@ # packagers: set rc['numerix'] and rc['backend'] here to override the auto # defaults, eg #rc['numerix'] = numpy -#rc['backend'] = GTKAgg +#rc['backend'] = 'GTKAgg' if sys.platform=='win32': rc = dict(backend='TkAgg', numerix='numpy') template = file('matplotlibrc.template').read() Modified: branches/transforms/setupext.py =================================================================== --- branches/transforms/setupext.py 2007-10-23 14:25:49 UTC (rev 3983) +++ branches/transforms/setupext.py 2007-10-23 14:30:57 UTC (rev 3984) @@ -43,9 +43,10 @@ import os + basedir = { 'win32' : ['win32_static',], - 'linux2' : ['/usr/local', '/usr',], + 'linux2' : ['/usr/local', '/usr'], 'linux' : ['/usr/local', '/usr',], 'cygwin' : ['/usr/local', '/usr',], 'darwin' : ['/sw/lib/freetype2', '/sw/lib/freetype219', '/usr/local', @@ -170,6 +171,7 @@ if sys.platform == 'win32': has_pkgconfig.cache = False else: + #print 'environ', os.environ['PKG_CONFIG_PATH'] status, output = commands.getstatusoutput("pkg-config --help") has_pkgconfig.cache = (status == 0) return has_pkgconfig.cache @@ -192,6 +194,9 @@ status, output = commands.getstatusoutput( "%s %s %s" % (pkg_config_exec, flags, packages)) + #if packages.startswith('pygtk'): + # print 'status', status, output + # raise SystemExit if status == 0: for token in output.split(): attr = _flags.get(token[:2], None) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2007-10-23 14:25:52
|
Revision: 3983 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3983&view=rev Author: mdboom Date: 2007-10-23 07:25:49 -0700 (Tue, 23 Oct 2007) Log Message: ----------- First pass at SVG support Modified Paths: -------------- branches/transforms/lib/matplotlib/backends/backend_svg.py Modified: branches/transforms/lib/matplotlib/backends/backend_svg.py =================================================================== --- branches/transforms/lib/matplotlib/backends/backend_svg.py 2007-10-23 14:24:49 UTC (rev 3982) +++ branches/transforms/lib/matplotlib/backends/backend_svg.py 2007-10-23 14:25:49 UTC (rev 3983) @@ -10,6 +10,8 @@ from matplotlib.font_manager import findfont, FontProperties from matplotlib.ft2font import FT2Font, KERNING_DEFAULT, LOAD_NO_HINTING from matplotlib.mathtext import MathTextParser +from matplotlib.path import Path +from matplotlib.transforms import Affine2D from xml.sax.saxutils import escape as escape_xml_text @@ -39,6 +41,7 @@ self._imaged = {} self._clipd = {} self._char_defs = {} + self._markers = {} self.mathtext_parser = MathTextParser('SVG') self.fontd = {} svgwriter.write(svgProlog%(width,height,width,height)) @@ -74,7 +77,7 @@ if rgbFace is None: fill = 'none' else: - fill = rgb2hex(rgbFace) + fill = rgb2hex(rgbFace[:3]) offset, seq = gc.get_dashes() if seq is None: @@ -103,28 +106,38 @@ def _get_gc_clip_svg(self, gc): cliprect = gc.get_clip_rectangle() - if cliprect is None: - return '', None - else: - # See if we've already seen this clip rectangle - key = hash(cliprect) - if self._clipd.get(key) is None: # If not, store a new clipPath - self._clipd[key] = cliprect - x, y, w, h = cliprect + clippath, clippath_trans = gc.get_clip_path() + if clippath is not None: + pathkey = (hash(clippath), hash(clippath_trans)) + path = '' + if self._clipd.get(pathkey) is None: + self._clipd[pathkey] = clippath + path_data = self._convert_path(clippath, clippath_trans) + path = """\ +<defs> + <clipPath id="%(pathkey)s"> + <path d="%(path_data)s"/> + </clipPath> +</defs> +""" % locals() + return path, pathkey + elif cliprect is not None: + rectkey = hash(cliprect) + box = '' + if self._clipd.get(rectkey) is None: + self._clipd[rectkey] = cliprect + x, y, w, h = cliprect.bounds y = self.height-(y+h) - style = "stroke: gray; fill: none;" box = """\ <defs> - <clipPath id="%(key)s"> - <rect x="%(x)s" y="%(y)s" width="%(w)s" height="%(h)s" - style="%(style)s"/> + <clipPath id="%(rectkey)s"> + <rect x="%(x)s" y="%(y)s" width="%(w)s" height="%(h)s"/> </clipPath> </defs> """ % locals() - return box, key - else: - # return id of previously defined clipPath - return '', key + return box, rectkey + + return '', None def open_group(self, s): self._groupd[s] = self._groupd.get(s,0) + 1 @@ -133,20 +146,66 @@ def close_group(self, s): self._svgwriter.write('</g>\n') - def draw_arc(self, gc, rgbFace, x, y, width, height, angle1, angle2, rotation): - """ - Ignores angles for now - """ - details = 'cx="%s" cy="%s" rx="%s" ry="%s" transform="rotate(%1.1f %s %s)"' % \ - (x, self.height-y, width/2.0, height/2.0, -rotation, x, self.height-y) - self._draw_svg_element('ellipse', details, gc, rgbFace) - def option_image_nocomposite(self): """ if svg.image_noscale is True, compositing multiple images into one is prohibited """ return rcParams['svg.image_noscale'] + _path_commands = { + Path.MOVETO: 'M%s %s', + Path.LINETO: 'L%s %s', + Path.CURVE3: 'Q%s %s %s %s', + Path.CURVE4: 'C%s %s %s %s %s %s' + } + + def _make_flip_transform(self, transform): + return (transform + + Affine2D() + .scale(1.0, -1.0) + .translate(0.0, self.height)) + + def _convert_path(self, path, transform): + tpath = transform.transform_path(path) + + path_data = [] + appender = path_data.append + path_commands = self._path_commands + currpos = 0 + for points, code in tpath.iter_segments(): + if code == Path.CLOSEPOLY: + segment = 'z' + else: + segment = path_commands[code] % tuple(points) + + if currpos + len(segment) > 75: + appender("\n") + currpos = 0 + appender(segment) + currpos += len(segment) + return ''.join(path_data) + + def draw_path(self, gc, path, transform, rgbFace=None): + trans_and_flip = self._make_flip_transform(transform) + path_data = self._convert_path(path, trans_and_flip) + self._draw_svg_element('path', 'd="%s"' % path_data, gc, rgbFace) + + def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): + write = self._svgwriter.write + + key = self._convert_path(marker_path, marker_trans + Affine2D().scale(0, -1.0)) + name = self._markers.get(key) + if name is None: + name = 'm_%x' % len(self._markers) + write('<defs><path id="%s" d="%s"/></defs>\n' % (name, key)) + self._markers[key] = name + + trans_and_flip = self._make_flip_transform(trans) + tpath = trans_and_flip.transform_path(path) + for x, y in tpath.vertices: + details = 'xlink:href="#%s" transform="translate(%f, %f)"' % (name, x, y) + self._draw_svg_element('use', details, gc, rgbFace) + def draw_image(self, x, y, im, bbox): trans = [1,0,0,1,0,0] transstr = '' @@ -204,38 +263,6 @@ 'xlink:href="%s" %s/>\n'%(x/trans[0], (self.height-y)/trans[3]-h, w, h, hrefstr, transstr) ) - def draw_line(self, gc, x1, y1, x2, y2): - details = 'd="M%s,%sL%s,%s"' % (x1, self.height-y1, - x2, self.height-y2) - self._draw_svg_element('path', details, gc, None) - - def draw_lines(self, gc, x, y, transform=None): - if len(x)==0: return - if len(x)!=len(y): - raise ValueError('x and y must be the same length') - - y = self.height - y - details = ['d="M%s,%s' % (x[0], y[0])] - xys = zip(x[1:], y[1:]) - details.extend(['L%s,%s' % tup for tup in xys]) - details.append('"') - details = ''.join(details) - self._draw_svg_element('path', details, gc, None) - - def draw_point(self, gc, x, y): - # result seems to have a hole in it... - self.draw_arc(gc, gc.get_rgb(), x, y, 1, 0, 0, 0, 0) - - def draw_polygon(self, gc, rgbFace, points): - details = 'points = "%s"' % ' '.join(['%s,%s'%(x,self.height-y) - for x, y in points]) - self._draw_svg_element('polygon', details, gc, rgbFace) - - def draw_rectangle(self, gc, rgbFace, x, y, width, height): - details = 'width="%s" height="%s" x="%s" y="%s"' % (width, height, x, - self.height-y-height) - self._draw_svg_element('rect', details, gc, rgbFace) - def draw_text(self, gc, x, y, s, prop, angle, ismath): if ismath: self._draw_mathtext(gc, x, y, s, prop, angle) @@ -467,7 +494,7 @@ return self._print_svg(filename, svgwriter) def _print_svg(self, filename, svgwriter): - self.figure.dpi.set(72) + self.figure.set_dpi(72.0) width, height = self.figure.get_size_inches() w, h = width*72, height*72 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2007-10-23 14:24:50
|
Revision: 3982 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3982&view=rev Author: mdboom Date: 2007-10-23 07:24:49 -0700 (Tue, 23 Oct 2007) Log Message: ----------- Marker objects should be keyed off of whether or not they are filled and their line width (since the line width affects the bounding box). Modified Paths: -------------- branches/transforms/lib/matplotlib/backends/backend_pdf.py Modified: branches/transforms/lib/matplotlib/backends/backend_pdf.py =================================================================== --- branches/transforms/lib/matplotlib/backends/backend_pdf.py 2007-10-23 14:23:19 UTC (rev 3981) +++ branches/transforms/lib/matplotlib/backends/backend_pdf.py 2007-10-23 14:24:49 UTC (rev 3982) @@ -1024,7 +1024,7 @@ def markerObject(self, path, trans, fillp, lw): """Return name of a marker XObject representing the given path.""" - key = (path, trans) + key = (path, trans, fillp is not None, lw) result = self.markers.get(key) if result is None: name = Name('M%d' % len(self.markers)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2007-10-23 14:23:21
|
Revision: 3981 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3981&view=rev Author: mdboom Date: 2007-10-23 07:23:19 -0700 (Tue, 23 Oct 2007) Log Message: ----------- Decreasing polar interpolation resolution. Modified Paths: -------------- branches/transforms/lib/matplotlib/projections/polar.py Modified: branches/transforms/lib/matplotlib/projections/polar.py =================================================================== --- branches/transforms/lib/matplotlib/projections/polar.py 2007-10-21 21:19:51 UTC (rev 3980) +++ branches/transforms/lib/matplotlib/projections/polar.py 2007-10-23 14:23:19 UTC (rev 3981) @@ -151,7 +151,7 @@ def refresh(self): return self.base.refresh() - RESOLUTION = 100 + RESOLUTION = 50 def __init__(self, *args, **kwargs): """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-21 21:19:57
|
Revision: 3980 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3980&view=rev Author: jdh2358 Date: 2007-10-21 14:19:51 -0700 (Sun, 21 Oct 2007) Log Message: ----------- added glass dots2 Added Paths: ----------- trunk/py4science/examples/glass_dots2.py Added: trunk/py4science/examples/glass_dots2.py =================================================================== --- trunk/py4science/examples/glass_dots2.py (rev 0) +++ trunk/py4science/examples/glass_dots2.py 2007-10-21 21:19:51 UTC (rev 3980) @@ -0,0 +1,83 @@ +import numpy as npy +import numpy.linalg as linalg +from pylab import figure, show + +class Transformer: + def __init__(self, axes): + self.theta = 0 + self.dtheta = 0.01 + self.sx = 1. + self.sy = 1. + self.dx = 0.001 + self.axes = axes + self.canvas = axes.figure.canvas + self.canvas.mpl_connect('button_press_event', self.press) + self.canvas.mpl_connect('button_release_event', self.release) + self.canvas.mpl_connect('motion_notify_event', self.move) + + X1 = self.X1 = npy.matrix(npy.random.rand(2,2000))-0.5 + + x1 = X1[0].flat + y1 = X1[1].flat + x2 = X1[0].flat # no transformation yet + y2 = X1[1].flat + self.line1, self.line2 = ax.plot(x1, y1,'go', x2, y2, 'ro', markersize=2) + self.xlast = None + self.ylast = None + self.title = ax.set_title('drag the left or right mouse to stretch and rotate', fontweight='bold') + + def press(self, event): + 'mouse press, save the x and y locations' + self.xlast = event.xdata + self.ylast = event.ydata + + + def release(self, event): + 'release the mouse' + self.xlast = None + self.ylast = None + self.draw() + + def draw(self): + sx, sy, theta = self.sx, self.sy, self.theta + a = sx*npy.cos(theta) + b = -sx*npy.sin(theta) + c = sy*npy.sin(theta) + d = sy*npy.cos(theta) + M = npy.matrix([[a,b],[c,d]]) + + X2 = M*self.X1 + x2 = X2[0].flat + y2 = X2[1].flat + self.line2.set_data(x2,y2) + + self.canvas.draw() + + def move(self, event): + + if not event.inaxes: return # not over axes + if self.xlast is None: return # no initial data + if not event.button: return # no button press + + dx = event.xdata - self.xlast + dy = event.ydata - self.ylast + + if event.button==1: + self.theta += dx + elif event.button==3: + self.sx += dx + self.sy += dy + + self.title.set_text('sx=%1.2f, sy=%1.2f, theta=%1.2f'%(self.sx, self.sy, self.theta)) + self.draw() + self.xlast = event.xdata + self.ylast = event.ydata + + + + +from pylab import subplot, show +fig = figure() +ax = fig.add_subplot(111) +t = Transformer(ax) +show() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-21 21:08:55
|
Revision: 3979 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3979&view=rev Author: jdh2358 Date: 2007-10-21 14:08:53 -0700 (Sun, 21 Oct 2007) Log Message: ----------- rename skel Added Paths: ----------- trunk/py4science/examples/skel/glass_dots1_skel.py Removed Paths: ------------- trunk/py4science/examples/skel/glass_dots_skel.py Copied: trunk/py4science/examples/skel/glass_dots1_skel.py (from rev 3978, trunk/py4science/examples/skel/glass_dots_skel.py) =================================================================== --- trunk/py4science/examples/skel/glass_dots1_skel.py (rev 0) +++ trunk/py4science/examples/skel/glass_dots1_skel.py 2007-10-21 21:08:53 UTC (rev 3979) @@ -0,0 +1,77 @@ +""" +Moire patterns from random dot fields + +http://en.wikipedia.org/wiki/Moir%C3%A9_pattern + +See L. Glass. 'Moire effect from random dots' Nature 223, 578580 (1969). +""" +from numpy import cos, sin, pi, matrix +import numpy as npy +import numpy.linalg as linalg +from pylab import figure, show + +def csqrt(x): + """ + sqrt func that handles returns sqrt(x)j for x<0 + """ + XXX + +def myeig(M): + """ + compute eigen values and eigenvectors analytically + + Solve quadratic: + + lamba^2 - tau*lambda + Delta = 0 + + where tau = trace(M) and Delta = Determinant(M) + + """ + XXX + return lambda1, lambda2 + +# 2000 random x,y points in the interval[-0.5 ... 0.5] +X1 = XXX + +name = 'saddle' +#sx, sy, angle = XXX + +#name = 'center' +#sx, sy, angle = XXX + +#name = 'stable focus' # spiral +#sx, sy, angle = XXX + +name= 'spiral' +sx, sy, angle = XXX + +theta = angle * pi/180. # the rotation in radians + + +# the scaling matrix +# | sx 0 | +# | 0 sy | +S = XXX + +# the rotation matrix +# | cos(theta) -sin(theta) | +# | sin(theta) cos(theta) | +R = XXX + +# the transformation is the matrix product of the scaling and rotation +M = XXX + +# compute the eigenvalues using numpy linear algebra +vals, vecs = XXX +print 'numpy eigenvalues', vals + +# compare with the analytic values from myeig +avals = myeig(M) +print 'analytic eigenvalues', avals + +# transform X1 by the matrix M +X2 = XXX + +# plot the original x,y as green dots and the transformed x, y as red +# dots +show() Deleted: trunk/py4science/examples/skel/glass_dots_skel.py =================================================================== --- trunk/py4science/examples/skel/glass_dots_skel.py 2007-10-21 21:08:33 UTC (rev 3978) +++ trunk/py4science/examples/skel/glass_dots_skel.py 2007-10-21 21:08:53 UTC (rev 3979) @@ -1,77 +0,0 @@ -""" -Moire patterns from random dot fields - -http://en.wikipedia.org/wiki/Moir%C3%A9_pattern - -See L. Glass. 'Moire effect from random dots' Nature 223, 578580 (1969). -""" -from numpy import cos, sin, pi, matrix -import numpy as npy -import numpy.linalg as linalg -from pylab import figure, show - -def csqrt(x): - """ - sqrt func that handles returns sqrt(x)j for x<0 - """ - XXX - -def myeig(M): - """ - compute eigen values and eigenvectors analytically - - Solve quadratic: - - lamba^2 - tau*lambda + Delta = 0 - - where tau = trace(M) and Delta = Determinant(M) - - """ - XXX - return lambda1, lambda2 - -# 2000 random x,y points in the interval[-0.5 ... 0.5] -X1 = XXX - -name = 'saddle' -#sx, sy, angle = XXX - -#name = 'center' -#sx, sy, angle = XXX - -#name = 'stable focus' # spiral -#sx, sy, angle = XXX - -name= 'spiral' -sx, sy, angle = XXX - -theta = angle * pi/180. # the rotation in radians - - -# the scaling matrix -# | sx 0 | -# | 0 sy | -S = XXX - -# the rotation matrix -# | cos(theta) -sin(theta) | -# | sin(theta) cos(theta) | -R = XXX - -# the transformation is the matrix product of the scaling and rotation -M = XXX - -# compute the eigenvalues using numpy linear algebra -vals, vecs = XXX -print 'numpy eigenvalues', vals - -# compare with the analytic values from myeig -avals = myeig(M) -print 'analytic eigenvalues', avals - -# transform X1 by the matrix M -X2 = XXX - -# plot the original x,y as green dots and the transformed x, y as red -# dots -show() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-21 21:08:35
|
Revision: 3978 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3978&view=rev Author: jdh2358 Date: 2007-10-21 14:08:33 -0700 (Sun, 21 Oct 2007) Log Message: ----------- minor tweaks to glass dots Modified Paths: -------------- trunk/py4science/examples/glass_dots1.py trunk/py4science/examples/skel/glass_dots_skel.py Modified: trunk/py4science/examples/glass_dots1.py =================================================================== --- trunk/py4science/examples/glass_dots1.py 2007-10-21 20:57:54 UTC (rev 3977) +++ trunk/py4science/examples/glass_dots1.py 2007-10-21 21:08:33 UTC (rev 3978) @@ -42,16 +42,13 @@ X1 = matrix(npy.random.rand(2,2000))-0.5 name = 'saddle' -#sx, sy, angle = 1.05, 0.95, 0. +sx, sy, angle = 1.05, 0.95, 0. -#name = 'focus' -#sx, sy, angle = 1.05, 0.95, 2.6 - #name = 'center' #sx, sy, angle = 1., 1., 2.5 -name= 'spiral' -sx, sy, angle = 0.95, 0.95, 2.5 +#name= 'stable focus' # spiral +#sx, sy, angle = 0.95, 0.95, 2.5 theta = angle * pi/180. @@ -72,7 +69,7 @@ avals = myeig(M) print 'analytic eigenvalues', avals -# transform X by the matrix +# transform X1 by the matrix X2 = M*X1 # plot the original x,y as green dots and the transformed x, y as red Modified: trunk/py4science/examples/skel/glass_dots_skel.py =================================================================== --- trunk/py4science/examples/skel/glass_dots_skel.py 2007-10-21 20:57:54 UTC (rev 3977) +++ trunk/py4science/examples/skel/glass_dots_skel.py 2007-10-21 21:08:33 UTC (rev 3978) @@ -36,10 +36,10 @@ name = 'saddle' #sx, sy, angle = XXX -#name = 'focus' +#name = 'center' #sx, sy, angle = XXX -#name = 'center' +#name = 'stable focus' # spiral #sx, sy, angle = XXX name= 'spiral' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-21 20:57:56
|
Revision: 3977 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3977&view=rev Author: jdh2358 Date: 2007-10-21 13:57:54 -0700 (Sun, 21 Oct 2007) Log Message: ----------- added glass moire pattern example Added Paths: ----------- trunk/py4science/examples/glass_dots1.py trunk/py4science/examples/skel/glass_dots_skel.py trunk/py4science/workbook/fig/glass_dots1.eps trunk/py4science/workbook/fig/glass_dots1.png Added: trunk/py4science/examples/glass_dots1.py =================================================================== --- trunk/py4science/examples/glass_dots1.py (rev 0) +++ trunk/py4science/examples/glass_dots1.py 2007-10-21 20:57:54 UTC (rev 3977) @@ -0,0 +1,95 @@ +""" +Moire patterns from random dot fields + +http://en.wikipedia.org/wiki/Moir%C3%A9_pattern + +See L. Glass. 'Moire effect from random dots' Nature 223, 578580 (1969). +""" +from numpy import cos, sin, pi, matrix +import numpy as npy +import numpy.linalg as linalg +from pylab import figure, show + +def csqrt(x): + """ + sqrt func that handles returns sqrt(x)j for x<0 + """ + if x<0: return complex(0, npy.sqrt(abs(x))) + else: return npy.sqrt(x) + +def myeig(M): + """ + compute eigen values and eigenvectors analytically + + Solve quadratic: + + lamba^2 - tau*lambda + Delta = 0 + + where tau = trace(M) and Delta = Determinant(M) + + """ + + a,b = M[0,0], M[0,1] + c,d = M[1,0], M[1,1] + tau = a+d # the trace + delta = a*d-b*c # the determinant + + lambda1 = (tau + csqrt(tau**2 - 4*delta))/2. + lambda2 = (tau - csqrt(tau**2 - 4*delta))/2. + return lambda1, lambda2 + +# 2000 random x,y points in the interval[-0.5 ... 0.5] +X1 = matrix(npy.random.rand(2,2000))-0.5 + +name = 'saddle' +#sx, sy, angle = 1.05, 0.95, 0. + +#name = 'focus' +#sx, sy, angle = 1.05, 0.95, 2.6 + +#name = 'center' +#sx, sy, angle = 1., 1., 2.5 + +name= 'spiral' +sx, sy, angle = 0.95, 0.95, 2.5 + +theta = angle * pi/180. + + +S = matrix([[sx, 0], + [0, sy]]) + +R = matrix([[cos(theta), -sin(theta)], + [sin(theta), cos(theta)],]) + +M = S*R # rotate then stretch + +# compute the eigenvalues using numpy linear algebra +vals, vecs = linalg.eig(M) +print 'numpy eigenvalues', vals + +# compare with the analytic values from myeig +avals = myeig(M) +print 'analytic eigenvalues', avals + +# transform X by the matrix +X2 = M*X1 + +# plot the original x,y as green dots and the transformed x, y as red +# dots +fig = figure() +ax = fig.add_subplot(111) + +x1 = X1[0].flat +y1 = X1[1].flat +x2 = X2[0].flat +y2 = X2[1].flat + +ax = fig.add_subplot(111) +line1, line2 = ax.plot(x1, y1, 'go', x2, y2, 'ro', markersize=2) +ax.set_title(name) + + +fig.savefig('glass_dots1.png', dpi=100) +fig.savefig('glass_dots1.eps', dpi=100) +show() Added: trunk/py4science/examples/skel/glass_dots_skel.py =================================================================== --- trunk/py4science/examples/skel/glass_dots_skel.py (rev 0) +++ trunk/py4science/examples/skel/glass_dots_skel.py 2007-10-21 20:57:54 UTC (rev 3977) @@ -0,0 +1,77 @@ +""" +Moire patterns from random dot fields + +http://en.wikipedia.org/wiki/Moir%C3%A9_pattern + +See L. Glass. 'Moire effect from random dots' Nature 223, 578580 (1969). +""" +from numpy import cos, sin, pi, matrix +import numpy as npy +import numpy.linalg as linalg +from pylab import figure, show + +def csqrt(x): + """ + sqrt func that handles returns sqrt(x)j for x<0 + """ + XXX + +def myeig(M): + """ + compute eigen values and eigenvectors analytically + + Solve quadratic: + + lamba^2 - tau*lambda + Delta = 0 + + where tau = trace(M) and Delta = Determinant(M) + + """ + XXX + return lambda1, lambda2 + +# 2000 random x,y points in the interval[-0.5 ... 0.5] +X1 = XXX + +name = 'saddle' +#sx, sy, angle = XXX + +#name = 'focus' +#sx, sy, angle = XXX + +#name = 'center' +#sx, sy, angle = XXX + +name= 'spiral' +sx, sy, angle = XXX + +theta = angle * pi/180. # the rotation in radians + + +# the scaling matrix +# | sx 0 | +# | 0 sy | +S = XXX + +# the rotation matrix +# | cos(theta) -sin(theta) | +# | sin(theta) cos(theta) | +R = XXX + +# the transformation is the matrix product of the scaling and rotation +M = XXX + +# compute the eigenvalues using numpy linear algebra +vals, vecs = XXX +print 'numpy eigenvalues', vals + +# compare with the analytic values from myeig +avals = myeig(M) +print 'analytic eigenvalues', avals + +# transform X1 by the matrix M +X2 = XXX + +# plot the original x,y as green dots and the transformed x, y as red +# dots +show() Added: trunk/py4science/workbook/fig/glass_dots1.eps =================================================================== --- trunk/py4science/workbook/fig/glass_dots1.eps (rev 0) +++ trunk/py4science/workbook/fig/glass_dots1.eps 2007-10-21 20:57:54 UTC (rev 3977) @@ -0,0 +1,4719 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: glass_dots1.eps +%%Creator: matplotlib version 0.90.1, http://matplotlib.sourceforge.net/ +%%CreationDate: Sun Oct 21 15:51:47 2007 +%%Orientation: portrait +%%BoundingBox: 11 173 600 618 +%%EndComments +%%BeginProlog +/mpldict 7 dict def +mpldict begin +/m { moveto } bind def +/l { lineto } bind def +/r { rlineto } bind def +/box { +m +1 index 0 r +0 exch r +neg 0 r +closepath +} bind def +/clipbox { +box +clip +newpath +} bind def +/ellipse { +newpath +matrix currentmatrix 7 1 roll +translate +scale +0 0 1 5 3 roll arc +setmatrix +closepath +} bind def +%!PS-Adobe-3.0 Resource-Font +%%Title: Bitstream Vera Sans +%%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +%%Creator: Converted from TrueType by PPR +25 dict begin +/_d{bind def}bind def +/_m{moveto}_d +/_l{lineto}_d +/_cl{closepath eofill}_d +/_c{curveto}_d +/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d +/_e{exec}_d +/FontName /BitstreamVeraSans-Roman def +/PaintType 0 def +/FontMatrix[.001 0 0 .001 0 0]def +/FontBBox[-182 -235 1287 928]def +/FontType 3 def +/Encoding StandardEncoding def +/FontInfo 10 dict dup begin +/FamilyName (Bitstream Vera Sans) def +/FullName (Bitstream Vera Sans) def +/Notice (Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.) def +/Weight (Roman) def +/Version (Release 1.10) def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -213 def +/UnderlineThickness 143 def +end readonly def +/CharStrings 12 dict dup begin +/hyphen{361 0 49 234 312 314 _sc +49 314 _m +312 314 _l +312 234 _l +49 234 _l +49 314 _l +_cl}_d +/period{318 0 107 0 210 124 _sc +107 124 _m +210 124 _l +210 0 _l +107 0 _l +107 124 _l +_cl}_d +/zero{636 0 66 -13 570 742 _sc +318 664 _m +267 664 229 639 203 589 _c +177 539 165 464 165 364 _c +165 264 177 189 203 139 _c +229 89 267 64 318 64 _c +369 64 407 89 433 139 _c +458 189 471 264 471 364 _c +471 464 458 539 433 589 _c +407 639 369 664 318 664 _c +318 742 _m +399 742 461 709 505 645 _c +548 580 570 486 570 364 _c +570 241 548 147 505 83 _c +461 19 399 -13 318 -13 _c +236 -13 173 19 130 83 _c +87 147 66 241 66 364 _c +66 486 87 580 130 645 _c +173 709 236 742 318 742 _c +_cl}_d +/two{{636 0 73 0 536 742 _sc +192 83 _m +536 83 _l +536 0 _l +73 0 _l +73 83 _l +110 121 161 173 226 239 _c +290 304 331 346 348 365 _c +380 400 402 430 414 455 _c +426 479 433 504 433 528 _c +433 566 419 598 392 622 _c +365 646 330 659 286 659 _c +255 659 222 653 188 643 _c +154 632 117 616 78 594 _c +78 694 _l +118 710 155 722 189 730 _c +223 738 255 742 284 742 _c +359 742 419 723 464 685 _c +509 647 532 597 532 534 _c +532 504 526 475 515 449 _c +504 422 484 390 454 354 _c +446 344 420 317 376 272 _c +332 227 271 164 192 83 _c +_cl}_e}_d +/four{636 0 49 0 580 729 _sc +378 643 _m +129 254 _l +378 254 _l +378 643 _l +352 729 _m +476 729 _l +476 254 _l +580 254 _l +580 172 _l +476 172 _l +476 0 _l +378 0 _l +378 172 _l +49 172 _l +49 267 _l +352 729 _l +_cl}_d +/six{{636 0 70 -13 573 742 _sc +330 404 _m +286 404 251 388 225 358 _c +199 328 186 286 186 234 _c +186 181 199 139 225 109 _c +251 79 286 64 330 64 _c +374 64 409 79 435 109 _c +461 139 474 181 474 234 _c +474 286 461 328 435 358 _c +409 388 374 404 330 404 _c +526 713 _m +526 623 _l +501 635 476 644 451 650 _c +425 656 400 659 376 659 _c +310 659 260 637 226 593 _c +192 549 172 482 168 394 _c +187 422 211 444 240 459 _c +269 474 301 482 336 482 _c +409 482 467 459 509 415 _c +551 371 573 310 573 234 _c +573 159 550 99 506 54 _c +462 9 403 -13 330 -13 _c +246 -13 181 19 137 83 _c +92 147 70 241 70 364 _c +70 479 97 571 152 639 _c +206 707 280 742 372 742 _c +}_e{396 742 421 739 447 735 _c +472 730 498 723 526 713 _c +_cl}_e}_d +/a{{613 0 60 -13 522 560 _sc +343 275 _m +270 275 220 266 192 250 _c +164 233 150 205 150 165 _c +150 133 160 107 181 89 _c +202 70 231 61 267 61 _c +317 61 357 78 387 114 _c +417 149 432 196 432 255 _c +432 275 _l +343 275 _l +522 312 _m +522 0 _l +432 0 _l +432 83 _l +411 49 385 25 355 10 _c +325 -5 287 -13 243 -13 _c +187 -13 142 2 109 33 _c +76 64 60 106 60 159 _c +60 220 80 266 122 298 _c +163 329 224 345 306 345 _c +432 345 _l +432 354 _l +432 395 418 427 391 450 _c +364 472 326 484 277 484 _c +245 484 215 480 185 472 _c +155 464 127 453 100 439 _c +100 522 _l +}_e{132 534 164 544 195 550 _c +226 556 256 560 286 560 _c +365 560 424 539 463 498 _c +502 457 522 395 522 312 _c +_cl}_e}_d +/i{278 0 94 0 184 760 _sc +94 547 _m +184 547 _l +184 0 _l +94 0 _l +94 547 _l +94 760 _m +184 760 _l +184 646 _l +94 646 _l +94 760 _l +_cl}_d +/l{278 0 94 0 184 760 _sc +94 760 _m +184 760 _l +184 0 _l +94 0 _l +94 760 _l +_cl}_d +/p{{635 0 91 -207 580 560 _sc +181 82 _m +181 -207 _l +91 -207 _l +91 547 _l +181 547 _l +181 464 _l +199 496 223 520 252 536 _c +281 552 316 560 356 560 _c +422 560 476 533 518 481 _c +559 428 580 359 580 273 _c +580 187 559 117 518 65 _c +476 13 422 -13 356 -13 _c +316 -13 281 -5 252 10 _c +223 25 199 49 181 82 _c +487 273 _m +487 339 473 390 446 428 _c +418 466 381 485 334 485 _c +286 485 249 466 222 428 _c +194 390 181 339 181 273 _c +181 207 194 155 222 117 _c +249 79 286 61 334 61 _c +381 61 418 79 446 117 _c +473 155 487 207 487 273 _c +_cl}_e}_d +/r{411 0 91 0 411 560 _sc +411 463 _m +401 469 390 473 378 476 _c +366 478 353 480 339 480 _c +288 480 249 463 222 430 _c +194 397 181 350 181 288 _c +181 0 _l +91 0 _l +91 547 _l +181 547 _l +181 462 _l +199 495 224 520 254 536 _c +284 552 321 560 365 560 _c +371 560 378 559 386 559 _c +393 558 401 557 411 555 _c +411 463 _l +_cl}_d +/s{{521 0 54 -13 472 560 _sc +443 531 _m +443 446 _l +417 458 391 468 364 475 _c +336 481 308 485 279 485 _c +234 485 200 478 178 464 _c +156 450 145 430 145 403 _c +145 382 153 366 169 354 _c +185 342 217 330 265 320 _c +296 313 _l +360 299 405 279 432 255 _c +458 230 472 195 472 151 _c +472 100 452 60 412 31 _c +372 1 316 -13 246 -13 _c +216 -13 186 -10 154 -5 _c +122 0 89 8 54 20 _c +54 113 _l +87 95 120 82 152 74 _c +184 65 216 61 248 61 _c +290 61 323 68 346 82 _c +368 96 380 117 380 144 _c +380 168 371 187 355 200 _c +339 213 303 226 247 238 _c +216 245 _l +160 257 119 275 95 299 _c +70 323 58 356 58 399 _c +58 450 76 490 112 518 _c +148 546 200 560 268 560 _c +}_e{301 560 332 557 362 552 _c +391 547 418 540 443 531 _c +_cl}_e}_d +end readonly def + +/BuildGlyph + {exch begin + CharStrings exch + 2 copy known not{pop /.notdef}if + true 3 1 roll get exec + end}_d + +/BuildChar { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec +}_d + +FontName currentdict end definefont pop +%%EOF +end +%%EndProlog +mpldict begin +11.7 173.7 translate +588.6 444.6 0 0 clipbox +gsave +1.000 setgray +1.000 setlinewidth +0 setlinejoin +2 setlinecap +[] 0 setdash +0 0 m +0 444.6 l +588.6 444.6 l +588.6 0 l +closepath +gsave +fill +grestore +stroke +grestore +gsave +0.000 setgray +73.575 44.46 m +73.575 400.14 l +529.74 400.14 l +529.74 44.46 l +closepath +gsave +1.000 setgray +fill +grestore +stroke +grestore +0.500 setlinewidth +0 setlinecap +gsave +456.165 355.68 73.575 44.46 clipbox +/o { gsave +newpath +translate +1 0 m +0.992115 0.125333 l +0.968583 0.24869 l +0.929776 0.368125 l +0.876307 0.481754 l +0.809017 0.587785 l +0.728969 0.684547 l +0.637424 0.770513 l +0.535827 0.844328 l +0.425779 0.904827 l +0.309017 0.951057 l +0.187381 0.982287 l +0.0627905 0.998027 l +-0.0627905 0.998027 l +-0.187381 0.982287 l +-0.309017 0.951057 l +-0.425779 0.904827 l +-0.535827 0.844328 l +-0.637424 0.770513 l +-0.728969 0.684547 l +-0.809017 0.587785 l +-0.876307 0.481754 l +-0.929776 0.368125 l +-0.968583 0.24869 l +-0.992115 0.125333 l +-1 -3.21625e-16 l +-0.992115 -0.125333 l +-0.968583 -0.24869 l +-0.929776 -0.368125 l +-0.876307 -0.481754 l +-0.809017 -0.587785 l +-0.728969 -0.684547 l +-0.637424 -0.770513 l +-0.535827 -0.844328 l +-0.425779 -0.904827 l +-0.309017 -0.951057 l +-0.187381 -0.982287 l +-0.0627905 -0.998027 l +0.0627905 -0.998027 l +0.187381 -0.982287 l +0.309017 -0.951057 l +0.425779 -0.904827 l +0.535827 -0.844328 l +0.637424 -0.770513 l +0.728969 -0.684547 l +0.809017 -0.587785 l +0.876307 -0.481754 l +0.929776 -0.368125 l +0.968583 -0.24869 l +0.992115 -0.125333 l +closepath +gsave +0.000 0.500 0.000 setrgbcolor +fill +grestore +stroke +grestore } bind def +138.872 320.348 o +181.354 288.083 o +357.964 322.431 o +202.996 278.417 o +479.1 277 o +260.058 194.004 o +234.101 204.196 o +410.704 284.956 o +199.64 248.815 o +134.449 296.136 o +330.037 298.035 o +344.126 345.135 o +425.543 352.504 o +415.221 304.834 o +197.037 276.79 o +170.12 254.009 o +190.512 250.384 o +324.695 186.827 o +432.329 245.359 o +336.339 125.487 o +287.791 89.5204 o +381.68 184.249 o +230.466 295.632 o +305.554 357.729 o +249.578 281.911 o +321.573 358.13 o +350.908 176.412 o +257.443 213.254 o +450.114 165.748 o +408.095 324.504 o +431.163 227.839 o +292.916 130.22 o +468.11 283.741 o +172.187 290.341 o +194.8 238.493 o +177.859 363.466 o +430.112 76.7245 o +201.049 181.351 o +440.312 241.362 o +207.565 190.797 o +339.893 261.469 o +454.246 207.628 o +352.919 105.208 o +116.475 107.987 o +395.899 203.544 o +180.572 294.822 o +300.245 74.522 o +479.409 259.564 o +372.722 87.9586 o +385.381 176.45 o +143.08 185.238 o +317.094 266.568 o +263.482 142.769 o +398.103 241.449 o +365.896 94.5178 o +237.9 180.849 o +333.754 280.745 o +207.62 243.104 o +118.806 295.197 o +126.636 157.277 o +218.643 106.715 o +254.875 118.286 o +147.65 195.146 o +225.248 74.5246 o +355.066 268.333 o +290.841 344.053 o +403.564 288.753 o +258.632 169.655 o +131.654 215.147 o +390.072 276 o +248.767 76.1061 o +341.527 102.451 o +308.153 362.83 o +389.696 307.53 o +341.991 320.747 o +145.6 310.19 o +458.027 139.011 o +156.005 334.202 o +199.174 175.718 o +231.551 350.143 o +419.825 158.443 o +296.386 91.4108 o +128.923 366.976 o +353.954 191.492 o +241.684 135.018 o +363.991 339.889 o +126.512 362.686 o +199.101 103.509 o +484.743 363.956 o +305.536 131.847 o +119.381 348.64 o +416.115 104.531 o +286.516 309.527 o +199.992 222.584 o +355.444 144.896 o +427.214 234.784 o +168.757 329.679 o +455.83 88.4333 o +285.905 172.676 o +156.026 164.155 o +188.071 273.666 o +187.916 136.562 o +407.909 323.552 o +135.324 258.64 o +287.746 278.231 o +207.449 179.942 o +421.334 305.842 o +314.663 190.183 o +351.187 213.08 o +176.022 282.36 o +138.019 327.616 o +169.827 96.2728 o +464.91 121.37 o +373.796 366.374 o +145.208 109.952 o +175.089 194.515 o +294.383 338.347 o +249.915 156.283 o +119.525 111.341 o +244.53 103.544 o +409.808 292.664 o +308.461 359.93 o +287.776 348.745 o +173.773 346.218 o +425.432 186.799 o +254.747 134.214 o +256.286 180.301 o +419.538 85.9271 o +250.207 178.698 o +300.684 87.3235 o +131.184 257.7 o +192.259 161.9 o +456.53 166.659 o +316.836 86.7519 o +407.628 106.727 o +190.232 273.035 o +312.55 146.774 o +428.198 204 o +368.553 150.419 o +278.036 191.729 o +224.856 121.302 o +150.41 315.313 o +260.425 231.498 o +309.768 184.187 o +304.958 153.568 o +112.915 276.316 o +309.354 177.085 o +336.929 167.493 o +180.567 223.19 o +229.777 297.53 o +455.815 283.428 o +421.887 290.296 o +446.669 119.702 o +487.66 108.829 o +182.089 346.473 o +145.699 137.244 o +192.039 250.998 o +398.202 216.872 o +231.752 364.519 o +240.127 90.9055 o +217.391 202.029 o +392.399 239.735 o +437.822 77.0468 o +224.397 276.118 o +279.636 363.825 o +193.176 175.589 o +363.001 101.526 o +274.929 209.605 o +272.618 205.443 o +300.278 165.258 o +337.662 79.5305 o +187.498 184.977 o +228.513 106.44 o +478.56 252.935 o +329.047 325.459 o +359.016 176.736 o +359.717 274.494 o +332.58 255.906 o +491.435 77.3955 o +114.727 254.287 o +402.668 333.981 o +194.344 121.25 o +206.262 295.478 o +282.273 106.178 o +389.608 116.418 o +126.291 207.928 o +283.15 346.093 o +467.219 123.922 o +421.747 300.785 o +314.434 291.814 o +390.887 238.758 o +462.319 202.901 o +202.757 79.7886 o +400.616 337.799 o +212.296 155.408 o +312.638 328.75 o +117.786 282.263 o +119.206 245.575 o +476.181 164.201 o +235.461 316.76 o +405.659 189.849 o +146.85 351.285 o +196.558 148.499 o +116.967 250.082 o +179.907 251.714 o +294.156 184.762 o +401.435 333.759 o +311.458 158.996 o +136.051 229.14 o +209.875 81.7894 o +361.768 271.649 o +483.416 366.668 o +481.696 140.925 o +417.553 108.185 o +375.311 356.113 o +387.829 105.223 o +116.154 268.893 o +467.238 125.51 o +267.525 293.436 o +304.527 340.005 o +122.639 171.326 o +190.546 350.555 o +469.441 191.214 o +304.82 242.737 o +122.584 228.077 o +132.956 175.495 o +279.462 218.933 o +164.331 250.829 o +341.961 98.307 o +307.81 281.154 o +277.775 189.146 o +417.441 132.333 o +199.899 155.381 o +443.963 91.6086 o +473.56 354.32 o +387.867 278.511 o +421.998 298.133 o +150.223 288.239 o +184.043 262.236 o +272.41 279.249 o +461.759 368.618 o +150.902 334.741 o +400.53 354.612 o +242.094 182.986 o +308.826 215.268 o +376.791 289.966 o +122.726 250.887 o +405.98 98.6444 o +214.821 241.789 o +309.771 112.835 o +470.463 346.819 o +279.301 249.964 o +430.109 250.444 o +301.819 328.806 o +298.424 76.3392 o +331.973 248.671 o +249.522 146.086 o +175.401 99.2822 o +228.554 159.894 o +175.303 234.465 o +346.902 342.171 o +128.284 299.681 o +319.009 259.775 o +446.993 135.097 o +336.261 297.841 o +387.981 76.0156 o +190.093 284.984 o +117.289 101.364 o +177.671 156.473 o +179.57 295.492 o +176.206 170.879 o +129.225 252.213 o +260.081 331.309 o +331.658 179.715 o +227.209 369.702 o +197.356 110.128 o +464.369 332.035 o +333.249 368.434 o +126.467 369.582 o +466.127 261.302 o +147.438 208.562 o +122.22 114.402 o +348.608 293.847 o +112.082 130.39 o +476.315 255.352 o +195.357 207.548 o +227.454 227.203 o +476.759 240.468 o +422.782 249.771 o +254.722 228.519 o +453.002 135.992 o +265.675 178.509 o +246.471 317.55 o +471.567 317.835 o +375.672 264.932 o +274.95 333.545 o +168.689 148.823 o +420.695 280.624 o +241.393 149.525 o +404.501 138.059 o +199.358 195.928 o +138.249 117.846 o +364.454 139.238 o +431.845 264.249 o +316.338 129.832 o +163.309 237.242 o +172.075 146.488 o +439.508 115.453 o +278.259 353.724 o +210.058 334.132 o +202.302 166.265 o +158.446 356.173 o +285.194 106.091 o +248.611 341.771 o +489.604 322.867 o +456.071 312.406 o +464.79 119.087 o +425.438 256.533 o +439.461 369.864 o +282.93 346.27 o +251.5 296.727 o +457.394 109.83 o +384.418 133.061 o +118.674 234.819 o +293.419 314.397 o +170.163 212.113 o +404.43 118.935 o +475.415 341.091 o +376.482 158.784 o +126.798 114.33 o +256.396 254.601 o +426.809 321.956 o +441.437 297.873 o +161.82 234.899 o +188.165 267.244 o +255.668 137.541 o +160.94 191.408 o +175.552 150.902 o +297.53 218.974 o +233.205 185.763 o +473.534 155.634 o +244.774 316.598 o +420.461 304.322 o +345.5 217.364 o +485.143 325.216 o +426.435 125.277 o +201.243 235.749 o +360.772 303.009 o +446.355 239.652 o +211.585 80.2485 o +336.016 274.146 o +342.914 258.117 o +213.597 149.515 o +231.369 259.409 o +229.053 225.945 o +370.259 177.794 o +112.131 298.327 o +385.197 362.949 o +388.187 223.292 o +490.034 205.446 o +252.65 253.679 o +468.172 165.86 o +147.742 229.936 o +419.906 274.743 o +467.227 282.59 o +127.635 223.748 o +146.136 273.682 o +170.22 167.226 o +163.095 367.957 o +208.991 115.787 o +359.526 236.957 o +422.731 295.167 o +287.769 285.945 o +319.457 182.818 o +208.088 177.499 o +388.5 233.284 o +186.328 144.152 o +349.178 234.061 o +191.316 356.356 o +479.372 96.7753 o +300.029 267.359 o +488.623 284.206 o +177.986 253.078 o +456.294 179.236 o +311.016 178.261 o +264.545 337.775 o +318.581 161.266 o +113.048 359.916 o +214.652 147.24 o +279.008 137.104 o +382.272 134.789 o +426.872 185.952 o +426.592 267.595 o +405.404 84.9546 o +131.186 135.731 o +343.325 255.998 o +396.665 172.218 o +434.62 188.597 o +194.766 283.685 o +459.152 234.457 o +323.366 220.7 o +314.503 76.0085 o +120.381 329.056 o +196.149 358.486 o +323.186 370.27 o +369.75 193.826 o +316.729 216.584 o +414.292 149.839 o +341.67 145.787 o +275.993 162.224 o +299.881 358.158 o +270.493 303.614 o +232.2 188.779 o +326.502 206.428 o +319.078 130.5 o +424.659 253.071 o +445.607 214.259 o +233.549 188.714 o +252.863 202.873 o +206.441 187.757 o +292.182 96.865 o +199.952 312.41 o +339.094 138.393 o +271.671 363.771 o +483.17 89.8751 o +379.847 183.692 o +388.276 306.95 o +407.382 152.418 o +260.009 204.048 o +450.009 77.5324 o +251.32 286.543 o +466.056 203.204 o +429.98 297.422 o +451.667 248.032 o +151.126 94.5473 o +241.892 340.781 o +346.822 81.9414 o +146.017 206.552 o +329.07 190.48 o +437.428 306.507 o +160.391 97.9028 o +191.69 308.678 o +205.407 264.776 o +432.084 322.55 o +375.411 192.394 o +386.484 269.544 o +185.603 101.241 o +156.272 117.931 o +329.991 98.3565 o +471.725 312.131 o +411.405 193.621 o +347.449 332.048 o +323.722 301.559 o +231.999 110.582 o +200.458 253.133 o +168.099 158.044 o +486.024 333.549 o +126.05 206.857 o +114.305 224.244 o +284.349 302.934 o +142.903 75.4316 o +317.773 350.971 o +146.487 295.744 o +453.998 187.824 o +339.836 234.517 o +425.8 203.241 o +219.678 126.347 o +197.342 229.044 o +329.781 139.385 o +485.509 332.31 o +326.141 256.716 o +150.478 191.463 o +220.661 143.763 o +117.456 231.471 o +418.767 229.043 o +469.284 279.977 o +356.521 336.279 o +404.954 299.058 o +129.752 266.034 o +167.307 284.833 o +379.813 103.665 o +197.774 314.785 o +172.341 127.62 o +324.304 212.454 o +355.613 274.041 o +472.143 110.404 o +200.519 103.87 o +123.023 228.516 o +157.332 267.395 o +303.247 148.734 o +317.328 261.994 o +275.182 314.317 o +249.326 153.465 o +463.299 251.449 o +250.225 165.016 o +437.22 117.623 o +436.544 323.89 o +212.403 149.415 o +145.903 88.3748 o +265.877 186.575 o +209.452 117.661 o +209.452 117.661 o +262.591 220.262 o +126.206 87.5087 o +207.374 82.8823 o +459.273 209.611 o +274.284 215.536 o +119.198 193.967 o +319.686 101.089 o +243.833 331.438 o +184.327 130.54 o +228.309 156.197 o +161.58 183.569 o +277.253 225.941 o +385.147 311.286 o +239.987 318.041 o +304.848 127.524 o +381.714 293.54 o +315.335 321.244 o +300.244 92.9418 o +116.06 242.752 o +425.72 79.8241 o +154.998 331.116 o +265.339 237.098 o +345.449 331.946 o +271.478 113.69 o +225.288 203.971 o +466.438 255.239 o +127.979 122.105 o +123.557 244.453 o +334.649 98.4301 o +470.524 159.202 o +221.416 327.764 o +302.744 306.569 o +347.35 370.113 o +420.085 282.824 o +189.848 181.249 o +322.098 159.457 o +326.839 256.731 o +276.552 236.102 o +485.957 357.223 o +464.292 250.328 o +123.079 264.788 o +262.148 310.214 o +454.816 103.646 o +457.076 345.077 o +217.586 265.513 o +381.333 94.1881 o +254.763 126.501 o +328.943 211.738 o +279.842 235.05 o +448.752 142.956 o +287.251 360.986 o +302.827 160.105 o +208.751 210.961 o +242.68 99.4743 o +377.223 245.872 o +292.601 123.931 o +491.541 243.084 o +225.37 91.3451 o +462.242 298.244 o +336.902 136.076 o +185.049 246.218 o +205.497 169.403 o +164.792 254.569 o +219.508 324.853 o +240.776 166.459 o +353.514 207.892 o +221.089 91.1437 o +337.128 205.989 o +167.607 370.225 o +395.301 328.821 o +173.856 228.073 o +263.982 153.956 o +476.128 158.786 o +326.157 323.651 o +348.227 110.074 o +472.657 192.951 o +212.006 102.889 o +222.094 298.664 o +125.434 74.5151 o +436.449 128.176 o +355.465 231.62 o +297.807 91.6613 o +461.726 283.76 o +334.445 326.366 o +220.797 141.381 o +375.034 136.138 o +272.121 288.651 o +285 355.465 o +326.257 304.117 o +357.178 286.842 o +386.798 274.605 o +336.801 245.333 o +330.22 91.4168 o +450.264 257.51 o +486.517 268.173 o +327.665 281.828 o +297.565 220.59 o +281.859 197.172 o +451.466 152.291 o +251.104 162.593 o +427.846 241.001 o +246.731 135.993 o +177.908 333.232 o +377.003 265.604 o +235.095 193.156 o +192.608 88.3428 o +439.761 249.946 o +470.617 182.678 o +172.077 268.477 o +165.904 201.147 o +287.379 175.569 o +184.022 118.105 o +249.374 320.284 o +376.145 309.887 o +365.245 143.057 o +198.846 134.505 o +341.165 368.199 o +188.346 147.785 o +278.043 267.894 o +124.597 222.114 o +185.488 119.102 o +161.879 87.5924 o +452.444 306.578 o +198.437 203.248 o +302.604 352.444 o +425.461 202.834 o +219.247 172.592 o +239.708 131.357 o +359.21 166.85 o +135.084 130.122 o +263.029 203.495 o +341.101 341.379 o +484.162 174.977 o +237.854 277.199 o +390.883 74.6849 o +256.827 221.996 o +442.711 197.518 o +305.619 191.565 o +200.31 264.455 o +316.027 117.921 o +484.668 118.798 o +120.803 75.0655 o +357.17 112.013 o +182.192 174.212 o +462.279 174.348 o +118.207 117.31 o +165.791 112.013 o +419.604 246.714 o +255.534 305.299 o +223.828 298.405 o +214.932 341.14 o +404.503 235.041 o +247.952 368.14 o +423.445 280.724 o +313.817 292.171 o +180.267 333.95 o +421.12 356.534 o +304.003 127.154 o +287.581 153.024 o +472.41 94.7735 o +146.653 271.935 o +341.174 248.123 o +206.522 94.76 o +213.061 146.064 o +397.491 99.0448 o +473.672 296.444 o +199.147 96.3443 o +461.825 249.601 o +378.72 279.374 o +137.275 325.583 o +330.202 318.84 o +189.58 101.269 o +347.169 116.202 o +226.231 112.9 o +127.691 232.846 o +448.114 207.306 o +427.888 95.6066 o +298.996 138.184 o +177.258 227.673 o +340.498 157.921 o +392.048 337.841 o +138.916 238.515 o +241.33 214.351 o +462.051 201.482 o +214.546 146.194 o +469.628 334.673 o +136.906 152.197 o +161.445 186.556 o +397.279 364.709 o +112.744 137.61 o +297.888 122.822 o +226.216 235.284 o +308.253 124.639 o +331.04 291.399 o +448.281 119.13 o +307.754 242.104 o +180.866 187.577 o +329.523 91.0822 o +355.427 106.784 o +246.386 305.307 o +427.444 269.358 o +201.551 267.456 o +219.501 96.7771 o +470.982 303.996 o +152.923 309.043 o +249.903 186.509 o +122.773 98.7548 o +306.934 132.89 o +429.148 220.57 o +471.389 104.551 o +326.948 215.22 o +142.076 282.781 o +220.74 329.318 o +310.728 81.463 o +155.519 224.173 o +280.518 95.2028 o +428.439 322.552 o +245.495 268.051 o +123.142 285.316 o +228.955 185.923 o +151.552 194.478 o +284.897 303.773 o +115.64 308.694 o +197.563 190.69 o +385.377 137.499 o +163.257 368.599 o +147.488 302.78 o +466.302 189.63 o +158.522 357.538 o +340.232 211.745 o +238.959 187.842 o +195.198 225.206 o +266.295 226.52 o +338.931 194.137 o +286.844 313.444 o +123.976 129.878 o +112.535 326.028 o +136.933 181.161 o +327.827 200.662 o +240.974 275.35 o +485.102 223.927 o +278.836 241.064 o +195.593 86.3321 o +343.915 226.532 o +326.033 77.6533 o +185.821 140.726 o +451.66 356.774 o +471.059 338.89 o +481.747 251.686 o +287.385 120.691 o +289.57 116.179 o +228.758 207.552 o +165.8 286.13 o +265.118 159.587 o +328.086 362.39 o +247.918 123.576 o +352.641 91.9426 o +439.844 147.201 o +143.116 102.545 o +470.171 329.396 o +190.675 95.5264 o +473.536 144.819 o +333.693 113.015 o +432.968 85.527 o +379.426 81.7622 o +387.507 319.292 o +178.664 198.677 o +267.542 264.484 o +340.919 253.008 o +356.65 309.005 o +326.206 342.744 o +212.952 313.491 o +213.819 141.78 o +363.025 108.076 o +249.005 269.242 o +405.377 346.644 o +240.38 236.501 o +161.788 217.861 o +223.97 218.424 o +263.242 207.594 o +144.606 326.233 o +345.948 178.2 o +174.699 367.85 o +205.278 139.698 o +352.064 317.67 o +239.632 330.922 o +230.785 232.449 o +218.874 145.831 o +283.62 325.524 o +294.351 292.526 o +410.915 331.606 o +405.5 138.956 o +465.853 330.204 o +360.469 122.693 o +473.741 160.765 o +172.641 189.137 o +383.933 88.3344 o +211.338 201.8 o +192.466 329.209 o +303.869 290.361 o +211.287 137.987 o +236.702 132.451 o +290.084 133.841 o +462.477 215.11 o +297.687 291.864 o +478.869 95.3053 o +455.169 101.553 o +312.954 339.831 o +176.85 227.521 o +300.725 349.222 o +300.367 99.3729 o +130.904 319.089 o +412.904 171.574 o +362.817 144.547 o +301.785 141.68 o +291.47 178.912 o +321.632 154.375 o +254.182 246.577 o +451.523 185.495 o +451.067 182.018 o +449.112 268.544 o +208.569 329.019 o +432.825 116.606 o +468.412 261.828 o +339.374 313.676 o +184.972 163.393 o +125.342 356.719 o +204.323 276.126 o +399.439 340.84 o +255.953 286.988 o +344.723 201.842 o +447.254 178.187 o +138.24 365.53 o +388.642 210.858 o +331.833 237.443 o +395.871 365.135 o +267.862 132.264 o +469.069 142.773 o +295.811 214.643 o +479.962 249.584 o +453.643 273.34 o +348.186 238.763 o +401.619 195.618 o +476.082 184.478 o +398.943 236.479 o +302.748 286.303 o +348.316 296.573 o +458.867 248.343 o +460.914 209.172 o +257.481 156.686 o +324.111 282.608 o +402.448 127.687 o +472.839 114.649 o +461.882 130.3 o +416.763 278.834 o +407.168 347.513 o +121.553 311.21 o +282.579 120.951 o +201.005 350.103 o +218.913 114.12 o +484.928 247.951 o +340.118 95.8858 o +183.713 364.322 o +480.709 179.5 o +336.987 178.97 o +256.437 76.911 o +198.532 351.991 o +405.908 366.991 o +222.633 261.06 o +450.787 88.5983 o +341.629 164.589 o +483.808 317.428 o +133.411 177.218 o +113.785 292.221 o +182.681 286.221 o +281.047 257.139 o +171.391 88.9033 o +311.44 258.558 o +269.54 283.723 o +257.826 129.656 o +279.093 83.72 o +140.71 254.831 o +217.489 80.4373 o +376.069 157.762 o +324.871 170.869 o +247.499 286.086 o +235.729 278.737 o +174.419 170.063 o +348.297 210.958 o +204.858 326.267 o +406.743 343.877 o +270.909 278.989 o +339.439 160.776 o +248.943 312.775 o +226.529 282.485 o +149.004 260.838 o +146.189 322.394 o +188.456 197.232 o +482.904 288.155 o +405.356 102.254 o +336.958 95.8941 o +301.773 317.607 o +436.905 101.889 o +377.844 135.755 o +375.728 329.221 o +375.623 324.795 o +288.715 182.255 o +484.533 188.424 o +357.602 113.142 o +367.87 240.278 o +465.576 205.013 o +393.843 268.567 o +251.895 137.167 o +354.533 330.311 o +402.986 278.187 o +197.738 96.4223 o +221.711 214.719 o +174.156 186.916 o +305.664 181.281 o +343.263 271.617 o +260.854 83.7153 o +272.557 241.097 o +135.784 276.112 o +218.485 326.944 o +204.853 150.586 o +170.578 153.642 o +384.244 210.049 o +282.37 312.351 o +254.859 203.903 o +485.847 248.538 o +463.762 323.685 o +182.079 87.2553 o +167.149 245.019 o +186.408 187.366 o +267.518 104.609 o +428.962 283.088 o +474.401 342.905 o +254.625 227.442 o +130.771 160.608 o +182.769 108.261 o +463.223 225.205 o +280.82 327.489 o +213.009 170.446 o +339.525 268.306 o +255.888 112.293 o +397.823 302.237 o +240.22 210.837 o +408.251 314.152 o +377.336 178.246 o +311.943 163.464 o +364.679 85.1074 o +333.158 142.482 o +374.703 113.199 o +183.361 100.464 o +321.021 243.288 o +290.025 82.11 o +208.264 285.77 o +336.646 125.747 o +222.724 139.244 o +315.949 255.978 o +275.164 235.814 o +186.206 246.296 o +113.208 347.606 o +414.054 206.685 o +169.448 253.647 o +476.664 92.9164 o +461.366 353.304 o +311.439 147.096 o +230.029 167.854 o +321.203 103.146 o +465.61 91.7564 o +379.839 104.974 o +150.244 143.995 o +349.267 188.331 o +111.904 259.111 o +340.881 152.435 o +157.774 362.801 o +358.848 316.66 o +139.902 286.125 o +115.404 228.927 o +271.113 220.826 o +428.353 193.197 o +268.255 108.389 o +139.834 101.412 o +151.952 159.081 o +274.748 119.762 o +431.088 325.418 o +415.007 310.416 o +481.51 324.235 o +428.838 346.782 o +116.86 150.312 o +259.881 93.37 o +167.958 208.889 o +408.653 192.334 o +257.879 216.837 o +169.338 148.057 o +317.02 214.097 o +289.861 369.658 o +333.189 338.391 o +449.042 310.993 o +449.042 310.993 o +230.071 327.532 o +169.765 192.02 o +152.408 74.8528 o +125.671 209.888 o +145.095 184.249 o +187.01 362.025 o +471.71 80.365 o +360.921 274.085 o +431.609 249.018 o +448.272 233.457 o +240.971 91.2614 o +467.904 293.456 o +126.199 96.6715 o +276.015 249.69 o +223.132 255.028 o +115.036 234.064 o +305.187 329.47 o +338.585 201.779 o +481.048 337.152 o +123.308 138.297 o +164.318 77.0981 o +306.436 111.115 o +191.305 368.988 o +231.544 97.6631 o +465.676 186.379 o +238.549 336.432 o +344.374 331.995 o +137.167 250.581 o +159.745 217.67 o +127.543 85.1101 o +428.211 250.176 o +346.652 358.055 o +293.293 282.373 o +222.459 330.461 o +222.479 217.724 o +205.617 269.194 o +318.476 98.8214 o +244.36 190.44 o +469.092 297.91 o +185.248 331.118 o +431.148 247.766 o +260.834 354.222 o +297.88 218.459 o +116.595 319.367 o +247.371 156.208 o +201.1 313.175 o +214.661 150.876 o +352.452 178.311 o +214.894 244.549 o +138.527 108.885 o +397.018 351.134 o +325.674 270.495 o +377.628 358.197 o +121.311 89.7141 o +131.22 136.061 o +257.758 196.95 o +394.862 135.851 o +185.004 338.204 o +164.733 82.145 o +460.033 147.389 o +232.819 83.898 o +361.064 221.258 o +355.07 208.59 o +324.129 189.879 o +447.268 332.942 o +160.083 194.53 o +174.6 295.516 o +114.192 231.4 o +480.986 125.748 o +461.1 183.677 o +320.243 259.395 o +366.682 226.23 o +116.961 263.477 o +135.063 176.121 o +337.979 306.837 o +161.164 134.644 o +255.149 89.4746 o +463.592 316.335 o +337.698 254.069 o +402.458 179.217 o +179.425 354.039 o +146 246.154 o +411.529 303.016 o +139.19 314.984 o +453.351 222.71 o +190.951 246.933 o +140.153 121.322 o +127.02 238.223 o +148.394 216.051 o +140.926 100.712 o +270.64 294.19 o +482.843 308.648 o +122.967 192.656 o +156.16 287.6 o +242.226 276.291 o +181.986 256.224 o +471.739 237.244 o +113.295 289.592 o +373.492 268.011 o +412.194 291.41 o +288.023 343.826 o +237.823 297.31 o +224.79 277.375 o +146.545 116.74 o +141.695 313.398 o +353.695 155.367 o +326.418 215.387 o +369.05 134.421 o +451.351 208.43 o +287.103 290.488 o +247.864 178.706 o +260.613 339.631 o +259.287 172.083 o +377.414 304.321 o +173.679 86.2304 o +136.911 176.166 o +470.54 168.157 o +347.677 132.329 o +178.442 114.751 o +280.344 219.067 o +376.335 269.533 o +351.856 366.87 o +313.373 156.965 o +302.696 206.567 o +305.98 329.823 o +197.215 222.556 o +490.767 224.008 o +173.796 244.504 o +267.566 309.695 o +398.032 98.1237 o +393.342 293.743 o +466.145 138.194 o +225.348 117.937 o +411.378 176.032 o +453.386 206.354 o +342.76 239.1 o +340.046 127.226 o +338.268 154.736 o +444.052 310.66 o +120.753 360.497 o +143.419 364.422 o +457.459 354.063 o +174.012 117.993 o +339.353 253.843 o +363.07 100.236 o +367.39 362.519 o +227.587 125.22 o +367.894 282.953 o +145.445 269.803 o +112.025 272.013 o +257.6 309.425 o +151.151 223.95 o +324.483 182.249 o +173.436 191.799 o +348.194 177.171 o +257.222 166.54 o +269.928 278.997 o +134.974 343.631 o +440.307 284.848 o +436 295.309 o +270.134 245.566 o +467.14 326.694 o +226.08 341.162 o +112.516 229.885 o +401.16 114.882 o +142.252 117.857 o +187.772 109.633 o +162.944 78.3937 o +257.718 97.5874 o +362.218 94.1442 o +353.182 181.177 o +259.491 196.301 o +161.084 291.397 o +219.517 91.2703 o +328.784 325.283 o +411.171 215.068 o +440.083 366.906 o +304.35 278.739 o +234.154 296.194 o +195.219 316.551 o +427.112 166.145 o +113.656 206.854 o +278.964 333.99 o +120.5 84.9609 o +179.65 362.181 o +369.498 242.068 o +126.99 302.654 o +469.435 148.485 o +309.753 181.316 o +259.454 296.58 o +242.419 329.716 o +282.757 330.124 o +374.876 124.03 o +457 318.452 o +447.827 222.977 o +125.687 312.766 o +389.29 169.921 o +192.098 251.358 o +452.88 323.345 o +454.384 114.662 o +277.087 96.7285 o +219.28 83.3024 o +452.739 301.539 o +241.485 193.11 o +304.592 268.569 o +391.098 210.573 o +460.222 253.193 o +423.704 366.478 o +320.354 82.977 o +374.081 118.531 o +117.336 245.092 o +374.885 259.618 o +490.216 244.77 o +135.865 77.6026 o +459.177 164.219 o +391.229 286.068 o +442.762 321.656 o +147.608 236.146 o +148.759 210.102 o +228.081 336.311 o +421.626 233.859 o +168.724 299.257 o +491.114 350.003 o +457.568 271.968 o +177.364 335.23 o +433.182 128.464 o +249.708 347.092 o +419.613 117.545 o +239.424 318.832 o +285.189 150.4 o +321.017 213.57 o +322.948 368.425 o +196.271 214.703 o +367.057 175.306 o +242.488 367.207 o +296.755 90.0569 o +448.867 127.242 o +364.823 186.115 o +326.693 123.348 o +312.984 184.891 o +260.971 120.38 o +159.206 148.363 o +245.126 177.574 o +470.898 257.794 o +170.009 269.782 o +415.918 357.153 o +396.386 249.562 o +315.877 368.729 o +335.352 81.9932 o +465.122 81.3471 o +304.285 352.915 o +364.221 116.467 o +290.689 288.663 o +441.549 324.914 o +302.139 248.372 o +400.541 284.378 o +225.174 81.0732 o +456.738 285.721 o +286.151 108.038 o +214.653 220.49 o +351.386 179.889 o +215.238 332.813 o +439.126 111.9 o +159.62 225.208 o +287.312 150.937 o +412.149 346.054 o +331.626 280.217 o +249.309 161.256 o +204.51 231.813 o +327.434 353.332 o +223.744 328.31 o +386.362 124.722 o +386.944 200.394 o +175.975 274.011 o +401.988 177.46 o +167.062 127.908 o +299.015 321.591 o +318.757 139.796 o +170.004 317.43 o +436.758 123.446 o +214.296 275.576 o +400.027 253.085 o +130.366 216.071 o +449.381 113.818 o +202.734 202.77 o +393.784 291.251 o +228.798 326.471 o +137.226 317.576 o +462.921 328.906 o +373.558 331.842 o +429.807 148.739 o +260.378 249.134 o +151.11 360.018 o +226.746 194.417 o +347.161 307.61 o +172.921 346.786 o +443.706 137.208 o +307.714 179.131 o +387.331 167.383 o +395.829 191.575 o +438.425 226.867 o +488.582 181.494 o +413.208 247.968 o +318.259 94.7168 o +300.982 177.026 o +262.819 363.335 o +414.382 164.552 o +410.81 179.936 o +119.129 321.892 o +188.822 321.559 o +122.426 307.439 o +486.877 276.714 o +127.046 327.249 o +296.792 282.851 o +481.745 291.546 o +384.018 110.89 o +160.672 174.147 o +247.512 260.742 o +172.107 118.008 o +303.432 117.225 o +276.065 185.818 o +233.356 105.804 o +209.537 88.6185 o +242.378 126.178 o +439.257 145.76 o +345.787 104.369 o +293.021 338.258 o +322.522 173.289 o +203.614 134.567 o +325.474 283.109 o +117.762 324.851 o +286.279 206.252 o +382.502 236.092 o +459.575 307.252 o +214.749 219.505 o +148.662 161.784 o +137.338 88.1992 o +312.737 363.339 o +328.063 164.294 o +178.992 243.324 o +163.237 171.27 o +267.433 245.24 o +319.834 164.095 o +375.144 295.233 o +259.102 107.75 o +392.699 276.767 o +391.691 204.319 o +191.902 231.978 o +386.915 239.014 o +173.738 299.101 o +441.171 218.606 o +433.56 205.023 o +294.507 238.357 o +244.474 326.735 o +395.717 337.651 o +113.115 260.654 o +311.343 169.363 o +169.068 137.107 o +224.866 158.43 o +429.421 222.162 o +359.743 149 o +282.6 159.052 o +390.569 204.985 o +362.753 183.236 o +262.533 324.614 o +334.777 365.532 o +140.009 251.832 o +219.799 300.38 o +445.515 152.523 o +418.375 80.9914 o +445.002 160.369 o +220.552 315.193 o +219.931 340.377 o +172.85 296.889 o +111.657 286.822 o +141.645 76.739 o +462.098 195.384 o +234.188 317.995 o +357.84 324.207 o +341.406 323.862 o +445.458 329.996 o +373.008 81.7091 o +319.047 131.166 o +488.926 368.786 o +148.207 218.967 o +297.168 280.434 o +464.95 161.951 o +326.349 145.08 o +194.684 100.673 o +228.215 83.5134 o +340.552 357.034 o +343.385 171.784 o +232.921 249.973 o +352.914 242.648 o +258.74 244.429 o +347.248 309.586 o +290.628 343.714 o +452.706 163.697 o +311.123 243.288 o +311.824 355.239 o +171.681 254.353 o +206.849 288.472 o +402.451 294.508 o +236.571 309.878 o +470.687 277.59 o +218.295 370.412 o +489.191 193.343 o +146.549 100.5 o +465.89 309.806 o +255.609 237.653 o +186.838 357.331 o +397.218 182.209 o +295.498 369.436 o +166.213 323.048 o +265.448 363.836 o +334.545 303.352 o +382.656 319.504 o +392.663 217.432 o +188.232 105.453 o +353.967 332.577 o +313.355 291.371 o +189.654 226.05 o +488.126 233.962 o +462.039 298.355 o +422.036 270.53 o +295.648 162.11 o +395.498 233.206 o +277.027 176.625 o +167.533 127.078 o +438.237 224.302 o +427.82 238.514 o +415.582 253.417 o +226.201 139.765 o +271.567 154.682 o +403.876 370.111 o +132.727 129.687 o +236.103 141.182 o +255.964 319.083 o +271.761 320.419 o +389.424 173.27 o +159.048 119.739 o +135.831 256.809 o +219.334 220.279 o +115.493 151.414 o +216.987 344.594 o +114.852 120.835 o +473.535 354.597 o +164.868 267.906 o +285.759 200.603 o +444.005 214.607 o +332.616 194.389 o +265.987 311.361 o +455.137 322.855 o +258.028 272.029 o +324.434 155.212 o +276.686 273.476 o +224.264 321.544 o +275.379 330.977 o +337.922 209.395 o +420.71 335.119 o +489.437 164.871 o +288.57 306.517 o +289.189 180.662 o +428.578 211.337 o +409.359 195.569 o +164.783 208.909 o +309.069 313.877 o +411.255 79.1339 o +295.611 180.802 o +151.741 322.454 o +310.622 244.259 o +113.08 337.238 o +125.908 290.947 o +334.123 207.767 o +477.1 263.948 o +239.929 159.029 o +299.706 251.853 o +409.427 333.963 o +291.335 361.009 o +391.799 195.363 o +147.257 192.948 o +240.682 342.86 o +291.309 137.413 o +212.556 211.898 o +223.437 80.3394 o +453.089 326.74 o +268.276 220.324 o +183.958 93.5576 o +377.568 200.699 o +158.448 245 o +134.272 156.722 o +407.949 308.258 o +285.029 157.309 o +244.278 224.225 o +365.784 245.406 o +431.778 263.426 o +149.284 120.221 o +285.944 97.845 o +478.381 200.685 o +345.955 148.513 o +345.955 148.513 o +289.066 206.922 o +170.067 339.131 o +223.496 197.279 o +112.239 123.13 o +257.45 77.1489 o +216.234 254.535 o +364.774 253.972 o +236.956 133.709 o +258.001 244.962 o +445.647 203.085 o +421.761 290.749 o +378.5 270.765 o +180.731 242.786 o +290.381 170.15 o +286.351 340.074 o +115.567 165.702 o +228.817 340.854 o +354.088 273.08 o +473.527 114.457 o +381.696 163.286 o +303.737 277.347 o +426.668 352.176 o +466.517 268.623 o +218.313 276.676 o +191.707 119.979 o +143.758 212.116 o +119.057 320.484 o +300.596 209.376 o +203.27 167.709 o +168.009 201.423 o +132.68 198.154 o +384.686 342.321 o +226.779 300.969 o +286.137 168.448 o +112.189 341.182 o +181.409 86.8985 o +114.889 258.069 o +448.31 246.205 o +175.45 103.297 o +181.839 102.314 o +133.951 83.8023 o +442.758 238.115 o +473.849 268.08 o +113.726 77.0226 o +276.155 230.666 o +470.316 362.875 o +327.971 135.012 o +461.388 295.974 o +149.544 247.175 o +117.06 351.098 o +391.517 219.52 o +362.844 139.016 o +212.532 293.678 o +440.664 289.412 o +360.889 180.707 o +218.579 108.836 o +285.694 121.59 o +326.496 328.628 o +199.702 99.6927 o +307.075 161.22 o +482.499 99.0487 o +359.867 217.65 o +357.153 167.905 o +470.042 320.102 o +201.174 219.776 o +341.183 122.206 o +471.591 225.872 o +255.171 350.732 o +117.529 295.58 o +163.378 75.5144 o +362.399 196.646 o +226.959 192.084 o +469.986 312.81 o +186.05 257.211 o +335.757 116.78 o +169.18 144.119 o +294.643 113.897 o +370.889 308.577 o +122.868 139.292 o +464.463 360.364 o +273.222 185 o +189.253 235.181 o +135.311 368.563 o +330.741 98.1635 o +120.925 360.281 o +234.233 157.952 o +442.677 262.404 o +235.029 291.647 o +438.884 216.446 o +178.718 250.255 o +336.514 249.43 o +217.262 125.306 o +215.18 238.736 o +429.868 172.787 o +469.196 221.921 o +344.142 115.126 o +162.361 153.129 o +469.271 245.413 o +231.622 342.105 o +251.338 292.569 o +184.201 248.411 o +264.928 276.408 o +431.713 277.379 o +369.131 141.829 o +238.889 183.372 o +437.879 358.291 o +408.177 210.657 o +233.505 124.909 o +162.059 87.6701 o +278.868 242.895 o +174.469 348.555 o +222.204 133.162 o +237.7 325.19 o +410.363 348.649 o +261.919 192.918 o +483.908 166.883 o +154.679 282.411 o +189.27 291.17 o +162.043 210.024 o +249.552 244.816 o +219.077 359.079 o +135.441 215.602 o +388.579 264.358 o +163.988 238.053 o +309.539 355.035 o +294.827 334.219 o +139.792 306.947 o +485.155 187.234 o +342.185 165.215 o +143.136 312.884 o +479.619 279.472 o +193.965 135.318 o +147.058 80.8624 o +281.73 238.428 o +359.004 155.674 o +138.568 335.513 o +475.472 229.206 o +184.735 345.452 o +138.825 166.27 o +247.199 229.569 o +323.124 310.632 o +196.353 205.89 o +116.991 259.104 o +369.062 127.985 o +369.048 221.724 o +401.768 175.487 o +151.337 98.309 o +257.994 103.595 o +302.134 307.824 o +166.404 107.664 o +279.755 319.095 o +309.52 201.588 o +336.188 338.886 o +146.748 308.157 o +457.478 348.168 o +389.174 293.196 o +158.689 285.516 o +135.881 240.379 o +376.772 364.998 o +114.867 201.167 o +309.296 331.707 o +115.871 268.97 o +231.033 107.198 o +165.388 86.5341 o +173.499 121.961 o +438.866 142.694 o +424.036 314.283 o +195.45 262.876 o +190.159 283.921 o +268.097 164.449 o +295.755 362.353 o +196.869 75.1325 o +383.271 105.331 o +152.864 156.095 o +227.751 173.519 o +147.827 360.681 o +248.672 319.443 o +209.178 302.125 o +135.127 129.642 o +255.071 111.735 o +232.257 182.248 o +357.104 137.55 o +429.939 180.669 o +180.846 272.543 o +326.739 369.356 o +301.398 219.534 o +216.101 307.636 o +489.583 149.35 o +363.164 348.406 o +274.712 175.767 o +398.836 340.834 o +327.527 83.7424 o +390.716 241.864 o +344.56 354.832 o +447.984 144.76 o +340.32 232.134 o +205.536 213.88 o +195.437 330.023 o +391.695 205.476 o +354.051 239.269 o +302.44 118.799 o +185.508 218.995 o +114.032 246.527 o +203.441 291.263 o +414.604 278.249 o +222.239 95.6682 o +409.842 257.033 o +299.59 330.801 o +458.332 243.665 o +399.575 303.861 o +262.816 164.961 o +186.088 178.08 o +334.806 151.452 o +260.911 299.905 o +279.954 145.152 o +273.105 290.772 o +445.083 264.005 o +178.466 279.769 o +440.034 79.0233 o +349.33 280.715 o +336.441 114.71 o +322.181 299.937 o +490.914 271.426 o +138.705 359.236 o +376.471 219.915 o +400.988 152.771 o +117.747 188.526 o +307.254 83.3886 o +425.378 166.744 o +313.442 150.238 o +421.254 133.283 o +183.466 192.334 o +484.285 318.5 o +304.369 302.921 o +186.306 170.489 o +366.757 247.74 o +191.422 187.814 o +335.795 286.454 o +288.462 190.647 o +424.466 356.687 o +144.208 360.707 o +131.26 272.793 o +405.738 186.054 o +357.852 143.05 o +417.321 307.758 o +462.987 75.9591 o +444.404 265.32 o +191.222 226.292 o +243.615 226.097 o +203.269 304.868 o +162.277 350.208 o +317.248 227.141 o +423.073 151.768 o +360.812 254.779 o +436.532 191.807 o +259.007 292.046 o +396.798 365.26 o +391.698 260.093 o +131.449 295.38 o +333.482 284.416 o +274.839 254.635 o +287.247 142.062 o +143.469 272.449 o +272.218 166.527 o +243.758 106.82 o +217.445 96.8161 o +398.859 120.269 o +190.67 170.866 o +396.265 237.201 o +176.98 251.588 o +284.486 343.003 o +161.398 304.657 o +290.525 85.7818 o +396.092 298.384 o +284.817 164.009 o +467.268 277.802 o +342.393 330.311 o +225.084 169.053 o +204.268 342.176 o +363.999 270.425 o +130.688 240.901 o +282.43 146.03 o +479.45 152.984 o +189.407 137.626 o +279.4 192.659 o +436.378 253.654 o +292.477 226.992 o +362.571 321.225 o +178.623 327.984 o +476.323 245.63 o +219.464 97.3292 o +216.389 235.981 o +156.923 192.615 o +282.17 335.314 o +242.398 345.859 o +120.684 130.177 o +231.727 246.16 o +295.557 174.878 o +145.964 227.489 o +144.795 208.902 o +173.892 248.371 o +279.533 317.001 o +458.178 295.63 o +466.305 329.748 o +305.636 215.341 o +376.716 270.894 o +114.318 204.298 o +140.888 140.315 o +152.856 186.641 o +485.382 291.041 o +154.798 253.943 o +189.772 365.688 o +335.706 255.779 o +303.199 331.373 o +323.081 209.531 o +435.437 111.956 o +239.023 299.992 o +477.493 91.4192 o +462.763 358.509 o +196.418 279.241 o +353.83 210.574 o +166.98 277.972 o +472.552 331.482 o +407.668 192.099 o +244.773 329.311 o +440.051 305.505 o +268.002 237.85 o +337.155 165.768 o +415.508 277.48 o +255.319 117.816 o +210.598 174.491 o +185.088 229.795 o +344.059 302.361 o +361.143 99.696 o +412.428 353.2 o +301.389 238.643 o +217.641 333.597 o +386.132 100.714 o +383.482 350.856 o +145.448 114.526 o +384.478 104.062 o +414.764 164.96 o +282.385 365.609 o +280.04 119.736 o +334.931 239.08 o +264.041 264.26 o +268.195 269.298 o +238.758 239.685 o +367.012 107.149 o +254.039 319.574 o +146.883 249.039 o +212.066 362.928 o +405.445 350.339 o +393.728 78.6964 o +235.27 119.463 o +390.524 201.093 o +486.447 303.815 o +272.341 93.4554 o +244.842 264.97 o +404.064 342.974 o +464.049 126.185 o +211.223 360.426 o +296.057 167.313 o +490.508 290.569 o +320.655 196.956 o +230.054 257.551 o +244.161 131.443 o +289.135 198.111 o +253.018 326.064 o +282.517 157.432 o +395.265 182.595 o +201.664 183.961 o +190.822 205.643 o +300.585 215.37 o +319.016 157.411 o +460.714 357.133 o +266.554 354.175 o +171.775 241.92 o +209.27 171.162 o +325.503 171.451 o +151.16 99.7775 o +461.094 80.2036 o +439.971 281.439 o +425.381 352.525 o +377.9 362.515 o +429.347 225.153 o +201.717 139.017 o +131.273 162.918 o +220.638 151.443 o +162.362 158.945 o +361.487 257 o +444.09 233.397 o +344.74 155.248 o +236.009 275.369 o +272.234 253.042 o +158.056 128.078 o +473.215 193.23 o +194.988 194.265 o +307.45 102.966 o +249.061 363.794 o +433.707 252.247 o +321.235 130.224 o +279.145 91.669 o +118.158 119.211 o +414.906 359.465 o +359.447 284.041 o +133.373 333.028 o +245.815 118.28 o +319.399 235.203 o +399.717 279.832 o +452.879 343.913 o +465.374 221.034 o +467.121 327.315 o +130.323 294.172 o +468.596 88.8917 o +394.544 354.61 o +142.286 154.263 o +236.094 285.725 o +379.912 208.111 o +413.551 355.13 o +206.456 181.966 o +446.551 236.377 o +444.985 320.215 o +354.535 264.857 o +323.441 223.136 o +488.039 316.446 o +447.963 92.2288 o +475.134 234.765 o +250.879 322.908 o +134.565 287.553 o +372.353 315.817 o +347.657 268.578 o +315.334 341.447 o +227.151 272.361 o +251.798 189.409 o +284.381 192.602 o +464.537 361.335 o +184.243 166.173 o +375.653 205.489 o +351.795 234.282 o +186.972 271.266 o +154.164 186.083 o +164.595 313.03 o +251.292 157.761 o +377.68 143.072 o +423.28 243.038 o +470.735 331.967 o +245.713 88.7982 o +282.434 280.546 o +178.059 219.665 o +179.848 215.338 o +226.016 88.4789 o +416.733 197.088 o +254.33 118.649 o +422.273 266.306 o +356.691 319.863 o +427.831 104.759 o +269.878 110.662 o +403.025 239.419 o +457.935 119.042 o +171.023 212.11 o +170.031 199.403 o +234.463 171.575 o +258.209 259.439 o +381.527 153.006 o +395.79 239.453 o +219.763 291.731 o +215.804 319.155 o +318.612 341.637 o +176.667 197.788 o +465.53 177.024 o +118.524 290.943 o +124.926 297.832 o +327.281 151.359 o +428.668 104.481 o +198.62 189.024 o +302.98 100.107 o +191.028 195.399 o +369.778 124.82 o +221.589 159.492 o +483.096 167.947 o +368.466 250.33 o +342.588 201.786 o +234.694 230.036 o +211.52 90.1258 o +224.466 271.846 o +177.198 160.065 o +213.964 81.7332 o +362.845 364.893 o +275.366 358.65 o +399.385 241.743 o +136.546 287.894 o +323.334 336.138 o +190.913 233.411 o +333.291 273.411 o +283.715 142.159 o +257.917 90.6669 o +219.362 105.772 o +465.887 173.157 o +grestore +gsave +456.165 355.68 73.575 44.46 clipbox +/o { gsave +newpath +translate +1 0 m +0.992115 0.125333 l +0.968583 0.24869 l +0.929776 0.368125 l +0.876307 0.481754 l +0.809017 0.587785 l +0.728969 0.684547 l +0.637424 0.770513 l +0.535827 0.844328 l +0.425779 0.904827 l +0.309017 0.951057 l +0.187381 0.982287 l +0.0627905 0.998027 l +-0.0627905 0.998027 l +-0.187381 0.982287 l +-0.309017 0.951057 l +-0.425779 0.904827 l +-0.535827 0.844328 l +-0.637424 0.770513 l +-0.728969 0.684547 l +-0.809017 0.587785 l +-0.876307 0.481754 l +-0.929776 0.368125 l +-0.968583 0.24869 l +-0.992115 0.125333 l +-1 -3.21625e-16 l +-0.992115 -0.125333 l +-0.968583 -0.24869 l +-0.929776 -0.368125 l +-0.876307 -0.481754 l +-0.809017 -0.587785 l +-0.728969 -0.684547 l +-0.637424 -0.770513 l +-0.535827 -0.844328 l +-0.425779 -0.904827 l +-0.309017 -0.951057 l +-0.187381 -0.982287 l +-0.0627905 -0.998027 l +0.0627905 -0.998027 l +0.187381 -0.982287 l +0.309017 -0.951057 l +0.425779 -0.904827 l +0.535827 -0.844328 l +0.637424 -0.770513 l +0.728969 -0.684547 l +0.809017 -0.587785 l +0.876307 -0.481754 l +0.929776 -0.368125 l +0.968583 -0.24869 l +0.992115 -0.125333 l +closepath +gsave +1.000 0.000 0.000 setrgbcolor +fill +grestore +stroke +grestore } bind def +141.948 310.097 o +183.982 280.847 o +349.776 319.154 o +205.036 272.373 o +467.16 279.949 o +263.68 194.1 o +238.502 202.935 o +401.823 285.29 o +203.424 244.169 o +139.037 286.975 o +324.567 295.097 o +335.436 340.255 o +412.317 349.879 o +405.054 304.302 o +199.467 270.636 o +175.13 248.145 o +194.677 245.363 o +325.407 189.377 o +424.452 248.408 o +339.718 131.535 o +295.553 95.8314 o +379.629 188.771 o +230.192 289.599 o +298.158 350.961 o +249.061 277.194 o +313.34 351.859 o +350.84 180.339 o +260.174 212.286 o +445.562 173.424 o +397.245 322.741 o +424.276 231.741 o +298.255 134.624 o +456.372 285.992 o +175.162 282.695 o +199.379 234.216 o +176.658 352.28 o +431.31 88.2854 o +208.346 180.185 o +432.24 244.871 o +214.029 189.36 o +335.865 260.71 o +447.259 213.305 o +356.532 112.824 o +131.977 107.822 o +392.098 207.543 o +182.882 287.218 o +308.171 81.9989 o +468.38 263.41 o +376.244 97.0933 o +383.555 181.489 o +153.122 182.001 o +313.956 264.813 o +269.652 145.584 o +392.175 243.59 o +369.417 103.098 o +243.348 180.899 o +329.014 278.807 o +211.301 239.006 o +124.24 285.578 o +139.001 154.932 o +229.012 109.917 o +262.784 122.07 o +156.932 191.552 o +236.992 79.5782 o +349.901 267.715 o +284.921 337.506 o +394.845 288.663 o +263.62 170.945 o +140.688 210.018 o +382.718 276.123 o +259.229 81.8391 o +345.867 109.84 o +300.354 355.886 o +380.685 306.036 o +334.705 317.039 o +148.873 300.674 o +454.493 148.303 o +157.473 323.8 o +206.867 174.778 o +228.325 341.37 o +417.203 165.512 o +303.61 97.9033 o +130.027 354.03 o +352.929 194.75 o +249.376 137.524 o +354.568 335.917 o +127.967 349.881 o +210.635 106.242 o +467.895 362.661 o +310.146 136.577 o +121.945 336.32 o +416.548 114.224 o +282.651 304.598 o +205.152 219.285 o +356.82 150.574 o +420.159 238.205 o +169.816 319.918 o +455.096 100.229 o +289.344 174.693 o +166.53 162.409 o +191.123 267.381 o +198.263 137.251 o +397.119 321.831 o +141.86 251.416 o +285.482 274.935 o +214.496 179.054 o +410.802 305.456 o +315.708 192.239 o +349.155 215.149 o +179.225 275.243 o +140.752 316.968 o +183.235 98.4286 o +461.964 131.782 o +362.467 361.371 o +159.142 110.616 o +183.009 191.84 o +288.586 332.205 o +256.058 157.972 o +134.693 111.105 o +253.75 107.743 o +400.563 292.576 o +300.8 353.144 o +281.763 341.86 o +173.697 335.778 o +421.018 192.605 o +261.816 137.183 o +260.828 180.973 o +420.785 96.6778 o +255.143 179.255 o +307.907 94.1629 o +137.98 250.39 o +201.038 161.44 o +451.603 174.495 o +323.267 94.1423 o +408.375 116.034 o +193.208 266.852 o +316.01 150.97 o +422.729 209.021 o +368.968 156.24 o +280.863 192.522 o +234.134 123.962 o +153.166 305.691 o +262.035 229.698 o +311.38 186.389 o +308.443 157.173 o +119.652 267.468 o +311.365 179.635 o +338.046 171.422 o +186.684 219.232 o +229.438 291.378 o +444.719 285.297 o +412.153 290.719 o +444.74 129.61 o +484.222 120.615 o +181.576 336.288 o +158.158 136.535 o +196.094 245.995 o +393.576 220.268 o +227.753 355.021 o +250.242 95.606 o +222.758 200.339 o +386.853 241.779 o +438.61 88.8403 o +225.47 270.882 o +273.236 355.909 o +201.18 174.462 o +366.297 109.656 o +276.964 209.388 o +274.992 205.363 o +303.379 168.117 o +343.416 87.9614 o +195.293 183.188 o +238.394 109.974 o +467.927 257.092 o +322.17 321.093 o +358.518 180.909 o +353.988 273.713 o +329.22 255.194 o +489.475 90.9035 o +122.542 246.619 o +391.59 331.56 o +205.177 122.927 o +207.229 288.67 o +289.431 111.462 o +390.758 124.65 o +135.982 202.994 o +277.513 339.194 o +464.019 134.279 o +411.462 300.67 o +310.09 288.688 o +385.47 240.803 o +455.172 209.08 o +215.365 83.8475 o +389.44 335.117 o +220.399 155.926 o +306.422 323.686 o +123.959 273.269 o +127.257 238.495 o +470.385 172.798 o +233.811 309.813 o +402.089 194.862 o +147.875 339.717 o +205.831 148.86 o +124.892 242.701 o +184.541 246.283 o +296.533 186.43 o +390.433 331.309 o +314.324 162.535 o +144.118 223.441 o +222.014 85.9764 o +356.086 271.079 o +466.492 365.192 o +476.856 150.885 o +417.718 117.738 o +364.45 351.681 o +389.665 113.967 o +123.121 260.528 o +463.954 135.787 o +265.482 288.712 o +298.125 334.107 o +134.461 168.137 o +189.386 340.436 o +462.552 198.218 o +303.573 241.799 o +131.393 221.997 o +144.031 172.427 o +280.771 218.387 o +169.805 244.94 o +346.499 105.921 o +304.369 278.357 o +280.753 190.062 o +416.329 140.654 o +208.635 155.5 o +443.665 102.859 o +457.793 353.154 o +380.491 278.435 o +411.842 298.161 o +154.428 279.989 o +187.908 256.403 o +270.873 275.405 o +445.833 366.343 o +152.601 324.146 o +388.465 351.072 o +247.216 183.063 o +308.835 215.858 o +369.37 288.949 o +130.315 243.651 o +407.241 108.31 o +218.206 237.992 o +315.175 118.669 o +455.252 345.935 o +278.969 247.833 o +422.075 253.161 o +296.151 323.389 o +306.346 83.6648 o +329.028 248.308 o +256.226 148.281 o +188.366 101.465 o +235.592 160.708 o +181.088 229.763 o +338.228 337.531 o +132.997 290.14 o +316.134 258.428 o +444.229 144.232 o +330.485 295.114 o +391.362 86.2513 o +192.441 278.188 o +133.101 101.563 o +187.481 155.818 o +181.895 287.821 o +185.325 169.443 o +136.413 245.119 o +256.404 324.417 o +332.394 182.852 o +223.165 359.793 o +208.627 112.468 o +450.255 331.706 o +323.875 362.016 o +127.557 356.425 o +455.683 264.63 o +156.019 204.278 o +137.088 114.097 o +342.416 291.722 o +126.617 128.944 o +465.668 259.313 o +201.552 204.864 o +230.971 224.556 o +466.88 245.201 o +415.157 252.287 o +256.781 226.686 o +449.885 145.275 o +269.834 179.576 o +244.218 310.918 o +457.841 318.462 o +369.639 265.153 o +270.398 327.019 o +179.362 148.267 o +411.536 281.501 o +248.329 151.283 o +403.743 145.67 o +205.967 193.965 o +152.118 117.884 o +365.671 145.495 o +422.989 266.32 o +320.505 135.014 o +169.558 232.011 o +182.7 146.16 o +438.169 125.346 o +272.465 346.278 o +208.778 325.48 o +210.338 165.907 o +158.622 344.731 o +292.208 111.474 o +244.962 333.976 o +474.692 323.821 o +443.422 312.808 o +461.972 129.612 o +417.317 258.79 o +424.603 366.805 o +277.295 339.354 o +250.098 291.318 o +455.443 120.587 o +384.947 140.277 o +127.324 228.269 o +288.944 309.443 o +177.398 208.383 o +404.692 127.518 o +460.257 340.659 o +376.049 164.435 o +141.437 114.176 o +256.983 251.494 o +415.142 320.927 o +430.305 298.543 o +168.269 229.74 o +191.554 261.289 o +262.514 140.37 o +169.745 188.434 o +185.766 150.462 o +297.917 219.01 o +238.631 185.411 o +468.328 164.581 o +242.658 309.96 o +410.054 303.985 o +343.531 219.031 o +470.333 325.906 o +425.24 134.247 o +205.64 231.82 o +353.474 300.811 o +438.067 243.444 o +223.719 84.5693 o +331.511 272.617 o +338.91 257.627 o +221.947 150.375 o +232.974 255.249 o +232.555 223.414 o +369.132 182.276 o +117.738 288.333 o +373.469 358.488 o +383.729 226.038 o +481.341 212.39 o +253.477 250.498 o +462.695 174.113 o +155.171 224.574 o +411.099 275.894 o +455.595 284.871 o +136.417 218.051 o +151.322 266.042 o +179.838 165.783 o +162.408 356.066 o +219.369 118.214 o +355.801 238.081 o +412.696 295.37 o +285.094 282.256 o +320.649 185.403 o +215.232 176.756 o +383.496 235.53 o +196.352 144.404 o +346.134 234.998 o +189.808 345.967 o +476.996 108.907 o +297.717 265.013 o +475.816 287.095 o +182.646 247.516 o +450.711 186.425 o +312.88 180.805 o +260.297 330.697 o +320.963 164.92 o +115.336 346.817 o +223.07 148.25 o +284.689 140.709 o +382.819 141.848 o +422.43 191.848 o +417.825 269.326 o +407.422 95.2982 o +144.465 134.63 o +339.413 255.629 o +394.49 177.837 o +429.643 194.609 o +196.945 277.106 o +450.489 238.926 o +322.346 221.482 o +321.624 83.8704 o +123.935 317.764 o +194.282 348.145 o +314.227 363.433 o +367.797 197.475 o +316.266 217.362 o +412.409 157.167 o +343.699 150.974 o +280.492 164.453 o +292.752 351.185 o +267.757 298.468 o +237.517 188.241 o +326.081 208.039 o +323.07 135.736 o +416.763 255.479 o +438.707 219.32 o +238.801 188.223 o +256.379 202.286 o +213.124 186.439 o +299.33 102.944 o +200.341 304.537 o +341.647 143.874 o +265.679 355.6 o +480.968 102.481 o +377.918 188.184 o +379.368 305.439 o +405.715 159.391 o +263.099 203.631 o +450.151 89.6949 o +250.468 281.646 o +458.703 209.487 o +419.456 297.744 o +442.664 251.569 o +165.578 96.1867 o +238.637 332.818 o +351.982 90.5455 o +154.777 202.325 o +329.365 192.986 o +426.041 306.607 o +174.193 99.6708 o +192.697 300.728 o +208.049 259.504 o +420.117 321.661 o +373.246 196.299 o +379.655 269.88 o +197.944 103.654 o +169.22 118.546 o +335.136 105.581 o +458.294 313.053 o +407.343 198.627 o +339.286 327.941 o +318.386 298.237 o +241.482 114.018 o +203.971 248.294 o +178.313 1... [truncated message content] |
From: <jd...@us...> - 2007-10-21 16:07:01
|
Revision: 3976 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3976&view=rev Author: jdh2358 Date: 2007-10-21 09:06:57 -0700 (Sun, 21 Oct 2007) Log Message: ----------- fixed stock scatter Modified Paths: -------------- trunk/scipy06/scripts/stock_scatter2.py Modified: trunk/scipy06/scripts/stock_scatter2.py =================================================================== --- trunk/scipy06/scripts/stock_scatter2.py 2007-10-21 16:02:07 UTC (rev 3975) +++ trunk/scipy06/scripts/stock_scatter2.py 2007-10-21 16:06:57 UTC (rev 3976) @@ -34,7 +34,7 @@ converters={0:datestr2num}, skiprows=1, unpack=True) -if 0: # pay the load only once in interactive mode +if 1: # pay the load only once in interactive mode tickerd = dict() for ticker in tickers: tickerd[ticker] = DailyData(ticker) @@ -138,9 +138,8 @@ fig.subplots_adjust(bottom=0.15, hspace=0.05) + fig.canvas.manager.show() - draw() - class ScatterPoints: def __init__(self, ax, pnts, **kwargs): """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-21 16:02:11
|
Revision: 3975 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3975&view=rev Author: jdh2358 Date: 2007-10-21 09:02:07 -0700 (Sun, 21 Oct 2007) Log Message: ----------- added a show method for gtk fig manager Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/__init__.py trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py trunk/matplotlib/setup.py trunk/matplotlib/setupext.py Modified: trunk/matplotlib/lib/matplotlib/__init__.py =================================================================== --- trunk/matplotlib/lib/matplotlib/__init__.py 2007-10-20 21:57:26 UTC (rev 3974) +++ trunk/matplotlib/lib/matplotlib/__init__.py 2007-10-21 16:02:07 UTC (rev 3975) @@ -55,7 +55,7 @@ """ from __future__ import generators -NEWCONFIG = True +NEWCONFIG = False __version__ = '0.90.1' __revision__ = '$Revision$' Modified: trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py =================================================================== --- trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py 2007-10-20 21:57:26 UTC (rev 3974) +++ trunk/matplotlib/lib/matplotlib/backends/backend_gtk.py 2007-10-21 16:02:07 UTC (rev 3975) @@ -390,7 +390,7 @@ self.window = gtk.Window() self.window.set_title("Figure %d" % num) - + self.vbox = gtk.VBox() self.window.add(self.vbox) self.vbox.show() @@ -439,7 +439,10 @@ gtk.main_level() >= 1: gtk.main_quit() - + def show(self): + # show the figure window + self.window.show() + def full_screen_toggle (self): self._full_screen_flag = not self._full_screen_flag if self._full_screen_flag: Modified: trunk/matplotlib/setup.py =================================================================== --- trunk/matplotlib/setup.py 2007-10-20 21:57:26 UTC (rev 3974) +++ trunk/matplotlib/setup.py 2007-10-21 16:02:07 UTC (rev 3975) @@ -24,8 +24,8 @@ # it. It makes very nice antialiased output and also supports alpha # blending BUILD_AGG = 1 -BUILD_GTKAGG = 'auto' -BUILD_GTK = 'auto' +BUILD_GTKAGG = 1 +BUILD_GTK = 1 # build TK GUI with Agg renderer ; requires Tkinter Python extension # and Tk includes @@ -271,7 +271,7 @@ # packagers: set rc['numerix'] and rc['backend'] here to override the auto # defaults, eg #rc['numerix'] = numpy -#rc['backend'] = GTKAgg +#rc['backend'] = 'GTKAgg' if sys.platform=='win32': rc = dict(backend='TkAgg', numerix='numpy') template = file('matplotlibrc.template').read() Modified: trunk/matplotlib/setupext.py =================================================================== --- trunk/matplotlib/setupext.py 2007-10-20 21:57:26 UTC (rev 3974) +++ trunk/matplotlib/setupext.py 2007-10-21 16:02:07 UTC (rev 3975) @@ -43,9 +43,10 @@ import os + basedir = { 'win32' : ['win32_static',], - 'linux2' : ['/usr/local', '/usr',], + 'linux2' : ['/usr/local', '/usr'], 'linux' : ['/usr/local', '/usr',], 'cygwin' : ['/usr/local', '/usr',], 'darwin' : ['/sw/lib/freetype2', '/sw/lib/freetype219', '/usr/local', @@ -170,6 +171,7 @@ if sys.platform == 'win32': has_pkgconfig.cache = False else: + #print 'environ', os.environ['PKG_CONFIG_PATH'] status, output = commands.getstatusoutput("pkg-config --help") has_pkgconfig.cache = (status == 0) return has_pkgconfig.cache @@ -192,6 +194,9 @@ status, output = commands.getstatusoutput( "%s %s %s" % (pkg_config_exec, flags, packages)) + #if packages.startswith('pygtk'): + # print 'status', status, output + # raise SystemExit if status == 0: for token in output.split(): attr = _flags.get(token[:2], None) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-20 21:57:27
|
Revision: 3974 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3974&view=rev Author: jdh2358 Date: 2007-10-20 14:57:26 -0700 (Sat, 20 Oct 2007) Log Message: ----------- finished working with files chapter Modified Paths: -------------- trunk/py4science/workbook/files_etc.tex Modified: trunk/py4science/workbook/files_etc.tex =================================================================== --- trunk/py4science/workbook/files_etc.tex 2007-10-20 21:32:59 UTC (rev 3973) +++ trunk/py4science/workbook/files_etc.tex 2007-10-20 21:57:26 UTC (rev 3974) @@ -202,3 +202,96 @@ since 2003} \end{figure} \par\end{center} + + +\subsection{Loading and saving binary data} +\label{sec:binary_data} + +ASCII is bloated and slow for working with large arrays, and so binary +data should be used if performance is a consideration. To save an +array \texttt{X} in binary form, you can use the numpy +\texttt{tostring} method + +\begin{lstlisting} +In [16]: import numpy + +# create some random numbers +In [17]: x = numpy.random.rand(5,2) + +In [19]: print x +[[ 0.56331918 0.519582 ] + [ 0.22685429 0.18371135] + [ 0.19384767 0.27367054] + [ 0.35935445 0.95795884] + [ 0.37646642 0.14431089]] + +# save it to a data file in binary +In [20]: x.tofile(file('myx.dat', 'wb')) + +# load it into a new array +In [21]: y = numpy.fromfile(file('myx.dat', 'rb')) + +# the shape is not preserved, so we will have to reshape it +In [22]: print y +[ 0.56331918 0.519582 0.22685429 0.18371135 0.19384767 +0.27367054 + 0.35935445 0.95795884 0.37646642 0.14431089] + +In [23]: y.shape +Out[23]: (10,) + +# restore the original shape +In [24]: y.shape = 5, 2 + +In [25]: print y +[[ 0.56331918 0.519582 ] + [ 0.22685429 0.18371135] + [ 0.19384767 0.27367054] + [ 0.35935445 0.95795884] + [ 0.37646642 0.14431089]] +\end{lstlisting} + +The advantage of numpy \texttt{tofile} and \texttt{fromfile} over +ASCII data is that the data storage is compact and the read and write +are very fast. It is a bit of a pain that that meta ata like array +datatype and shape are not stored. In this format, just the raw binary +numeric data is stored, so you will have to keep track of the data +type and shape by other means. This is a good solution if you need to +port binary data files between different packages, but if you know you +will always be working in python, you can use the python pickle +function to preserve all metadata (pickle also works with all standard +python data types, but has the disadvantage that other programs and +applications cannot easily read it) + +\begin{lstlisting} +# create a 6,3 array of random integers +In [36]: x = (256*numpy.random.rand(6,3)).astype(numpy.int) + +In [37]: print x +[[173 38 2] + [243 207 155] + [127 62 140] + [ 46 29 98] + [ 0 46 156] + [ 20 177 36]] + +# use pickle to save the data to a file myint.dat +In [38]: import cPickle + +In [39]: cPickle.dump(x, file('myint.dat', 'wb')) + +# load the data into a new array +In [40]: y = cPickle.load(file('myint.dat', 'rb')) + +# the array type and share are preserved +In [41]: print y +[[173 38 2] + [243 207 155] + [127 62 140] + [ 46 29 98] + [ 0 46 156] + [ 20 177 36]] +\end{lstlisting} + + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-20 21:33:00
|
Revision: 3973 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3973&view=rev Author: jdh2358 Date: 2007-10-20 14:32:59 -0700 (Sat, 20 Oct 2007) Log Message: ----------- added stock records exercise Modified Paths: -------------- trunk/py4science/workbook/files_etc.tex trunk/py4science/workbook/main.tex Added Paths: ----------- trunk/py4science/workbook/fig/stock_records.eps trunk/py4science/workbook/fig/stock_records.png Added: trunk/py4science/workbook/fig/stock_records.eps =================================================================== --- trunk/py4science/workbook/fig/stock_records.eps (rev 0) +++ trunk/py4science/workbook/fig/stock_records.eps 2007-10-20 21:32:59 UTC (rev 3973) @@ -0,0 +1,9121 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: fig/stock_records.eps +%%Creator: matplotlib version 0.90.1, http://matplotlib.sourceforge.net/ +%%CreationDate: Sat Oct 20 15:31:09 2007 +%%Orientation: portrait +%%BoundingBox: 18 180 594 612 +%%EndComments +%%BeginProlog +/mpldict 7 dict def +mpldict begin +/m { moveto } bind def +/l { lineto } bind def +/r { rlineto } bind def +/box { +m +1 index 0 r +0 exch r +neg 0 r +closepath +} bind def +/clipbox { +box +clip +newpath +} bind def +/ellipse { +newpath +matrix currentmatrix 7 1 roll +translate +scale +0 0 1 5 3 roll arc +setmatrix +closepath +} bind def +%!PS-Adobe-3.0 Resource-Font +%%Title: Bitstream Vera Sans +%%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +%%Creator: Converted from TrueType by PPR +25 dict begin +/_d{bind def}bind def +/_m{moveto}_d +/_l{lineto}_d +/_cl{closepath eofill}_d +/_c{curveto}_d +/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d +/_e{exec}_d +/FontName /BitstreamVeraSans-Roman def +/PaintType 0 def +/FontMatrix[.001 0 0 .001 0 0]def +/FontBBox[-182 -235 1287 928]def +/FontType 3 def +/Encoding StandardEncoding def +/FontInfo 10 dict dup begin +/FamilyName (Bitstream Vera Sans) def +/FullName (Bitstream Vera Sans) def +/Notice (Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.) def +/Weight (Roman) def +/Version (Release 1.10) def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -213 def +/UnderlineThickness 143 def +end readonly def +/CharStrings 30 dict dup begin +/hyphen{361 0 49 234 312 314 _sc +49 314 _m +312 314 _l +312 234 _l +49 234 _l +49 314 _l +_cl}_d +/zero{636 0 66 -13 570 742 _sc +318 664 _m +267 664 229 639 203 589 _c +177 539 165 464 165 364 _c +165 264 177 189 203 139 _c +229 89 267 64 318 64 _c +369 64 407 89 433 139 _c +458 189 471 264 471 364 _c +471 464 458 539 433 589 _c +407 639 369 664 318 664 _c +318 742 _m +399 742 461 709 505 645 _c +548 580 570 486 570 364 _c +570 241 548 147 505 83 _c +461 19 399 -13 318 -13 _c +236 -13 173 19 130 83 _c +87 147 66 241 66 364 _c +66 486 87 580 130 645 _c +173 709 236 742 318 742 _c +_cl}_d +/one{636 0 110 0 544 729 _sc +124 83 _m +285 83 _l +285 639 _l +110 604 _l +110 694 _l +284 729 _l +383 729 _l +383 83 _l +544 83 _l +544 0 _l +124 0 _l +124 83 _l +_cl}_d +/two{{636 0 73 0 536 742 _sc +192 83 _m +536 83 _l +536 0 _l +73 0 _l +73 83 _l +110 121 161 173 226 239 _c +290 304 331 346 348 365 _c +380 400 402 430 414 455 _c +426 479 433 504 433 528 _c +433 566 419 598 392 622 _c +365 646 330 659 286 659 _c +255 659 222 653 188 643 _c +154 632 117 616 78 594 _c +78 694 _l +118 710 155 722 189 730 _c +223 738 255 742 284 742 _c +359 742 419 723 464 685 _c +509 647 532 597 532 534 _c +532 504 526 475 515 449 _c +504 422 484 390 454 354 _c +446 344 420 317 376 272 _c +332 227 271 164 192 83 _c +_cl}_e}_d +/three{{636 0 76 -13 556 742 _sc +406 393 _m +453 383 490 362 516 330 _c +542 298 556 258 556 212 _c +556 140 531 84 482 45 _c +432 6 362 -13 271 -13 _c +240 -13 208 -10 176 -4 _c +144 1 110 10 76 22 _c +76 117 _l +103 101 133 89 166 81 _c +198 73 232 69 268 69 _c +330 69 377 81 409 105 _c +441 129 458 165 458 212 _c +458 254 443 288 413 312 _c +383 336 341 349 287 349 _c +202 349 _l +202 430 _l +291 430 _l +339 430 376 439 402 459 _c +428 478 441 506 441 543 _c +441 580 427 609 401 629 _c +374 649 336 659 287 659 _c +260 659 231 656 200 650 _c +169 644 135 635 98 623 _c +98 711 _l +135 721 170 729 203 734 _c +235 739 266 742 296 742 _c +}_e{370 742 429 725 473 691 _c +517 657 539 611 539 553 _c +539 513 527 479 504 451 _c +481 423 448 403 406 393 _c +_cl}_e}_d +/four{636 0 49 0 580 729 _sc +378 643 _m +129 254 _l +378 254 _l +378 643 _l +352 729 _m +476 729 _l +476 254 _l +580 254 _l +580 172 _l +476 172 _l +476 0 _l +378 0 _l +378 172 _l +49 172 _l +49 267 _l +352 729 _l +_cl}_d +/five{{636 0 77 -13 549 729 _sc +108 729 _m +495 729 _l +495 646 _l +198 646 _l +198 467 _l +212 472 227 476 241 478 _c +255 480 270 482 284 482 _c +365 482 429 459 477 415 _c +525 370 549 310 549 234 _c +549 155 524 94 475 51 _c +426 8 357 -13 269 -13 _c +238 -13 207 -10 175 -6 _c +143 -1 111 6 77 17 _c +77 116 _l +106 100 136 88 168 80 _c +199 72 232 69 267 69 _c +323 69 368 83 401 113 _c +433 143 450 183 450 234 _c +450 284 433 324 401 354 _c +368 384 323 399 267 399 _c +241 399 214 396 188 390 _c +162 384 135 375 108 363 _c +108 729 _l +_cl}_e}_d +/six{{636 0 70 -13 573 742 _sc +330 404 _m +286 404 251 388 225 358 _c +199 328 186 286 186 234 _c +186 181 199 139 225 109 _c +251 79 286 64 330 64 _c +374 64 409 79 435 109 _c +461 139 474 181 474 234 _c +474 286 461 328 435 358 _c +409 388 374 404 330 404 _c +526 713 _m +526 623 _l +501 635 476 644 451 650 _c +425 656 400 659 376 659 _c +310 659 260 637 226 593 _c +192 549 172 482 168 394 _c +187 422 211 444 240 459 _c +269 474 301 482 336 482 _c +409 482 467 459 509 415 _c +551 371 573 310 573 234 _c +573 159 550 99 506 54 _c +462 9 403 -13 330 -13 _c +246 -13 181 19 137 83 _c +92 147 70 241 70 364 _c +70 479 97 571 152 639 _c +206 707 280 742 372 742 _c +}_e{396 742 421 739 447 735 _c +472 730 498 723 526 713 _c +_cl}_e}_d +/seven{636 0 82 0 551 729 _sc +82 729 _m +551 729 _l +551 687 _l +286 0 _l +183 0 _l +432 646 _l +82 646 _l +82 729 _l +_cl}_d +/eight{{636 0 68 -13 568 742 _sc +318 346 _m +271 346 234 333 207 308 _c +180 283 167 249 167 205 _c +167 161 180 126 207 101 _c +234 76 271 64 318 64 _c +364 64 401 76 428 102 _c +455 127 469 161 469 205 _c +469 249 455 283 429 308 _c +402 333 365 346 318 346 _c +219 388 _m +177 398 144 418 120 447 _c +96 476 85 511 85 553 _c +85 611 105 657 147 691 _c +188 725 245 742 318 742 _c +390 742 447 725 489 691 _c +530 657 551 611 551 553 _c +551 511 539 476 515 447 _c +491 418 459 398 417 388 _c +464 377 501 355 528 323 _c +554 291 568 251 568 205 _c +568 134 546 80 503 43 _c +459 5 398 -13 318 -13 _c +237 -13 175 5 132 43 _c +89 80 68 134 68 205 _c +68 251 81 291 108 323 _c +134 355 171 377 219 388 _c +}_e{183 544 _m +183 506 194 476 218 455 _c +242 434 275 424 318 424 _c +360 424 393 434 417 455 _c +441 476 453 506 453 544 _c +453 582 441 611 417 632 _c +393 653 360 664 318 664 _c +275 664 242 653 218 632 _c +194 611 183 582 183 544 _c +_cl}_e}_d +/A{684 0 8 0 676 729 _sc +342 632 _m +208 269 _l +476 269 _l +342 632 _l +286 729 _m +398 729 _l +676 0 _l +573 0 _l +507 187 _l +178 187 _l +112 0 _l +8 0 _l +286 729 _l +_cl}_d +/C{{698 0 56 -13 644 742 _sc +644 673 _m +644 569 _l +610 599 575 622 537 638 _c +499 653 460 661 418 661 _c +334 661 270 635 226 584 _c +182 533 160 460 160 364 _c +160 268 182 194 226 143 _c +270 92 334 67 418 67 _c +460 67 499 74 537 90 _c +575 105 610 128 644 159 _c +644 56 _l +609 32 572 15 534 4 _c +496 -7 455 -13 412 -13 _c +302 -13 215 20 151 87 _c +87 154 56 246 56 364 _c +56 481 87 573 151 641 _c +215 708 302 742 412 742 _c +456 742 497 736 535 725 _c +573 713 610 696 644 673 _c +_cl}_e}_d +/E{632 0 98 0 568 729 _sc +98 729 _m +559 729 _l +559 646 _l +197 646 _l +197 430 _l +544 430 _l +544 347 _l +197 347 _l +197 83 _l +568 83 _l +568 0 _l +98 0 _l +98 729 _l +_cl}_d +/F{575 0 98 0 517 729 _sc +98 729 _m +517 729 _l +517 646 _l +197 646 _l +197 431 _l +486 431 _l +486 348 _l +197 348 _l +197 0 _l +98 0 _l +98 729 _l +_cl}_d +/G{{775 0 56 -13 693 742 _sc +595 104 _m +595 300 _l +434 300 _l +434 381 _l +693 381 _l +693 68 _l +655 40 613 20 567 7 _c +521 -6 472 -13 420 -13 _c +306 -13 216 20 152 86 _c +88 152 56 245 56 364 _c +56 482 88 575 152 642 _c +216 708 306 742 420 742 _c +467 742 512 736 555 724 _c +598 712 638 695 674 673 _c +674 568 _l +637 598 598 621 557 637 _c +516 653 473 661 428 661 _c +338 661 271 636 227 586 _c +182 536 160 462 160 364 _c +160 265 182 191 227 141 _c +271 91 338 67 428 67 _c +462 67 493 70 521 76 _c +549 82 573 91 595 104 _c +_cl}_e}_d +/H{752 0 98 0 654 729 _sc +98 729 _m +197 729 _l +197 430 _l +555 430 _l +555 729 _l +654 729 _l +654 0 _l +555 0 _l +555 347 _l +197 347 _l +197 0 _l +98 0 _l +98 729 _l +_cl}_d +/I{295 0 98 0 197 729 _sc +98 729 _m +197 729 _l +197 0 _l +98 0 _l +98 729 _l +_cl}_d +/L{557 0 98 0 552 729 _sc +98 729 _m +197 729 _l +197 83 _l +552 83 _l +552 0 _l +98 0 _l +98 729 _l +_cl}_d +/M{863 0 98 0 765 729 _sc +98 729 _m +245 729 _l +431 233 _l +618 729 _l +765 729 _l +765 0 _l +669 0 _l +669 640 _l +481 140 _l +382 140 _l +194 640 _l +194 0 _l +98 0 _l +98 729 _l +_cl}_d +/N{748 0 98 0 650 729 _sc +98 729 _m +231 729 _l +554 119 _l +554 729 _l +650 729 _l +650 0 _l +517 0 _l +194 610 _l +194 0 _l +98 0 _l +98 729 _l +_cl}_d +/O{787 0 56 -13 731 742 _sc +394 662 _m +322 662 265 635 223 582 _c +181 528 160 456 160 364 _c +160 272 181 199 223 146 _c +265 92 322 66 394 66 _c +465 66 522 92 564 146 _c +606 199 627 272 627 364 _c +627 456 606 528 564 582 _c +522 635 465 662 394 662 _c +394 742 _m +496 742 577 707 639 639 _c +700 571 731 479 731 364 _c +731 248 700 157 639 89 _c +577 21 496 -13 394 -13 _c +291 -13 209 21 148 89 _c +86 157 56 248 56 364 _c +56 479 86 571 148 639 _c +209 707 291 742 394 742 _c +_cl}_d +/P{603 0 98 0 569 729 _sc +197 648 _m +197 374 _l +321 374 _l +367 374 402 385 427 409 _c +452 433 465 467 465 511 _c +465 555 452 588 427 612 _c +402 636 367 648 321 648 _c +197 648 _l +98 729 _m +321 729 _l +402 729 464 710 506 673 _c +548 636 569 582 569 511 _c +569 439 548 384 506 348 _c +464 311 402 293 321 293 _c +197 293 _l +197 0 _l +98 0 _l +98 729 _l +_cl}_d +/S{{635 0 66 -13 579 742 _sc +535 705 _m +535 609 _l +497 627 462 640 429 649 _c +395 657 363 662 333 662 _c +279 662 237 651 208 631 _c +179 610 165 580 165 542 _c +165 510 174 485 194 469 _c +213 452 250 439 304 429 _c +364 417 _l +437 403 491 378 526 343 _c +561 307 579 260 579 201 _c +579 130 555 77 508 41 _c +460 5 391 -13 300 -13 _c +265 -13 228 -9 189 -2 _c +150 5 110 16 69 32 _c +69 134 _l +109 111 148 94 186 83 _c +224 71 262 66 300 66 _c +356 66 399 77 430 99 _c +460 121 476 152 476 194 _c +476 230 465 258 443 278 _c +421 298 385 313 335 323 _c +275 335 _l +201 349 148 372 115 404 _c +82 435 66 478 66 534 _c +66 598 88 649 134 686 _c +179 723 242 742 322 742 _c +}_e{356 742 390 739 426 733 _c +461 727 497 717 535 705 _c +_cl}_e}_d +/T{611 0 -2 0 614 729 _sc +-2 729 _m +614 729 _l +614 646 _l +355 646 _l +355 0 _l +256 0 _l +256 646 _l +-2 646 _l +-2 729 _l +_cl}_d +/W{989 0 33 0 956 729 _sc +33 729 _m +133 729 _l +286 113 _l +439 729 _l +550 729 _l +703 113 _l +856 729 _l +956 729 _l +773 0 _l +649 0 _l +495 633 _l +340 0 _l +216 0 _l +33 729 _l +_cl}_d +/Y{611 0 -1 0 613 729 _sc +-1 729 _m +104 729 _l +306 429 _l +507 729 _l +613 729 _l +355 347 _l +355 0 _l +256 0 _l +256 347 _l +-1 729 _l +_cl}_d +/a{{613 0 60 -13 522 560 _sc +343 275 _m +270 275 220 266 192 250 _c +164 233 150 205 150 165 _c +150 133 160 107 181 89 _c +202 70 231 61 267 61 _c +317 61 357 78 387 114 _c +417 149 432 196 432 255 _c +432 275 _l +343 275 _l +522 312 _m +522 0 _l +432 0 _l +432 83 _l +411 49 385 25 355 10 _c +325 -5 287 -13 243 -13 _c +187 -13 142 2 109 33 _c +76 64 60 106 60 159 _c +60 220 80 266 122 298 _c +163 329 224 345 306 345 _c +432 345 _l +432 354 _l +432 395 418 427 391 450 _c +364 472 326 484 277 484 _c +245 484 215 480 185 472 _c +155 464 127 453 100 439 _c +100 522 _l +}_e{132 534 164 544 195 550 _c +226 556 256 560 286 560 _c +365 560 424 539 463 498 _c +502 457 522 395 522 312 _c +_cl}_e}_d +/d{{635 0 55 -13 544 760 _sc +454 464 _m +454 760 _l +544 760 _l +544 0 _l +454 0 _l +454 82 _l +435 49 411 25 382 10 _c +353 -5 319 -13 279 -13 _c +213 -13 159 13 117 65 _c +75 117 55 187 55 273 _c +55 359 75 428 117 481 _c +159 533 213 560 279 560 _c +319 560 353 552 382 536 _c +411 520 435 496 454 464 _c +148 273 _m +148 207 161 155 188 117 _c +215 79 253 61 301 61 _c +348 61 385 79 413 117 _c +440 155 454 207 454 273 _c +454 339 440 390 413 428 _c +385 466 348 485 301 485 _c +253 485 215 466 188 428 _c +161 390 148 339 148 273 _c +_cl}_e}_d +/e{{615 0 55 -13 562 560 _sc +562 296 _m +562 252 _l +149 252 _l +153 190 171 142 205 110 _c +238 78 284 62 344 62 _c +378 62 412 66 444 74 _c +476 82 509 95 541 113 _c +541 28 _l +509 14 476 3 442 -3 _c +408 -9 373 -13 339 -13 _c +251 -13 182 12 131 62 _c +80 112 55 181 55 268 _c +55 357 79 428 127 481 _c +175 533 241 560 323 560 _c +397 560 455 536 498 489 _c +540 441 562 377 562 296 _c +472 322 _m +471 371 457 410 431 440 _c +404 469 368 484 324 484 _c +274 484 234 469 204 441 _c +174 413 156 373 152 322 _c +472 322 _l +_cl}_e}_d +/t{392 0 27 0 368 702 _sc +183 702 _m +183 547 _l +368 547 _l +368 477 _l +183 477 _l +183 180 _l +183 135 189 106 201 94 _c +213 81 238 75 276 75 _c +368 75 _l +368 0 _l +276 0 _l +206 0 158 13 132 39 _c +106 65 93 112 93 180 _c +93 477 _l +27 477 _l +27 547 _l +93 547 _l +93 702 _l +183 702 _l +_cl}_d +end readonly def + +/BuildGlyph + {exch begin + CharStrings exch + 2 copy known not{pop /.notdef}if + true 3 1 roll get exec + end}_d + +/BuildChar { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec +}_d + +FontName currentdict end definefont pop +%%EOF +end +%%EndProlog +mpldict begin +18 180 translate +576 432 0 0 clipbox +1.000 setgray +1.000 setlinewidth +0 setlinejoin +2 setlinecap +[] 0 setdash +0 0 m +0 432 l +576 432 l +576 0 l +closepath +gsave +fill +grestore +stroke +0.000 setgray +72 43.2 m +72 388.8 l +518.4 388.8 l +518.4 43.2 l +closepath +gsave +1.000 setgray +fill +grestore +stroke +0.000 0.000 1.000 setrgbcolor +gsave +446.4 345.6 72 43.2 clipbox +110.389 100.8 m +110.598 100.698 l +111.228 101.137 l +111.438 101.261 l +111.647 100.793 l +111.857 101.056 l +112.067 101.305 l +112.696 101.276 l +112.906 101.554 l +113.116 101.254 l +113.326 101.151 l +113.535 100.558 l +114.374 100.522 l +114.584 100.493 l +114.794 100.785 l +115.004 100.222 l +115.633 100.236 l +115.843 100.346 l +116.053 100.778 l +116.262 100.171 l +116.472 100.09 l +117.102 100.171 l +117.311 100.075 l +117.521 100.046 l +117.731 99.929 l +117.941 99.6802 l +118.57 99.8339 l +118.78 99.8778 l +118.989 99.7461 l +119.199 100.01 l +119.409 100.441 l +120.248 100.844 l +120.458 100.873 l +120.668 100.998 l +120.877 100.881 l +121.507 100.712 l +121.717 100.844 l +121.926 100.5 l +122.136 100.822 l +122.346 101.203 l +122.975 100.793 l +123.185 100.763 l +123.395 101.012 l +123.605 100.793 l +123.814 100.346 l +124.444 100.266 l +124.653 100.229 l +124.863 100.456 l +125.073 101.268 l +125.283 101.144 l +125.912 101.759 l +126.122 101.891 l +126.332 101.708 l +126.541 101.905 l +126.751 102.352 l +127.38 101.59 l +127.59 101.744 l +127.8 101.642 l +128.01 101.429 l +128.22 101.181 l +128.849 100.529 l +129.059 100.624 l +129.268 101.386 l +129.478 101.422 l +129.688 101.063 l +130.317 101.268 l +130.527 101.093 l +130.737 100.807 l +130.947 100.946 l +131.156 100.851 l +131.786 101.137 l +131.995 101.115 l +132.205 101.832 l +132.415 102.176 l +133.254 102.169 l +133.464 102.41 l +133.674 102.74 l +133.883 102.374 l +134.093 101.912 l +134.723 102.235 l +134.932 102.352 l +135.142 101.993 l +135.352 102.088 l +135.562 102.432 l +136.191 102.439 l +136.401 102.791 l +136.611 102.564 l +136.82 102.33 l +137.03 102.827 l +137.659 103.105 l +137.869 102.996 l +138.079 102.879 l +138.289 103.113 l +138.498 102.769 l +139.128 102.198 l +139.338 102.191 l +139.547 102.315 l +139.757 102.264 l +139.967 102.293 l +140.806 102.959 l +141.016 102.937 l +141.226 103.691 l +141.435 103.684 l +142.065 103.376 l +142.274 103.874 l +142.484 104.072 l +142.694 104.386 l +142.904 104.335 l +143.533 104.269 l +143.743 104.474 l +143.953 104.423 l +144.162 104.599 l +144.372 104.057 l +145.002 104.408 l +145.211 104.115 l +145.421 104.328 l +145.631 103.889 l +145.841 103.581 l +146.47 103.362 l +146.68 103.427 l +146.889 103.142 l +147.099 103.552 l +147.309 103.508 l +147.938 103.676 l +148.148 104.094 l +148.358 104.642 l +148.568 104.306 l +149.407 105.125 l +149.617 105.294 l +149.826 105.521 l +150.036 105.125 l +150.246 105.426 l +150.875 105.894 l +151.085 105.953 l +151.295 106.787 l +151.505 106.523 l +151.714 106.34 l +152.344 105.923 l +152.553 106.172 l +152.763 106.443 l +152.973 105.865 l +153.183 106.509 l +153.812 106.406 l +154.022 106.501 l +154.232 106.223 l +154.441 106.494 l +154.651 106.589 l +155.28 106.662 l +155.49 106.084 l +155.7 105.989 l +155.91 105.887 l +156.12 105.601 l +156.749 105.828 l +156.959 106.15 l +157.168 106.384 l +157.378 106.684 l +157.588 106.619 l +158.217 107.409 l +158.427 107.607 l +158.637 107.526 l +158.847 107.548 l +159.056 108.243 l +159.686 108.141 l +159.895 108.463 l +160.105 108.675 l +160.315 108.873 l +160.525 109.07 l +161.364 109.173 l +161.574 108.814 l +161.783 109.078 l +161.993 109.158 l +162.623 109.48 l +162.832 109.209 l +163.042 108.426 l +163.252 108.682 l +163.462 108.902 l +164.091 108.661 l +164.301 109.297 l +164.511 109.275 l +164.72 109.466 l +164.93 109.473 l +165.559 109.026 l +165.769 109.312 l +165.979 108.514 l +166.189 108.28 l +166.398 108.156 l +167.028 108.917 l +167.238 108.331 l +167.447 109.1 l +167.657 109.092 l +167.867 109.78 l +168.496 109.744 l +168.706 110.015 l +168.916 109.817 l +169.126 109.89 l +169.335 110.344 l +169.965 110.6 l +170.174 110.798 l +170.384 111.266 l +170.594 111.595 l +170.804 111.2 l +171.433 111.544 l +171.643 111.515 l +171.853 111.098 l +172.062 110.893 l +172.272 110.798 l +172.902 111.032 l +173.111 111.896 l +173.321 111.991 l +173.531 112.049 l +173.741 112.093 l +174.37 112.847 l +174.58 112.598 l +174.789 112.649 l +174.999 112.913 l +175.209 112.744 l +175.838 112.408 l +176.048 112.422 l +176.258 112.898 l +176.468 112.679 l +176.677 111.998 l +177.307 111.603 l +177.517 111.339 l +177.726 111.808 l +177.936 111.332 l +178.146 111.669 l +178.775 112.459 l +178.985 112.188 l +179.195 112.379 l +179.614 112.51 l +180.244 112.862 l +180.453 112.73 l +180.663 112.371 l +180.873 112.51 l +181.083 111.515 l +181.712 111.2 l +181.922 110.234 l +182.132 110.351 l +182.341 110.688 l +182.551 110.659 l +183.18 110.227 l +183.39 110.241 l +183.6 110.176 l +183.81 110.688 l +184.02 110.454 l +184.649 110.351 l +184.859 110.827 l +185.068 110.812 l +185.488 111.003 l +186.117 111.552 l +186.327 111.471 l +186.537 111.478 l +186.956 111.559 l +187.586 112.078 l +187.795 112.071 l +188.005 112.825 l +188.215 113.001 l +188.425 112.81 l +189.054 112.935 l +189.264 112.547 l +189.474 112.408 l +189.683 112.181 l +189.893 112.064 l +190.732 111.866 l +190.942 111.588 l +191.152 111.193 l +191.362 111.273 l +191.991 111.742 l +192.201 111.193 l +192.411 111.017 l +192.62 110.681 l +192.83 110.424 l +193.459 110.285 l +193.669 111.032 l +193.879 110.102 l +194.089 110.029 l +194.298 110.695 l +194.928 110.483 l +195.138 110.461 l +195.347 110.776 l +195.557 110.6 l +195.767 110.183 l +196.606 110.651 l +196.816 110.505 l +197.026 110.015 l +197.235 110.088 l +197.865 109.392 l +198.074 109.531 l +198.284 109.824 l +198.494 109.744 l +198.704 109.531 l +199.333 109.875 l +199.543 109.81 l +199.753 109.422 l +199.962 109.846 l +200.172 109.356 l +200.802 108.492 l +201.011 108.69 l +201.221 108.221 l +201.431 108.06 l +201.641 108.485 l +202.27 108.075 l +202.48 108.119 l +202.689 108.558 l +202.899 108.148 l +203.109 107.651 l +203.738 107.475 l +203.948 107.424 l +204.158 107.68 l +204.368 108.558 l +204.577 108.273 l +205.207 108.485 l +205.417 108.302 l +205.626 108.148 l +205.836 108.273 l +206.046 108.785 l +206.675 109.085 l +206.885 108.887 l +207.095 108.434 l +207.305 108.265 l +208.144 108.426 l +208.353 108.47 l +208.563 108.265 l +208.773 107.768 l +208.983 107.629 l +209.612 107.782 l +209.822 107.365 l +210.032 107.504 l +210.241 107.672 l +210.451 108.375 l +211.08 108.112 l +211.29 107.921 l +211.5 107.555 l +211.71 107.402 l +211.92 107.124 l +212.549 107.343 l +212.759 107.504 l +212.968 107.482 l +213.178 107.328 l +213.388 107.665 l +214.017 107.724 l +214.227 108.573 l +214.437 108.434 l +214.647 108.339 l +214.856 108.06 l +215.486 107.921 l +215.695 108.141 l +215.905 108.112 l +216.115 108.324 l +216.325 108.419 l +216.954 108.551 l +217.164 108.8 l +217.374 108.99 l +217.583 109.041 l +217.793 109.114 l +218.632 108.961 l +218.842 108.734 l +219.052 108.324 l +219.262 108.829 l +219.891 109.253 l +220.101 109.414 l +220.311 109.005 l +220.52 109.173 l +221.359 108.726 l +221.569 109.026 l +221.779 108.814 l +221.989 108.47 l +222.198 108.478 l +222.828 108.397 l +223.038 108.756 l +223.247 109.092 l +223.457 108.697 l +223.667 108.58 l +224.296 108.302 l +224.506 108.456 l +224.716 108.456 l +224.926 108.046 l +225.135 107.57 l +225.974 107.416 l +226.184 107.577 l +226.394 107.497 l +226.604 107.738 l +227.233 107.504 l +227.443 107.438 l +227.653 105.521 l +227.862 105.36 l +228.072 105.067 l +228.702 105.191 l +228.911 105.426 l +229.121 104.95 l +229.331 105.448 l +229.541 105.03 l +230.17 105.235 l +230.38 105.448 l +230.589 105.579 l +230.799 106.121 l +231.009 106.216 l +231.638 106.575 l +231.848 106.07 l +232.058 105.96 l +232.268 105.748 l +232.477 105.125 l +233.107 104.986 l +233.317 104.964 l +233.526 104.701 l +233.736 104.057 l +233.946 104.284 l +234.575 104.181 l +234.785 104.247 l +234.995 104.738 l +235.205 104.591 l +235.414 104.32 l +236.044 104.511 l +236.253 104.357 l +236.463 104.555 l +236.673 104.43 l +236.883 104.599 l +237.512 104.306 l +237.722 104.094 l +237.932 104.189 l +238.141 104.328 l +238.351 103.23 l +239.19 103.12 l +239.4 103.003 l +239.61 103.318 l +239.82 103.596 l +240.449 103.75 l +240.659 103.735 l +240.868 103.486 l +241.078 103.274 l +241.288 103.603 l +241.917 103.837 l +242.127 103.947 l +242.337 103.486 l +242.547 103.457 l +242.756 103.288 l +243.386 103.142 l +243.595 102.974 l +243.805 103.245 l +244.015 103.237 l +244.225 103.786 l +244.854 103.984 l +245.064 104.115 l +245.274 103.984 l +245.483 104.057 l +245.693 103.581 l +246.323 103.618 l +246.532 103.391 l +246.742 103.881 l +246.952 103.552 l +247.162 103.618 l +247.791 103.742 l +248.001 103.75 l +248.211 104.203 l +248.42 104.372 l +248.63 104.101 l +249.259 104.108 l +249.469 104.167 l +249.679 104.584 l +249.889 104.774 l +250.098 104.767 l +250.728 104.891 l +250.938 105.008 l +251.147 105.082 l +251.357 105.228 l +251.567 105.565 l +252.196 105.469 l +252.406 105.367 l +252.616 105.213 l +252.826 105.433 l +253.035 105.792 l +253.665 105.85 l +253.874 105.894 l +254.084 106.231 l +254.294 106.567 l +254.504 106.121 l +255.133 106.077 l +255.343 105.572 l +255.553 105.74 l +255.972 105.455 l +256.602 105.352 l +256.811 104.877 l +257.021 105.382 l +257.231 105.111 l +257.441 105.945 l +258.07 106.018 l +258.28 105.645 l +258.489 105.316 l +258.699 105.147 l +258.909 105.008 l +259.538 105.052 l +259.748 105.477 l +259.958 105.411 l +260.168 105.221 l +260.377 105.155 l +261.007 105.104 l +261.217 105.652 l +261.426 105.623 l +261.636 105.689 l +262.475 105.572 l +262.685 105.506 l +262.895 105.484 l +263.105 105.484 l +263.314 105.587 l +263.944 105.36 l +264.153 105.038 l +264.363 104.884 l +264.573 104.935 l +264.783 105.169 l +265.412 105.228 l +265.622 104.994 l +265.832 105.426 l +266.041 105.184 l +266.251 105.323 l +267.09 105.272 l +267.3 105.03 l +267.51 105.016 l +267.72 104.906 l +268.349 104.606 l +268.559 104.796 l +268.768 104.906 l +268.978 104.833 l +269.188 104.781 l +269.817 104.928 l +270.027 105.052 l +270.237 105.016 l +270.447 104.935 l +270.656 105.367 l +271.286 105.308 l +271.495 105.652 l +271.705 105.579 l +271.915 105.718 l +272.125 106.187 l +272.754 106.282 l +272.964 106.399 l +273.174 106.165 l +273.383 105.806 l +273.593 106.084 l +274.432 105.901 l +274.642 105.587 l +274.852 105.857 l +275.062 106.128 l +275.691 106.062 l +275.901 106.501 l +276.111 106.436 l +276.32 106.421 l +276.53 106.545 l +277.159 106.845 l +277.369 106.626 l +277.579 106.655 l +277.789 106.662 l +277.998 106.209 l +278.628 106.26 l +278.838 105.982 l +279.047 105.748 l +279.257 105.652 l +279.467 105.652 l +280.096 105.718 l +280.306 105.382 l +280.516 105.645 l +280.726 105.491 l +281.565 105.579 l +281.774 105.477 l +281.984 105.711 l +282.194 105.528 l +282.404 105.374 l +283.033 105.323 l +283.243 105.462 l +283.453 105.404 l +283.662 105.652 l +283.872 105.572 l +284.502 105.455 l +284.711 105.521 l +284.921 105.243 l +285.131 105.008 l +285.341 104.752 l +285.97 104.818 l +286.18 105.111 l +286.389 105.133 l +286.599 105.623 l +286.809 105.535 l +287.438 105.652 l +287.648 105.594 l +287.858 105.726 l +288.068 105.499 l +288.277 105.733 l +288.907 105.755 l +289.117 105.953 l +289.326 106.201 l +289.536 106.304 l +289.746 106.472 l +290.375 106.684 l +290.585 106.597 l +290.795 106.662 l +291.005 106.714 l +291.214 106.911 l +291.844 107.058 l +292.053 107.321 l +292.263 107.482 l +292.473 107.533 l +292.683 107.775 l +293.312 107.877 l +293.522 108.199 l +293.732 108.229 l +293.941 108.492 l +294.151 108.507 l +294.99 108.199 l +295.2 108.434 l +295.41 108.646 l +295.62 108.463 l +296.249 108.353 l +296.459 108.134 l +296.668 108.302 l +296.878 108.719 l +297.088 108.214 l +297.717 108.229 l +297.927 108.016 l +298.137 108.185 l +298.347 108.317 l +298.556 108.317 l +299.186 108.163 l +299.395 108.353 l +299.605 108.309 l +299.815 108.068 l +300.025 107.599 l +300.654 107.431 l +300.864 107.76 l +301.074 107.702 l +301.283 107.541 l +301.493 107.672 l +302.332 108.009 l +302.542 107.877 l +302.752 107.921 l +302.962 108.426 l +303.591 108.719 l +303.801 108.756 l +304.011 108.646 l +304.22 108.851 l +304.43 109.144 l +305.059 109.092 l +305.269 109.429 l +305.479 108.536 l +305.689 108.251 l +305.898 108.053 l +306.528 107.892 l +306.738 108.156 l +306.947 108.273 l +307.157 108.47 l +307.367 108.331 l +307.996 108.309 l +308.206 108.624 l +308.416 108.734 l +308.626 108.295 l +308.835 108.126 l +309.465 108.082 l +309.674 108.214 l +309.884 108.199 l +310.094 108.156 l +310.304 107.797 l +310.933 107.958 l +311.143 107.585 l +311.353 107.643 l +311.562 107.497 l +311.772 107.336 l +312.402 107.621 l +312.611 107.387 l +312.821 107.248 l +313.031 107.204 l +313.241 107.167 l +313.87 107.394 l +314.08 107.277 l +314.289 107.387 l +314.499 107.058 l +314.709 107.072 l +315.548 107.372 l +315.758 107.343 l +315.968 107.643 l +316.177 107.05 l +316.807 106.867 l +317.017 106.809 l +317.226 106.516 l +317.436 106.56 l +317.646 106.743 l +318.275 106.655 l +318.485 106.509 l +318.695 106.523 l +318.905 106.567 l +319.114 106.443 l +319.744 106.326 l +319.953 106.055 l +320.163 106.136 l +320.373 106.509 l +320.583 106.633 l +321.212 106.597 l +321.422 106.523 l +321.632 106.223 l +321.841 106.004 l +322.051 106.048 l +322.68 105.762 l +322.89 105.762 l +323.1 105.638 l +323.31 105.609 l +323.52 105.63 l +324.149 105.792 l +324.359 105.974 l +324.568 105.953 l +324.778 105.909 l +324.988 105.572 l +325.617 105.543 l +325.827 105.55 l +326.037 105.521 l +326.247 105.36 l +326.456 105.704 l +327.086 105.821 l +327.295 105.221 l +327.505 105.733 l +327.715 106.157 l +327.925 106.223 l +328.554 106.582 l +328.764 106.619 l +328.974 106.794 l +329.183 107.109 l +329.393 107.028 l +330.023 107.197 l +330.232 106.992 l +330.442 106.875 l +330.652 107.014 l +330.862 107.153 l +331.491 107.116 l +331.701 107.76 l +331.911 108.097 l +332.33 108.214 l +332.959 108.251 l +333.169 108.192 l +333.379 108.126 l +333.589 108.478 l +333.798 108.653 l +334.428 108.28 l +334.638 108.119 l +334.847 107.753 l +335.057 107.431 l +335.267 107.702 l +335.896 108.082 l +336.106 108.156 l +336.316 108.09 l +336.526 108.053 l +336.735 107.914 l +337.365 107.49 l +337.574 107.511 l +337.784 107.563 l +337.994 107.621 l +338.204 107.621 l +339.043 107.263 l +339.253 107.248 l +339.462 106.984 l +339.672 106.911 l +340.511 107.343 l +340.721 107.577 l +340.931 107.833 l +341.141 107.863 l +341.77 107.98 l +341.98 107.731 l +342.189 107.746 l +342.399 107.621 l +342.609 107.497 l +343.448 107.307 l +343.658 105.243 l +343.868 105.104 l +344.077 104.65 l +344.707 104.357 l +344.917 104.313 l +345.126 104.262 l +345.336 104.459 l +345.546 104.584 l +346.175 104.569 l +346.385 104.298 l +346.595 104.503 l +346.805 104.255 l +347.014 103.998 l +347.644 103.903 l +347.853 103.947 l +348.063 103.947 l +348.273 104.181 l +348.483 104.386 l +349.112 104.276 l +349.322 104.445 l +349.532 104.43 l +349.741 104.43 l +349.951 103.903 l +350.79 103.911 l +351 103.581 l +351.21 103.676 l +351.42 103.728 l +352.049 103.845 l +352.259 103.896 l +352.468 104.042 l +352.678 103.823 l +352.888 103.698 l +353.517 103.684 l +353.727 103.515 l +353.937 103.479 l +354.147 103.296 l +354.356 103.369 l +354.986 103.281 l +355.195 103.303 l +355.405 103.42 l +355.615 103.223 l +355.825 103.149 l +356.454 103.201 l +356.664 103.318 l +356.874 103.457 l +357.083 103.259 l +357.293 103.186 l +357.923 103.296 l +358.132 103.179 l +358.342 103.347 l +358.552 103.259 l +358.762 103.091 l +359.391 103.01 l +359.601 102.974 l +359.811 103.105 l +360.02 103.032 l +360.23 102.937 l +360.859 103.018 l +361.069 102.879 l +361.279 102.849 l +361.489 103.084 l +362.328 102.901 l +362.538 103.04 l +362.747 103.164 l +362.957 103.084 l +363.167 102.805 l +363.796 102.703 l +364.006 102.871 l +364.216 103.113 l +364.426 103.53 l +364.635 103.457 l +365.265 103.113 l +365.474 103.186 l +365.684 102.944 l +365.894 103.076 l +366.104 103.193 l +366.733 103.625 l +366.943 103.471 l +367.153 103.245 l +367.362 103.091 l +367.572 102.864 l +368.202 103.062 l +368.411 102.879 l +368.621 102.593 l +368.831 102.586 l +369.041 102.374 l +369.67 102.125 l +369.88 102.081 l +370.089 102.044 l +370.299 102.154 l +370.509 102.278 l +371.348 101.986 l +371.558 102.132 l +371.768 102.147 l +371.977 102.286 l +372.607 102.103 l +372.817 101.971 l +373.026 101.686 l +373.236 101.488 l +373.446 101.517 l +374.075 101.305 l +374.285 101.495 l +374.495 101.927 l +374.705 102.205 l +374.914 102.337 l +375.544 102.293 l +375.753 102.227 l +375.963 102.403 l +376.173 102.3 l +376.383 102.117 l +377.012 102.322 l +377.222 102.154 l +377.432 102.593 l +377.641 103.062 l +377.851 102.835 l +378.48 103.091 l +378.9 102.652 l +379.11 102.725 l +379.32 102.52 l +379.949 102.249 l +380.159 102.6 l +380.368 102.037 l +380.578 101.92 l +380.788 102.037 l +381.417 102.008 l +381.627 102.271 l +381.837 102.469 l +382.047 101.481 l +382.256 101.51 l +382.886 101.751 l +383.095 101.788 l +383.305 101.766 l +383.515 101.744 l +383.725 102.249 l +384.354 102.117 l +384.564 101.876 l +384.774 101.825 l +384.983 101.715 l +385.193 101.825 l +385.823 101.708 l +386.032 101.737 l +386.242 101.766 l +386.452 102.015 l +386.662 101.773 l +387.291 102.103 l +387.501 102.286 l +387.711 102.63 l +387.92 102.593 l +388.13 102.483 l +388.759 102.374 l +388.969 102.439 l +389.179 102.469 l +389.389 102.593 l +389.598 102.842 l +390.228 103.186 l +390.438 103.398 l +390.647 103.515 l +390.857 103.318 l +391.067 103.545 l +391.906 103.618 l +392.116 103.135 l +392.326 103.069 l +392.535 103.23 l +393.165 103.201 l +393.374 103.449 l +393.584 103.508 l +393.794 103.471 l +394.004 103.274 l +394.633 103.376 l +394.843 103.215 l +395.053 103.259 l +395.262 103.047 l +395.472 102.959 l +396.102 103.208 l +396.311 103.596 l +396.521 103.911 l +396.731 104.181 l +396.941 104.035 l +397.57 103.947 l +397.78 104.035 l +397.989 104.218 l +398.199 104.189 l +398.409 104.079 l +399.038 104.072 l +399.248 104.269 l +399.458 104.269 l +399.668 104.694 l +399.877 104.774 l +400.507 104.781 l +400.717 104.276 l +400.926 104.423 l +401.136 104.364 l +401.346 104.584 l +401.975 104.672 l +402.185 104.789 l +402.395 104.862 l +402.605 104.899 l +402.814 104.416 l +403.444 104.533 l +403.653 104.591 l +403.863 104.357 l +404.073 104.115 l +404.283 104.064 l +404.912 104.291 l +405.122 104.276 l +405.332 104.211 l +405.541 103.998 l +405.751 104.115 l +406.38 104.416 l +406.59 105.052 l +406.8 105.367 l +407.01 105.374 l +407.22 105.213 l +407.849 105.33 l +408.059 104.833 l +408.268 104.943 l +408.688 104.847 l +409.317 104.43 l +409.527 104.401 l +409.737 104.591 l +409.947 104.708 l +410.156 104.372 l +410.786 104.577 l +410.995 104.503 l +411.205 104.35 l +411.415 104.167 l +411.625 104.189 l +412.254 104.203 l +412.464 104.225 l +412.674 104.203 l +412.883 104.255 l +413.093 104.386 l +413.723 104.306 l +413.932 104.174 l +414.142 104.13 l +414.352 103.962 l +414.562 103.757 l +415.401 103.808 l +415.611 103.984 l +415.82 103.998 l +416.03 103.881 l +417.079 103.947 l +417.289 104.54 l +417.498 104.489 l +418.128 104.423 l +418.338 104.438 l +418.547 104.796 l +418.757 105.082 l +418.967 105.235 l +419.806 105.352 l +420.016 104.445 l +420.226 104.167 l +420.435 104.291 l +421.065 104.269 l +421.274 104.094 l +421.484 104.306 l +421.694 104.13 l +421.904 104.079 l +422.533 104.342 l +422.743 104.372 l +422.953 104.386 l +423.162 104.496 l +423.372 104.584 l +424.002 104.701 l +424.211 104.723 l +424.421 104.869 l +424.631 104.76 l +424.841 104.518 l +425.47 104.357 l +425.68 104.408 l +425.889 104.599 l +426.099 104.723 l +426.309 104.664 l +427.148 104.628 l +427.358 104.416 l +427.568 104.474 l +427.777 104.328 l +428.407 104.394 l +428.617 103.793 l +428.826 103.676 l +429.036 103.479 l +429.246 103.208 l +429.875 103.127 l +430.085 103.34 l +430.295 103.135 l +430.505 103.215 l +430.714 103.12 l +431.344 103.398 l +431.553 103.135 l +431.763 103.215 l +431.973 103.149 l +432.183 103.157 l +432.812 103.127 l +433.022 103.04 l +433.232 103.296 l +433.441 103.164 l +433.651 103.245 l +434.28 103.259 l +434.49 103.091 l +434.7 102.952 l +434.91 103.113 l +435.12 103.142 l +435.749 103.142 l +435.959 103.274 l +436.168 103.325 l +436.378 103.471 l +437.217 103.845 l +437.427 104.269 l +437.637 104.115 l +437.847 104.137 l +438.056 104.108 l +438.686 104.276 l +438.895 104.481 l +439.105 104.752 l +439.315 105.089 l +439.525 105.338 l +440.154 105.162 l +440.364 105.184 l +440.574 105.411 l +440.783 105.287 l +440.993 105.133 l +441.623 104.862 l +441.832 105.082 l +442.042 105.177 l +442.252 105.118 l +442.462 105.235 l +443.091 105.279 l +443.301 105.418 l +443.511 105.652 l +443.72 105.462 l +443.93 105.513 l +444.559 105.396 l +444.769 105.316 l +444.979 105.44 l +445.189 105.477 l +445.398 105.813 l +446.028 105.762 l +446.238 106.026 l +446.447 105.792 l +446.657 105.287 l +446.867 105.426 l +447.706 105.528 l +447.916 105.367 l +448.126 105.44 l +448.335 105.572 l +448.965 105.426 l +449.174 105.279 l +449.384 104.935 l +449.594 104.803 l +449.804 105.184 l +450.433 105.257 l +450.643 105.455 l +450.853 105.792 l +451.062 106.201 l +451.272 106.941 l +451.902 106.889 l +452.111 106.838 l +452.321 106.721 l +452.531 106.977 l +452.741 106.545 l +453.37 106.384 l +453.58 106.311 l +453.789 106.611 l +453.999 106.706 l +454.209 106.575 l +454.838 106.963 l +455.048 107.197 l +455.468 107.204 l +455.677 107.263 l +456.307 107.46 l +456.517 107.468 l +456.726 107.182 l +456.936 108.221 l +457.146 108.199 l +457.775 108.185 l +457.985 108.463 l +458.195 107.533 l +458.405 107.68 l +458.614 107.167 l +459.244 107.292 l +459.453 107.153 l +459.663 107.131 l +459.873 106.765 l +460.083 106.428 l +460.712 106.655 l +460.922 106.487 l +461.132 106.619 l +461.341 106.984 l +461.551 106.78 l +462.18 106.941 l +462.39 106.941 l +462.6 107.343 l +462.81 106.787 l +463.02 106.831 l +463.649 106.86 l +463.859 106.699 l +464.068 106.275 l +464.278 106.187 l +464.488 106.626 l +465.117 106.926 l +465.327 106.765 l +465.537 106.955 l +465.747 107.014 l +465.956 107.424 l +466.586 107.175 l +466.795 106.816 l +467.005 107.643 l +467.215 107.782 l +467.425 108.126 l +468.264 108.441 l +468.474 108.302 l +468.683 108.419 l +468.893 107.921 l +469.523 107.833 l +469.732 108.06 l +469.942 107.914 l +470.152 107.833 l +470.362 107.526 l +470.991 107.468 l +471.201 107.877 l +471.411 108.075 l +471.62 108.17 l +471.83 108.214 l +472.459 108.295 l +472.669 108.229 l +472.879 108.243 l +473.089 108.134 l +473.298 108.207 l +473.928 108.58 l +474.138 108.587 l +474.347 108.17 l +474.557 108.016 l +474.767 107.973 l +475.396 108.06 l +475.606 108.192 l +475.816 108.221 l +476.026 107.892 l +476.235 107.98 l +476.865 108.126 l +477.074 107.929 l +477.284 108.836 l +477.494 109.019 l +477.704 108.529 l +stroke +grestore +0.000 0.500 0.000 setrgbcolor +gsave +446.4 345.6 72 43.2 clipbox +110.389 100.8 m +110.598 100.815 l +111.228 101.026 l +111.438 101.247 l +111.647 100.91 l +111.857 101.247 l +112.067 101.272 l +112.696 101.372 l +112.906 101.497 l +113.116 101.347 l +113.326 101.151 l +113.535 100.313 l +114.374 100.288 l +114.584 100.218 l +114.794 100.489 l +115.004 99.9721 l +115.633 99.8266 l +115.843 99.7514 l +116.053 99.9822 l +116.262 99.6259 l +116.472 99.4553 l +117.102 99.6911 l +117.311 99.4252 l +117.521 99.35 l +117.731 99.4503 l +117.941 99.2697 l +118.57 99.4403 l +118.78 99.2396 l +118.989 99.2396 l +119.199 99.355 l +119.409 99.636 l +120.248 99.9872 l +120.458 99.8367 l +120.668 99.6661 l +120.877 99.8768 l +121.507 99.636 l +121.717 99.6861 l +121.926 99.4403 l +122.136 99.4252 l +122.346 99.4754 l +122.975 99.4102 l +123.185 99.2045 l +123.395 99.365 l +123.605 99.2948 l +123.814 99.4152 l +124.444 99.1543 l +124.653 99.0891 l +124.863 99.3449 l +125.073 99.8969 l +125.283 99.9771 l +125.912 100.439 l +126.122 100.484 l +126.332 100.604 l +126.541 100.574 l +126.751 100.715 l +127.38 100.163 l +127.59 100.248 l +127.8 100.143 l +128.01 100.052 l +128.22 99.8969 l +128.849 99.6962 l +129.059 99.7564 l +129.268 100.348 l +129.478 100.348 l +129.688 100.077 l +130.317 100.108 l +130.527 100.288 l +130.737 99.8517 l +130.947 99.8617 l +131.156 99.6911 l +131.786 99.932 l +131.995 99.8668 l +132.205 100.002 l +132.415 100.253 l +133.254 100.128 l +133.464 100.363 l +133.674 100.348 l +133.883 100.248 l +134.093 100.133 l +134.723 100.353 l +134.932 100.379 l +135.142 100.283 l +135.352 100.348 l +135.562 100.509 l +136.191 100.409 l +136.401 100.624 l +136.611 100.464 l +136.82 100.353 l +137.03 100.619 l +137.659 100.554 l +137.869 100.464 l +138.079 100.303 l +138.289 100.379 l +138.498 100.283 l +139.128 99.932 l +139.338 99.8768 l +139.547 99.6209 l +139.757 99.6761 l +139.967 99.7012 l +140.806 99.947 l +141.016 99.7815 l +141.226 99.7764 l +141.435 99.8668 l +142.065 99.8818 l +142.274 99.9872 l +142.484 99.9822 l +142.694 99.646 l +142.904 99.4654 l +143.533 99.5005 l +143.743 99.8969 l +143.953 99.9872 l +144.162 100.032 l +144.372 99.8868 l +145.002 100.203 l +145.211 100.449 l +145.421 100.499 l +145.631 100.499 l +145.841 100.609 l +146.47 100.374 l +146.68 100.338 l +146.889 100.148 l +147.099 100.358 l +147.309 100.308 l +147.938 100.313 l +148.148 100.529 l +148.358 100.845 l +148.568 100.685 l +149.407 101.076 l +149.617 101.196 l +149.826 101.101 l +150.036 100.86 l +150.246 101.031 l +150.875 101.071 l +151.085 101.016 l +151.295 101.121 l +151.505 100.765 l +151.714 100.85 l +152.344 100.484 l +152.553 100.629 l +152.763 100.66 l +152.973 100.469 l +153.183 100.85 l +153.812 100.73 l +154.022 100.67 l +154.232 100.564 l +154.441 100.644 l +154.651 100.539 l +155.28 100.544 l +155.49 100.318 l +155.7 100.318 l +155.91 100.343 l +156.12 100.288 l +156.749 100.298 l +156.959 100.348 l +157.168 100.293 l +157.378 100.308 l +157.588 100.268 l +158.217 100.338 l +158.427 100.735 l +158.637 100.66 l +158.847 100.569 l +159.056 100.559 l +159.686 100.685 l +159.895 100.715 l +160.105 100.649 l +160.315 100.685 l +160.525 100.69 l +161.364 101.011 l +161.574 101.457 l +161.783 101.512 l +161.993 101.492 l +162.623 101.688 l +162.832 101.487 l +163.042 101.136 l +163.252 101.257 l +163.462 101.472 l +164.091 101.482 l +164.301 101.713 l +164.511 101.543 l +164.72 101.974 l +164.93 102.17 l +165.559 101.788 l +165.769 102.014 l +165.979 101.528 l +166.189 101.432 l +166.398 101.407 l +167.028 101.683 l +167.238 101.242 l +167.447 101.553 l +167.657 101.543 l +167.867 101.793 l +168.496 101.839 l +168.706 101.819 l +168.916 101.678 l +169.126 101.733 l +169.335 101.718 l +169.965 101.663 l +170.174 101.618 l +170.384 101.859 l +170.594 101.929 l +170.804 101.798 l +171.433 101.979 l +171.643 101.979 l +171.853 101.778 l +172.062 101.788 l +172.272 100.795 l +172.902 100.925 l +173.111 101.051 l +173.321 100.85 l +173.531 100.579 l +173.741 100.589 l +174.37 100.825 l +174.58 100.559 l +174.789 100.574 l +174.999 100.629 l +175.209 100.574 l +175.838 100.529 l +176.048 100.444 l +176.258 100.519 l +176.468 100.394 l +176.677 100.313 l +177.307 100.163 l +177.517 100.163 l +177.726 100.248 l +177.936 100.143 l +178.146 100.143 l +178.775 100.414 l +178.985 100.268 l +179.195 100.293 l +179.614 100.404 l +180.244 100.459 l +180.453 100.384 l +180.663 100.389 l +180.873 100.614 l +181.083 100.519 l +181.712 100.634 l +181.922 100.695 l +182.132 100.785 l +182.341 100.795 l +182.551 100.81 l +183.18 100.85 l +183.39 100.991 l +183.6 100.981 l +183.81 101.136 l +184.02 101.116 l +184.649 101.041 l +184.859 101.026 l +185.068 100.981 l +185.488 101.051 l +186.117 101.161 l +186.327 101.186 l +186.537 101.121 l +186.956 101.156 l +187.586 101.457 l +187.795 101.497 l +188.005 101.487 l +188.215 101.462 l +188.425 101.247 l +189.054 101.211 l +189.264 101.146 l +189.474 101.267 l +189.683 101.196 l +189.893 101.312 l +190.732 101.437 l +190.942 101.523 l +191.152 101.397 l +191.362 101.603 l +191.991 101.743 l +192.201 101.502 l +192.411 101.272 l +192.62 101.357 l +192.83 101.242 l +193.459 101.136 l +193.669 101.086 l +193.879 100.966 l +194.089 100.946 l +194.298 100.996 l +194.928 100.92 l +195.138 100.971 l +195.347 101.026 l +195.557 100.94 l +195.767 100.785 l +196.606 100.961 l +196.816 100.865 l +197.026 100.73 l +197.235 100.775 l +197.865 100.795 l +198.074 100.91 l +198.284 100.835 l +198.494 100.745 l +198.704 100.76 l +199.333 100.835 l +199.543 100.7 l +199.753 100.69 l +199.962 100.69 l +200.172 100.68 l +200.802 100.454 l +201.011 100.409 l +201.221 100.258 l +201.431 100.138 l +201.641 100.263 l +202.27 100.168 l +202.48 100.173 l +202.689 100.153 l +202.899 100.047 l +203.109 99.937 l +203.738 99.8818 l +203.948 99.7313 l +204.158 99.8417 l +204.368 100.178 l +204.577 100.108 l +205.207 100.233 l +205.417 100.183 l +205.626 100.067 l +205.836 100.133 l +206.046 100.464 l +206.675 100.509 l +206.885 100.444 l +207.095 100.353 l +207.305 100.303 l +208.144 100.363 l +208.353 100.293 l +208.563 100.318 l +208.773 100.193 l +208.983 100.168 l +209.612 100.328 l +209.822 100.238 l +210.032 100.293 l +210.241 100.509 l +210.451 101.196 l +211.08 101.066 l +211.29 101.056 l +211.5 100.77 l +211.71 100.74 l +211.92 100.584 l +212.549 100.68 l +212.759 100.675 l +212.968 100.66 l +213.178 100.579 l +213.388 100.434 l +214.017 100.499 l +214.227 100.504 l +214.437 100.504 l +214.647 100.574 l +214.856 100.469 l +215.486 100.328 l +215.695 100.454 l +215.905 100.363 l +216.115 100.414 l +216.325 100.484 l +216.954 100.424 l +217.164 100.574 l +217.374 100.589 l +217.583 100.614 l +217.793 100.629 l +218.632 100.579 l +218.842 100.584 l +219.052 100.484 l +219.262 100.509 l +219.891 100.715 l +220.101 100.79 l +220.311 100.735 l +220.52 100.865 l +221.359 100.92 l +221.569 101.141 l +221.779 101.101 l +221.989 101.297 l +222.198 101.548 l +222.828 101.548 l +223.038 101.523 l +223.247 101.523 l +223.457 101.563 l +223.667 101.643 l +224.296 101.517 l +224.506 101.613 l +224.716 101.638 l +224.926 101.668 l +225.135 101.643 l +225.974 101.402 l +226.184 101.437 l +226.394 101.242 l +226.604 101.337 l +227.233 101.347 l +227.443 101.221 l +227.653 101.452 l +227.862 101.337 l +228.072 101.171 l +228.702 101.372 l +228.911 101.533 l +229.121 101.768 l +229.331 101.829 l +229.541 101.407 l +230.17 101.683 l +230.38 101.588 l +230.589 101.648 l +230.799 101.603 l +231.009 101.608 l +231.638 101.618 l +231.848 101.427 l +232.058 101.422 l +232.268 101.191 l +232.477 101.021 l +233.107 101.041 l +233.317 101.272 l +233.526 101.141 l +233.736 100.91 l +233.946 100.971 l +234.575 101.001 l +234.785 100.986 l +234.995 101.161 l +235.205 101.016 l +235.414 101.051 l +236.044 101.101 l +236.253 101.101 l +236.463 101.237 l +236.673 101.186 l +236.883 101.196 l +237.512 101.126 l +237.722 101.126 l +237.932 101.166 l +238.141 101.267 l +238.351 101.046 l +239.19 101.151 l +239.4 101.111 l +239.61 101.116 l +239.82 101.211 l +240.449 101.106 l +240.659 101.186 l +240.868 101.081 l +241.078 101.111 l +241.288 101.216 l +241.917 101.216 l +242.127 101.111 l +242.337 101.051 l +242.547 101.151 l +242.756 101.121 l +243.386 101.081 l +243.595 101.116 l +243.805 101.247 l +244.015 101.277 l +244.225 101.538 l +244.854 101.482 l +245.064 101.598 l +245.274 101.663 l +245.483 101.502 l +245.693 101.427 l +246.323 101.457 l +246.532 101.442 l +246.742 101.442 l +246.952 101.342 l +247.162 101.427 l +247.791 101.608 l +248.001 101.507 l +248.211 101.733 l +248.42 101.673 l +248.63 101.317 l +249.259 101.272 l +249.469 101.387 l +249.679 101.497 l +249.889 101.437 l +250.098 101.417 l +250.728 101.467 l +250.938 101.533 l +251.147 101.633 l +251.357 101.864 l +251.567 101.999 l +252.196 101.984 l +252.406 102.2 l +252.616 102.18 l +252.826 102.29 l +253.035 102.285 l +253.665 102.526 l +253.874 102.396 l +254.084 102.421 l +254.294 102.37 l +254.504 102.27 l +255.133 102.17 l +255.343 102.11 l +255.553 102.165 l +255.972 102.145 l +256.602 102.23 l +256.811 102.245 l +257.021 102.461 l +257.231 102.38 l +257.441 102.451 l +258.07 102.501 l +258.28 102.37 l +258.489 102.511 l +258.699 102.451 l +258.909 102.375 l +259.538 102.461 l +259.748 102.451 l +259.958 102.391 l +260.168 102.416 l +260.377 102.32 l +261.007 102.315 l +261.217 102.37 l +261.426 102.325 l +261.636 102.345 l +262.475 102.265 l +262.685 102.315 l +262.895 102.29 l +263.105 102.225 l +263.314 102.205 l +263.944 102.215 l +264.153 102.26 l +264.363 102.235 l +264.573 102.22 l +264.783 102.18 l +265.412 102.24 l +265.622 102.21 l +265.832 102.235 l +266.041 101.984 l +266.251 101.914 l +267.09 102.009 l +267.3 101.844 l +267.51 101.788 l +267.72 101.688 l +268.349 101.698 l +268.559 101.864 l +268.768 101.859 l +268.978 101.909 l +269.188 101.944 l +269.817 101.989 l +270.027 102.044 l +270.237 102.079 l +270.447 101.944 l +270.656 102.009 l +271.286 101.934 l +271.495 101.969 l +271.705 101.889 l +271.915 101.884 l +272.125 101.839 l +272.754 101.859 l +272.964 101.859 l +273.174 101.793 l +273.383 101.723 l +273.593 101.643 l +274.432 101.523 l +274.642 101.507 l +274.852 101.588 l +275.062 101.533 l +275.691 101.487 l +275.901 101.543 l +276.111 101.538 l +276.32 101.492 l +276.53 101.492 l +277.159 101.638 l +277.369 101.603 l +277.579 101.558 l +277.789 101.618 l +277.998 101.452 l +278.628 101.462 l +278.838 101.367 l +279.047 101.231 l +279.257 101.186 l +279.467 101.076 l +280.096 101.021 l +280.306 100.92 l +280.516 101.011 l +280.726 101.061 l +281.565 101.021 l +281.774 100.885 l +281.984 101.001 l +282.194 101.006 l +282.404 100.981 l +283.033 101.036 l +283.243 101.151 l +283.453 101.247 l +283.662 101.457 l +283.872 101.382 l +284.502 101.392 l +284.711 101.563 l +284.921 101.427 l +285.131 101.332 l +285.341 101.146 l +285.97 101.242 l +286.18 101.231 l +286.389 101.081 l +286.599 101.543 l +286.809 101.397 l +287.438 101.402 l +287.648 101.292 l +287.858 101.402 l +288.068 101.141 l +288.277 101.553 l +288.907 101.523 l +289.117 101.583 l +289.326 101.512 l +289.536 101.523 l +289.746 101.517 l +290.375 101.462 l +290.585 101.362 l +290.795 101.367 l +291.005 101.407 l +291.214 101.553 l +291.844 101.688 l +292.053 101.673 l +292.263 101.788 l +292.473 101.894 l +292.683 101.809 l +293.312 101.859 l +293.522 101.814 l +293.732 101.793 l +293.941 101.884 l +294.151 101.969 l +294.99 101.839 l +295.2 101.844 l +295.41 101.834 l +295.62 101.658 l +296.249 101.628 l +296.459 101.698 l +296.668 101.643 l +296.878 101.698 l +297.088 101.658 l +297.717 101.598 l +297.927 101.623 l +298.137 101.573 l +298.347 101.467 l +298.556 101.467 l +299.186 101.502 l +299.395 101.523 l +299.605 101.482 l +299.815 101.598 l +300.025 101.467 l +300.654 101.472 l +300.864 101.482 l +301.074 101.492 l +301.283 101.372 l +301.493 101.307 l +302.332 101.437 l +302.542 101.302 l +302.752 101.277 l +302.962 101.492 l +303.591 101.588 l +303.801 101.743 l +304.011 101.768 l +304.22 101.919 l +304.43 101.834 l +305.059 101.713 l +305.269 102.014 l +305.479 102.024 l +305.689 102.15 l +305.898 101.778 l +306.528 101.783 l +306.738 101.708 l +306.947 101.798 l +307.157 101.814 l +307.367 101.743 l +307.996 101.894 l +308.206 102.33 l +308.416 102.541 l +308.626 102.576 l +308.835 102.792 l +309.465 102.486 l +309.674 102.591 l +309.884 102.396 l +310.094 102.551 l +310.304 102.446 l +310.933 102.521 l +311.143 102.335 l +311.353 102.436 l +311.562 102.37 l +311.772 102.325 l +312.402 102.416 l +312.611 102.396 l +312.821 102.365 l +313.031 102.476 l +313.241 102.446 l +313.87 102.531 l +314.08 102.546 l +314.289 102.646 l +314.499 102.556 l +314.709 102.471 l +315.548 102.461 l +315.758 102.386 l +315.968 102.27 l +316.177 102.255 l +316.807 102.27 l +317.017 102.205 l +317.226 102.125 l +317.436 102.105 l +317.646 102.004 l +318.275 101.974 l +318.485 101.894 l +318.695 101.723 l +318.905 101.648 l +319.114 101.613 l +319.744 101.613 l +319.953 101.648 l +320.163 101.809 l +320.373 101.944 l +320.583 101.839 l +321.212 101.728 l +321.422 101.472 l +321.632 101.322 l +321.841 101.352 l +322.051 101.282 l +322.68 101.221 l +322.89 101.196 l +323.1 101.141 l +323.31 101.282 l +323.52 101.322 l +324.149 101.252 l +324.359 101.272 l +324.568 101.528 l +324.778 101.382 l +324.988 101.377 l +325.617 101.533 l +325.827 101.497 l +326.037 101.538 l +326.247 101.412 l +326.456 101.743 l +327.086 101.824 l +327.295 101.954 l +327.505 102.195 l +327.715 102.185 l +327.925 102.295 l +328.554 102.466 l +328.764 102.486 l +328.974 102.441 l +329.183 102.506 l +329.393 102.596 l +330.023 102.641 l +330.232 102.742 l +330.442 102.862 l +330.652 102.973 l +330.862 103.023 l +331.491 103.068 l +331.701 102.942 l +331.911 102.947 l +332.33 102.872 l +332.959 102.867 l +333.169 102.832 l +333.379 102.832 l +333.589 102.932 l +333.798 102.993 l +334.428 102.912 l +334.638 102.837 l +334.847 102.867 l +335.057 102.837 l +335.267 102.847 l +335.896 102.717 l +336.106 102.561 l +336.316 102.541 l +336.526 102.461 l +336.735 102.451 l +337.365 102.416 l +337.574 102.431 l +337.784 102.365 l +337.994 102.295 l +338.204 102.32 l +339.043 102.235 l +339.253 102.2 l +339.462 102.14 l +339.672 102.084 l +340.511 102.421 l +340.721 102.486 l +340.931 102.496 l +341.141 102.456 l +341.77 102.431 l +341.98 102.501 l +342.189 102.641 l +342.399 102.566 l +342.609 102.591 l +343.448 102.496 l +343.658 102.416 l +343.868 102.506 l +344.077 102.21 l +344.707 102.18 l +344.917 102.145 l +345.126 102.205 l +345.336 102.255 l +345.546 102.887 l +346.175 102.988 l +346.385 103.063 l +346.595 103.008 l +346.805 102.832 l +347.014 102.762 l +347.644 102.581 l +347.853 102.471 l +348.063 102.456 l +348.273 102.33 l +348.483 102.345 l +349.112 102.2 l +349.322 102.325 l +349.532 102.486 l +349.741 102.451 l +349.951 102.396 l +350.79 102.315 l +351 102.406 l +351.21 102.375 l +351.42 102.36 l +352.049 102.566 l +352.259 102.481 l +352.468 102.611 l +352.678 102.526 l +352.888 102.511 l +353.517 102.501 l +353.727 102.571 l +353.937 102.666 l +354.147 102.541 l +354.356 102.626 l +354.986 102.596 l +355.195 102.656 l +355.405 102.722 l +355.615 102.677 l +355.825 102.787 l +356.454 102.983 l +356.664 102.907 l +356.874 102.616 l +357.083 102.471 l +357.293 102.546 l +357.923 102.546 l +358.132 102.496 l +358.342 102.551 l +358.552 102.656 l +358.762 102.646 l +359.391 102.817 l +359.601 102.857 l +359.811 102.907 l +360.02 102.817 l +360.23 102.666 l +360.859 102.687 l +361.069 102.606 l +361.279 102.641 l +361.489 102.576 l +362.328 102.466 l +362.538 102.651 l +362.747 102.556 l +362.957 102.556 l +363.167 102.616 l +363.796 102.596 l +364.006 102.596 l +364.216 102.591 l +364.426 102.666 l +364.635 101.141 l +365.265 101.211 l +365.474 101.076 l +365.684 100.66 l +365.894 100.795 l +366.104 100.971 l +366.733 100.935 l +366.943 100.885 l +367.153 100.956 l +367.362 100.685 l +367.572 100.66 l +368.202 100.695 l +368.411 100.629 l +368.621 100.489 l +368.831 100.539 l +369.041 100.404 l +369.67 100.564 l +369.88 100.519 l +370.089 100.87 l +370.299 100.986 l +370.509 100.976 l +371.348 100.695 l +371.558 100.449 l +371.768 100.534 l +371.977 100.504 l +372.607 100.374 l +372.817 100.193 l +373.026 100.148 l +373.236 100.183 l +373.446 100.088 l +374.075 99.9872 l +374.285 99.8868 l +374.495 100.072 l +374.705 100.163 l +374.914 100.178 l +375.544 100.399 l +375.753 100.404 l +375.963 100.66 l +376.173 100.564 l +376.383 100.374 l +377.012 100.534 l +377.222 100.554 l +377.432 100.7 l +377.641 100.855 l +377.851 100.77 l +378.48 100.966 l +378.9 100.795 l +379.11 100.86 l +379.32 100.77 l +379.949 100.87 l +380.159 100.67 l +380.368 100.444 l +380.578 100.258 l +380.788 100.273 l +381.417 100.363 l +381.627 100.494 l +381.837 100.82 l +382.047 100.549 l +382.256 101.051 l +382.886 101.116 l +383.095 101.221 l +383.305 101.297 l +383.515 101.051 l +383.725 101.237 l +384.354 101.146 l +384.564 101.111 l +384.774 101.262 l +384.983 101.221 l +385.193 101.257 l +385.823 101.221 l +386.032 101.282 l +386.242 101.332 l +386.452 101.342 l +386.662 101.327 l +387.291 101.377 l +387.501 101.467 l +387.711 101.507 l +387.92 101.507 l +388.13 102.044 l +388.759 102.21 l +388.969 101.959 l +389.179 101.984 l +389.389 102.019 l +389.598 102.074 l +390.228 102.125 l +390.438 102.069 l +390.647 102.049 l +390.857 101.999 l +391.067 102.069 l +391.906 101.954 l +392.116 101.954 l +392.326 101.869 l +392.535 101.949 l +393.165 102.105 l +393.374 102.115 l +393.584 102.14 l +393.794 102.31 l +394.004 102.571 l +394.633 102.541 l +394.843 102.576 l +395.053 102.732 l +395.262 102.596 l +395.472 102.476 l +396.102 102.621 l +396.311 102.742 l +396.521 102.862 l +396.731 102.842 l +396.941 102.817 l +397.57 102.822 l +397.78 102.827 l +397.989 103.108 l +398.199 103.098 l +398.409 103.073 l +399.038 103.003 l +399.248 102.988 l +399.458 102.912 l +399.668 103.249 l +399.877 103.324 l +400.507 103.364 l +400.717 103.359 l +400.926 103.394 l +401.136 103.284 l +401.346 103.354 l +401.975 103.364 l +402.185 103.279 l +402.395 103.294 l +402.605 103.314 l +402.814 103.309 l +403.444 103.399 l +403.653 103.489 l +403.863 103.54 l +404.073 103.519 l +404.283 103.499 l +404.912 103.555 l +405.122 103.61 l +405.332 103.625 l +405.541 103.76 l +405.751 103.75 l +406.38 103.805 l +406.59 103.795 l +406.8 103.74 l +407.01 103.916 l +407.22 103.881 l +407.849 104.127 l +408.059 104.142 l +408.268 104.142 l +408.688 104.061 l +409.317 103.921 l +409.527 103.876 l +409.737 103.966 l +409.947 103.861 l +410.156 103.74 l +410.786 103.846 l +410.995 103.745 l +411.205 103.68 l +411.415 103.61 l +411.625 103.881 l +412.254 103.951 l +412.464 103.896 l +412.674 103.956 l +412.883 104.217 l +413.093 104.272 l +413.723 104.127 l +413.932 104.177 l +414.142 104.222 l +414.352 104.172 l +414.562 104.001 l +415.401 104.177 l +415.611 104.192 l +415.82 104.172 l +416.03 104.111 l +417.079 104.111 l +417.289 104.086 l +417.498 104.001 l +418.128 104.147 l +418.338 104.162 l +418.547 104.011 l +418.757 104.528 l +418.967 104.779 l +419.806 104.754 l +420.016 104.724 l +420.226 104.678 l +420.435 104.729 l +421.065 104.538 l +421.274 104.548 l +421.484 104.719 l +421.694 104.403 l +421.904 104.478 l +422.533 104.443 l +422.743 104.418 l +422.953 104.608 l +423.162 104.458 l +423.372 104.272 l +424.002 103.986 l +424.211 103.936 l +424.421 103.866 l +424.631 103.81 l +424.841 103.675 l +425.47 103.655 l +425.68 103.74 l +425.889 103.931 l +426.099 103.961 l +426.309 103.605 l +427.148 103.65 l +427.358 103.906 l +427.568 103.926 l +427.777 103.685 l +428.407 103.765 l +428.617 103.168 l +428.826 103.319 l +429.036 103.279 l +429.246 103.113 l +429.875 103.013 l +430.085 103.148 l +430.295 103.038 l +430.505 102.897 l +430.714 102.882 l +431.344 102.957 l +431.553 102.596 l +431.763 102.937 l +431.973 102.877 l +432.183 102.902 l +432.812 103.148 l +433.022 103.153 l +433.232 103.494 l +433.441 103.369 l +433.651 103.243 l +434.28 103.344 l +434.49 103.093 l +434.7 103.053 l +434.91 103.108 l +435.12 103.168 l +435.749 103.103 l +435.959 103.168 l +436.168 103.484 l +436.378 103.509 l +437.217 103.519 l +437.427 103.434 l +437.637 103.289 l +437.847 103.504 l +438.056 103.54 l +438.686 103.6 l +438.895 103.66 l +439.105 103.534 l +439.315 103.58 l +439.525 103.745 l +440.154 103.625 l +440.364 103.63 l +440.574 103.73 l +440.783 103.78 l +440.993 104.292 l +441.623 104.202 l +441.832 104.433 l +442.042 104.533 l +442.252 104.714 l +442.462 104.508 l +443.091 104.583 l +443.301 104.603 l +443.511 104.618 l +443.72 104.518 l +443.93 104.673 l +444.559 104.714 l +444.769 104.729 l +444.979 104.814 l +445.189 104.769 l +445.398 104.694 l +446.028 104.804 l +446.238 104.623 l +446.447 104.568 l +446.657 104.362 l +446.867 104.518 l +447.706 104.673 l +447.916 104.834 l +448.126 104.623 l +448.335 104.573 l +448.965 104.638 l +449.174 104.568 l +449.384 104.423 l +449.594 104.091 l +449.804 104.307 l +450.433 104.292 l +450.643 104.207 l +450.853 104.473 l +451.062 104.538 l +451.272 104.523 l +451.902 104.533 l +452.111 104.508 l +452.321 104.287 l +452.531 104.387 l +452.741 104.026 l +453.37 104.026 l +453.58 104.041 l +453.789 104.217 l +453.999 104.197 l +454.209 104.016 l +454.838 104.152 l +455.048 104.292 l +455.468 104.277 l +455.677 104.267 l +456.307 104.217 l +456.517 103.946 l +456.726 104.026 l +456.936 104.312 l +457.146 104.192 l +457.775 104.297 l +457.985 104.668 l +458.195 104.739 l +458.405 105.035 l +458.614 104.859 l +459.244 104.874 l +459.453 104.678 l +459.663 104.633 l +459.873 104.272 l +460.083 103.976 l +460.712 103.981 l +460.922 103.775 l +461.132 103.931 l +461.341 104.041 l +461.551 103.76 l +462.18 104.051 l +462.39 104.056 l +462.6 104.282 l +462.81 103.931 l +463.02 103.635 l +463.649 103.595 l +463.859 103.464 l +464.068 103.379 l +464.278 103.233 l +464.488 103.454 l +465.117 103.459 l +465.327 103.364 l +465.537 103.439 l +465.747 103.479 l +465.956 103.735 l +466.586 103.575 l +466.795 103.294 l +467.005 103.625 l +467.215 103.555 l +467.425 103.695 l +468.264 103.735 l +468.474 103.57 l +468.683 103.785 l +468.893 103.55 l +469.523 103.57 l +469.732 103.795 l +469.942 103.795 l +470.152 103.911 l +470.362 103.851 l +470.991 103.695 l +471.201 103.795 l +471.411 103.665 l +471.62 103.54 l +471.83 103.655 l +472.459 103.871 l +472.669 104.111 l +472.879 104.081 l +473.089 104.076 l +473.298 104.061 l +473.928 104.217 l +474.138 104.182 l +474.347 104.056 l +474.557 104.187 l +474.767 104.252 l +475.396 104.252 l +475.606 104.382 l +475.816 104.448 l +476.026 104.287 l +476.235 104.418 l +476.865 104.352 l +477.074 104.493 l +477.284 104.874 l +477.494 104.914 l +477.704 104.418 l +stroke +grestore +1.000 0.000 0.000 setrgbcolor +gsave +446.4 345.6 72 43.2 clipbox +110.389 100.8 m +110.598 101.127 l +111.228 101.677 l +111.438 101.808 l +111.647 101.559 l +111.857 102.004 l +112.067 102.371 l +112.696 102.161 l +112.906 102.175 l +113.116 102.096 l +113.326 101.559 l +113.535 101.311 l +114.374 101.009 l +114.584 101.376 l +114.794 101.769 l +115.004 101.572 l +115.633 101.14 l +115.843 101.468 l +116.053 101.599 l +116.262 101.127 l +116.472 101.193 l +117.102 101.036 l +117.311 100.905 l +117.521 100.931 l +117.731 101.023 l +117.941 100.761 l +118.57 101.009 l +118.78 101.258 l +118.989 101.18 l +119.199 101.088 l +119.409 101.651 l +120.248 102.031 l +120.458 101.965 l +120.668 102.188 l +120.877 102.253 l +121.507 102.161 l +121.717 102.371 l +121.926 102.175 l +122.136 102.423 l +122.346 102.934 l +122.975 102.319 l +123.185 102.292 l +123.395 102.305 l +123.605 102.004 l +123.814... [truncated message content] |
From: <jd...@us...> - 2007-10-20 21:23:57
|
Revision: 3972 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3972&view=rev Author: jdh2358 Date: 2007-10-20 14:23:56 -0700 (Sat, 20 Oct 2007) Log Message: ----------- added stock records CSV example Added Paths: ----------- trunk/py4science/examples/skel/stock_records_skel.py trunk/py4science/examples/stock_records.py Added: trunk/py4science/examples/skel/stock_records_skel.py =================================================================== --- trunk/py4science/examples/skel/stock_records_skel.py (rev 0) +++ trunk/py4science/examples/skel/stock_records_skel.py 2007-10-20 21:23:56 UTC (rev 3972) @@ -0,0 +1,71 @@ +""" +Download historical pricing record arrays for a universe of stocks +from Yahoo Finance using urllib. Load them into numpy record arrays +using matplotlib.mlab.csv2rec, and do some batch processing -- make +date vs price charts for each one, and compute the return since 2003 +for each stock. Sort the returns and print out the tickers of the 4 +biggest winners +""" +import os, datetime, urllib +import matplotlib.mlab as mlab # contains csv2rec +import numpy as npy +import pylab as p + +def fetch_stock(ticker): + """ + download the CSV file for stock with ticker and return a numpy + record array. Save the CSV file as TICKER.csv where TICKER is the + stock's ticker symbol. + + Extra credit for supporting a start date and end date, and + checking to see if the file already exists on the local file + system before re-downloading it + """ + fname = '%s.csv'%ticker + url = XXX # create the url for this ticker + + # the os.path module contains function for checking whether a file + # exists, and fetch it if not + XXX + + # load the CSV file intoo a numpy record array + r = XXX + + # note that the CSV file is sorted most recent date first, so you + # will probably want to sort the record array so most recent date + # is last + XXX + return r + +tickers = 'INTC', 'MSFT', 'YHOO', 'GOOG', 'GE', 'WMT', 'AAPL' + +# we want to compute returns since 2003, so define the start date as a +# datetime.datetime instance +startdate = XXX + +# we'll store a list of each return and ticker for analysis later +data = [] # a list of (return, ticker) for each stock +fig = p.figure() +for ticker in tickers: + print 'fetching', ticker + r = fetch_stock(ticker) + + # select the numpy records where r.date>=startdatre use numpy mask + # indexing to restrict r to just the dates > startdate + r = XXX + price = XXX # set price equal to the adjusted close + returns = XXX # return is the (price-p0)/p0 + XXX # store the data + + # plot the returns by date for each stock using pylab.plot, adding + # a label for the legend + XXX + +# use pylab legend command to build a legend +XXX + +# now sort the data by returns and print the results for each stock +XXX + +# show the figures +p.show() Added: trunk/py4science/examples/stock_records.py =================================================================== --- trunk/py4science/examples/stock_records.py (rev 0) +++ trunk/py4science/examples/stock_records.py 2007-10-20 21:23:56 UTC (rev 3972) @@ -0,0 +1,72 @@ +""" +Download historical pricing record arrays for a universe of stocks +from Yahoo Finance using urllib. Load them into numpy record arrays +using matplotlib.mlab.csv2rec, and do some batch processing -- make +date vs price charts for each one, and compute the return since 2003 +for each stock. Sort the returns and print out the tickers of the 4 +biggest winners +""" +import os, datetime, urllib +import matplotlib.mlab as mlab # contains csv2rec +import numpy as npy +import pylab as p + +def fetch_stock(ticker): + """ + download the CSV file for stock with ticker and return a numpy + record array. Save the CSV file as TICKER.csv where TICKER is the + stock's ticker symbol. + + Extra credit for supporting a start date and end date, and + checking to see if the file already exists on the local file + system before re-downloading it + """ + fname = '%s.csv'%ticker + url = 'http://ichart.finance.yahoo.com/table.csv?' +\ + 's=%s&d=9&e=20&f=2007&g=d&a=0&b=29&c=1993&ignore=.csv'%ticker + + # the os.path module contains function for checking whether a file + # exists + if not os.path.exists(fname): + urllib.urlretrieve(url, fname) + r = mlab.csv2rec(fname) + + # note that the CSV file is sorted most recent date first, so you + # will probably want to sort the record array so most recent date + # is last + r.sort() + return r + +tickers = 'INTC', 'MSFT', 'YHOO', 'GOOG', 'GE', 'WMT', 'AAPL' + +# we want to compute returns since 2003, so define the start date +startdate = datetime.datetime(2003,1,1) + +# we'll store a list of each return and ticker for analysis later +data = [] # a list of (return, ticker) for each stock +fig = p.figure() +for ticker in tickers: + print 'fetching', ticker + r = fetch_stock(ticker) + + # select the numpy records where r.date>=startdatre + + r = r[r.date>=startdate] + price = r.adj_close # set price equal to the adjusted close + returns = (price-price[0])/price[0] # return is the (price-p0)/p0 + data.append((returns[-1], ticker)) # store the data + + # plot the returns by date for each stock + p.plot(r.date, returns, label=ticker) + +p.legend(loc='upper left') + +# now sort the data by returns and print the results for each stock +data.sort() +for g, ticker in data: + print '%s: %1.1f%%'%(ticker, 100*g) + + +p.savefig('fig/stock_records.png', dpi=100) +p.savefig('fig/stock_records.eps') +p.show() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-20 17:57:39
|
Revision: 3971 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3971&view=rev Author: jdh2358 Date: 2007-10-20 10:57:36 -0700 (Sat, 20 Oct 2007) Log Message: ----------- added files workbook Added Paths: ----------- trunk/py4science/examples/skel/noisy_sine_skel.py trunk/py4science/workbook/fig/noisy_sine.eps trunk/py4science/workbook/fig/noisy_sine.png trunk/py4science/workbook/files_etc.tex Added: trunk/py4science/examples/skel/noisy_sine_skel.py =================================================================== --- trunk/py4science/examples/skel/noisy_sine_skel.py (rev 0) +++ trunk/py4science/examples/skel/noisy_sine_skel.py 2007-10-20 17:57:36 UTC (rev 3971) @@ -0,0 +1,22 @@ +from scipy import arange, sin, pi, randn, zeros +import pylab as p + +a = 2 # 2 volt amplitude +f = 10 # 10 Hz frequency +sigma = 0.5 # 0.5 volt standard deviation noise + +# create the t and v arrays; see the scipy commands arange, sin, and randn +t = XXX # an evenly sampled time array +v = XXX # a noisy sine wave + +# create a 2D array X and put t in the 1st column and v in the 2nd; +# see the numpy command zeros +X = XXX + +# save the output file as ASCII; see the pylab command save +XXX + +# plot the arrays t vs v and label the x-axis, y-axis and title save +# the output figure as noisy_sine.png. See the pylab commands plot, +# xlabel, ylabel, grid, show +XXX Added: trunk/py4science/workbook/fig/noisy_sine.eps =================================================================== --- trunk/py4science/workbook/fig/noisy_sine.eps (rev 0) +++ trunk/py4science/workbook/fig/noisy_sine.eps 2007-10-20 17:57:36 UTC (rev 3971) @@ -0,0 +1,954 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: noisy_sine.eps +%%Creator: matplotlib version 0.90.1, http://matplotlib.sourceforge.net/ +%%CreationDate: Sat Oct 20 11:42:38 2007 +%%Orientation: portrait +%%BoundingBox: 18 180 594 612 +%%EndComments +%%BeginProlog +/mpldict 7 dict def +mpldict begin +/m { moveto } bind def +/l { lineto } bind def +/r { rlineto } bind def +/box { +m +1 index 0 r +0 exch r +neg 0 r +closepath +} bind def +/clipbox { +box +clip +newpath +} bind def +/ellipse { +newpath +matrix currentmatrix 7 1 roll +translate +scale +0 0 1 5 3 roll arc +setmatrix +closepath +} bind def +%!PS-Adobe-3.0 Resource-Font +%%Title: Bitstream Vera Sans +%%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +%%Creator: Converted from TrueType by PPR +25 dict begin +/_d{bind def}bind def +/_m{moveto}_d +/_l{lineto}_d +/_cl{closepath eofill}_d +/_c{curveto}_d +/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d +/_e{exec}_d +/FontName /BitstreamVeraSans-Roman def +/PaintType 0 def +/FontMatrix[.001 0 0 .001 0 0]def +/FontBBox[-182 -235 1287 928]def +/FontType 3 def +/Encoding StandardEncoding def +/FontInfo 10 dict dup begin +/FamilyName (Bitstream Vera Sans) def +/FullName (Bitstream Vera Sans) def +/Notice (Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.) def +/Weight (Roman) def +/Version (Release 1.10) def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -213 def +/UnderlineThickness 143 def +end readonly def +/CharStrings 25 dict dup begin +/space{318 0 0 0 0 0 _sc +}_d +/parenleft{390 0 86 -131 310 759 _sc +310 759 _m +266 683 234 609 213 536 _c +191 463 181 389 181 314 _c +181 238 191 164 213 91 _c +234 17 266 -56 310 -131 _c +232 -131 _l +183 -54 146 20 122 94 _c +98 168 86 241 86 314 _c +86 386 98 459 122 533 _c +146 607 182 682 232 759 _c +310 759 _l +_cl}_d +/parenright{390 0 80 -131 304 759 _sc +80 759 _m +158 759 _l +206 682 243 607 267 533 _c +291 459 304 386 304 314 _c +304 241 291 168 267 94 _c +243 20 206 -54 158 -131 _c +80 -131 _l +123 -56 155 17 177 91 _c +198 164 209 238 209 314 _c +209 389 198 463 177 536 _c +155 609 123 683 80 759 _c +_cl}_d +/hyphen{361 0 49 234 312 314 _sc +49 314 _m +312 314 _l +312 234 _l +49 234 _l +49 314 _l +_cl}_d +/period{318 0 107 0 210 124 _sc +107 124 _m +210 124 _l +210 0 _l +107 0 _l +107 124 _l +_cl}_d +/zero{636 0 66 -13 570 742 _sc +318 664 _m +267 664 229 639 203 589 _c +177 539 165 464 165 364 _c +165 264 177 189 203 139 _c +229 89 267 64 318 64 _c +369 64 407 89 433 139 _c +458 189 471 264 471 364 _c +471 464 458 539 433 589 _c +407 639 369 664 318 664 _c +318 742 _m +399 742 461 709 505 645 _c +548 580 570 486 570 364 _c +570 241 548 147 505 83 _c +461 19 399 -13 318 -13 _c +236 -13 173 19 130 83 _c +87 147 66 241 66 364 _c +66 486 87 580 130 645 _c +173 709 236 742 318 742 _c +_cl}_d +/one{636 0 110 0 544 729 _sc +124 83 _m +285 83 _l +285 639 _l +110 604 _l +110 694 _l +284 729 _l +383 729 _l +383 83 _l +544 83 _l +544 0 _l +124 0 _l +124 83 _l +_cl}_d +/two{{636 0 73 0 536 742 _sc +192 83 _m +536 83 _l +536 0 _l +73 0 _l +73 83 _l +110 121 161 173 226 239 _c +290 304 331 346 348 365 _c +380 400 402 430 414 455 _c +426 479 433 504 433 528 _c +433 566 419 598 392 622 _c +365 646 330 659 286 659 _c +255 659 222 653 188 643 _c +154 632 117 616 78 594 _c +78 694 _l +118 710 155 722 189 730 _c +223 738 255 742 284 742 _c +359 742 419 723 464 685 _c +509 647 532 597 532 534 _c +532 504 526 475 515 449 _c +504 422 484 390 454 354 _c +446 344 420 317 376 272 _c +332 227 271 164 192 83 _c +_cl}_e}_d +/three{{636 0 76 -13 556 742 _sc +406 393 _m +453 383 490 362 516 330 _c +542 298 556 258 556 212 _c +556 140 531 84 482 45 _c +432 6 362 -13 271 -13 _c +240 -13 208 -10 176 -4 _c +144 1 110 10 76 22 _c +76 117 _l +103 101 133 89 166 81 _c +198 73 232 69 268 69 _c +330 69 377 81 409 105 _c +441 129 458 165 458 212 _c +458 254 443 288 413 312 _c +383 336 341 349 287 349 _c +202 349 _l +202 430 _l +291 430 _l +339 430 376 439 402 459 _c +428 478 441 506 441 543 _c +441 580 427 609 401 629 _c +374 649 336 659 287 659 _c +260 659 231 656 200 650 _c +169 644 135 635 98 623 _c +98 711 _l +135 721 170 729 203 734 _c +235 739 266 742 296 742 _c +}_e{370 742 429 725 473 691 _c +517 657 539 611 539 553 _c +539 513 527 479 504 451 _c +481 423 448 403 406 393 _c +_cl}_e}_d +/four{636 0 49 0 580 729 _sc +378 643 _m +129 254 _l +378 254 _l +378 643 _l +352 729 _m +476 729 _l +476 254 _l +580 254 _l +580 172 _l +476 172 _l +476 0 _l +378 0 _l +378 172 _l +49 172 _l +49 267 _l +352 729 _l +_cl}_d +/five{{636 0 77 -13 549 729 _sc +108 729 _m +495 729 _l +495 646 _l +198 646 _l +198 467 _l +212 472 227 476 241 478 _c +255 480 270 482 284 482 _c +365 482 429 459 477 415 _c +525 370 549 310 549 234 _c +549 155 524 94 475 51 _c +426 8 357 -13 269 -13 _c +238 -13 207 -10 175 -6 _c +143 -1 111 6 77 17 _c +77 116 _l +106 100 136 88 168 80 _c +199 72 232 69 267 69 _c +323 69 368 83 401 113 _c +433 143 450 183 450 234 _c +450 284 433 324 401 354 _c +368 384 323 399 267 399 _c +241 399 214 396 188 390 _c +162 384 135 375 108 363 _c +108 729 _l +_cl}_e}_d +/A{684 0 8 0 676 729 _sc +342 632 _m +208 269 _l +476 269 _l +342 632 _l +286 729 _m +398 729 _l +676 0 _l +573 0 _l +507 187 _l +178 187 _l +112 0 _l +8 0 _l +286 729 _l +_cl}_d +/V{684 0 8 0 676 729 _sc +286 0 _m +8 729 _l +111 729 _l +342 115 _l +573 729 _l +676 729 _l +398 0 _l +286 0 _l +_cl}_d +/a{{613 0 60 -13 522 560 _sc +343 275 _m +270 275 220 266 192 250 _c +164 233 150 205 150 165 _c +150 133 160 107 181 89 _c +202 70 231 61 267 61 _c +317 61 357 78 387 114 _c +417 149 432 196 432 255 _c +432 275 _l +343 275 _l +522 312 _m +522 0 _l +432 0 _l +432 83 _l +411 49 385 25 355 10 _c +325 -5 287 -13 243 -13 _c +187 -13 142 2 109 33 _c +76 64 60 106 60 159 _c +60 220 80 266 122 298 _c +163 329 224 345 306 345 _c +432 345 _l +432 354 _l +432 395 418 427 391 450 _c +364 472 326 484 277 484 _c +245 484 215 480 185 472 _c +155 464 127 453 100 439 _c +100 522 _l +}_e{132 534 164 544 195 550 _c +226 556 256 560 286 560 _c +365 560 424 539 463 498 _c +502 457 522 395 522 312 _c +_cl}_e}_d +/e{{615 0 55 -13 562 560 _sc +562 296 _m +562 252 _l +149 252 _l +153 190 171 142 205 110 _c +238 78 284 62 344 62 _c +378 62 412 66 444 74 _c +476 82 509 95 541 113 _c +541 28 _l +509 14 476 3 442 -3 _c +408 -9 373 -13 339 -13 _c +251 -13 182 12 131 62 _c +80 112 55 181 55 268 _c +55 357 79 428 127 481 _c +175 533 241 560 323 560 _c +397 560 455 536 498 489 _c +540 441 562 377 562 296 _c +472 322 _m +471 371 457 410 431 440 _c +404 469 368 484 324 484 _c +274 484 234 469 204 441 _c +174 413 156 373 152 322 _c +472 322 _l +_cl}_e}_d +/i{278 0 94 0 184 760 _sc +94 547 _m +184 547 _l +184 0 _l +94 0 _l +94 547 _l +94 760 _m +184 760 _l +184 646 _l +94 646 _l +94 760 _l +_cl}_d +/l{278 0 94 0 184 760 _sc +94 760 _m +184 760 _l +184 0 _l +94 0 _l +94 760 _l +_cl}_d +/m{{974 0 91 0 889 560 _sc +520 442 _m +542 482 569 511 600 531 _c +631 550 668 560 711 560 _c +767 560 811 540 842 500 _c +873 460 889 403 889 330 _c +889 0 _l +799 0 _l +799 327 _l +799 379 789 418 771 444 _c +752 469 724 482 686 482 _c +639 482 602 466 575 435 _c +548 404 535 362 535 309 _c +535 0 _l +445 0 _l +445 327 _l +445 379 435 418 417 444 _c +398 469 369 482 331 482 _c +285 482 248 466 221 435 _c +194 404 181 362 181 309 _c +181 0 _l +91 0 _l +91 547 _l +181 547 _l +181 462 _l +201 495 226 520 255 536 _c +283 552 317 560 357 560 _c +397 560 430 550 458 530 _c +486 510 506 480 520 442 _c +}_e{_cl}_e}_d +/n{634 0 91 0 549 560 _sc +549 330 _m +549 0 _l +459 0 _l +459 327 _l +459 379 448 417 428 443 _c +408 469 378 482 338 482 _c +289 482 251 466 223 435 _c +195 404 181 362 181 309 _c +181 0 _l +91 0 _l +91 547 _l +181 547 _l +181 462 _l +202 494 227 519 257 535 _c +286 551 320 560 358 560 _c +420 560 468 540 500 501 _c +532 462 549 405 549 330 _c +_cl}_d +/o{612 0 55 -13 557 560 _sc +306 484 _m +258 484 220 465 192 427 _c +164 389 150 338 150 273 _c +150 207 163 156 191 118 _c +219 80 257 62 306 62 _c +354 62 392 80 420 118 _c +448 156 462 207 462 273 _c +462 337 448 389 420 427 _c +392 465 354 484 306 484 _c +306 560 _m +384 560 445 534 490 484 _c +534 433 557 363 557 273 _c +557 183 534 113 490 63 _c +445 12 384 -13 306 -13 _c +227 -13 165 12 121 63 _c +77 113 55 183 55 273 _c +55 363 77 433 121 484 _c +165 534 227 560 306 560 _c +_cl}_d +/s{{521 0 54 -13 472 560 _sc +443 531 _m +443 446 _l +417 458 391 468 364 475 _c +336 481 308 485 279 485 _c +234 485 200 478 178 464 _c +156 450 145 430 145 403 _c +145 382 153 366 169 354 _c +185 342 217 330 265 320 _c +296 313 _l +360 299 405 279 432 255 _c +458 230 472 195 472 151 _c +472 100 452 60 412 31 _c +372 1 316 -13 246 -13 _c +216 -13 186 -10 154 -5 _c +122 0 89 8 54 20 _c +54 113 _l +87 95 120 82 152 74 _c +184 65 216 61 248 61 _c +290 61 323 68 346 82 _c +368 96 380 117 380 144 _c +380 168 371 187 355 200 _c +339 213 303 226 247 238 _c +216 245 _l +160 257 119 275 95 299 _c +70 323 58 356 58 399 _c +58 450 76 490 112 518 _c +148 546 200 560 268 560 _c +}_e{301 560 332 557 362 552 _c +391 547 418 540 443 531 _c +_cl}_e}_d +/t{392 0 27 0 368 702 _sc +183 702 _m +183 547 _l +368 547 _l +368 477 _l +183 477 _l +183 180 _l +183 135 189 106 201 94 _c +213 81 238 75 276 75 _c +368 75 _l +368 0 _l +276 0 _l +206 0 158 13 132 39 _c +106 65 93 112 93 180 _c +93 477 _l +27 477 _l +27 547 _l +93 547 _l +93 702 _l +183 702 _l +_cl}_d +/v{592 0 30 0 562 547 _sc +30 547 _m +125 547 _l +296 88 _l +467 547 _l +562 547 _l +357 0 _l +235 0 _l +30 547 _l +_cl}_d +/w{818 0 42 0 776 547 _sc +42 547 _m +132 547 _l +244 120 _l +356 547 _l +462 547 _l +574 120 _l +686 547 _l +776 547 _l +633 0 _l +527 0 _l +409 448 _l +291 0 _l +185 0 _l +42 547 _l +_cl}_d +/y{592 0 30 -207 562 547 _sc +322 -50 _m +296 -114 271 -157 247 -177 _c +223 -197 191 -207 151 -207 _c +79 -207 _l +79 -132 _l +132 -132 _l +156 -132 175 -126 189 -114 _c +203 -102 218 -75 235 -31 _c +251 9 _l +30 547 _l +125 547 _l +296 119 _l +467 547 _l +562 547 _l +322 -50 _l +_cl}_d +end readonly def + +/BuildGlyph + {exch begin + CharStrings exch + 2 copy known not{pop /.notdef}if + true 3 1 roll get exec + end}_d + +/BuildChar { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec +}_d + +FontName currentdict end definefont pop +%%EOF +end +%%EndProlog +mpldict begin +18 180 translate +576 432 0 0 clipbox +1.000 setgray +1.000 setlinewidth +0 setlinejoin +2 setlinecap +[] 0 setdash +0 0 m +0 432 l +576 432 l +576 0 l +closepath +gsave +fill +grestore +stroke +0.000 setgray +72 43.2 m +72 388.8 l +518.4 388.8 l +518.4 43.2 l +closepath +gsave +1.000 setgray +fill +grestore +stroke +0.000 0.000 1.000 setrgbcolor +gsave +446.4 345.6 72 43.2 clipbox +72 192.08 m +76.464 314.444 l +80.928 238.206 l +85.392 145.963 l +89.856 52.5249 l +94.32 177.605 l +98.784 244.507 l +103.248 225.898 l +107.712 141.274 l +112.176 101.132 l +116.64 221.273 l +121.104 220.387 l +125.568 198.393 l +130.032 110.626 l +134.496 87.2167 l +138.96 172.301 l +143.424 288.57 l +147.888 223.822 l +152.352 109.895 l +156.816 99.5877 l +161.28 161.557 l +165.744 327.85 l +170.208 226.413 l +174.672 119.61 l +179.136 160.455 l +183.6 170.923 l +188.064 276.783 l +192.528 252.279 l +196.992 93.6217 l +201.456 102.264 l +205.92 231.631 l +210.384 344.07 l +214.848 237.692 l +219.312 118.454 l +223.776 88.4453 l +228.24 156.313 l +232.704 288.34 l +237.168 265.415 l +241.632 167.558 l +246.096 89.9739 l +250.56 176.91 l +255.024 291.251 l +259.488 263.848 l +263.952 152.691 l +268.416 113.887 l +272.88 209.028 l +277.344 335.703 l +281.808 269.446 l +286.272 94.2113 l +290.736 103.596 l +295.2 177.029 l +299.664 270.441 l +304.128 238.945 l +308.592 118.646 l +313.056 125.076 l +317.52 184.406 l +321.984 271.919 l +326.448 271.253 l +330.912 119.814 l +335.376 72.1308 l +339.84 129.271 l +344.304 273.684 l +348.768 291.815 l +353.232 113.503 l +357.696 77.032 l +362.16 204.519 l +366.624 272.078 l +371.088 226.513 l +375.552 141.138 l +380.016 95.2778 l +384.48 204.455 l +388.944 287.641 l +393.408 229.498 l +397.872 126.356 l +402.336 106.437 l +406.8 210.134 l +411.264 265.254 l +415.728 240.776 l +420.192 105.556 l +424.656 141.974 l +429.12 200.065 l +433.584 290.119 l +438.048 258.193 l +442.512 168.972 l +446.976 59.1563 l +451.44 194.952 l +455.904 311.614 l +460.368 199.751 l +464.832 132.967 l +469.296 76.716 l +473.76 232.12 l +478.224 278.764 l +482.688 217.446 l +487.152 148.717 l +491.616 86.2078 l +496.08 175.329 l +500.544 272.56 l +505.008 227.057 l +509.472 80.2823 l +513.936 93.877 l +stroke +grestore +0.000 setgray +/BitstreamVeraSans-Roman findfont +12.000 scalefont +setfont +63.25 30.122 m +0 0.172 rmoveto +(0.0) show +0.500 setlinewidth +0 setlinecap +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +183.6 43.2 m +183.6 388.8 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +-0.5 0 m +-0.5 4 l +closepath +stroke +grestore } bind def +183.6 43.2 o +/o { gsave +newpath +translate +-0.5 -4 m +-0.5 0 l +closepath +stroke +grestore } bind def +183.6 388.8 o +174.975 30.122 m +0 0.172 rmoveto +(0.5) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +295.2 43.2 m +295.2 388.8 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +-0.5 0 m +-0.5 4 l +closepath +stroke +grestore } bind def +295.2 43.2 o +/o { gsave +newpath +translate +-0.5 -4 m +-0.5 0 l +closepath +stroke +grestore } bind def +295.2 388.8 o +286.708 30.122 m +0 0.172 rmoveto +(1.0) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +406.8 43.2 m +406.8 388.8 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +-0.5 0 m +-0.5 4 l +closepath +stroke +grestore } bind def +406.8 43.2 o +/o { gsave +newpath +translate +-0.5 -4 m +-0.5 0 l +closepath +stroke +grestore } bind def +406.8 388.8 o +398.433 30.278 m +0 0.172 rmoveto +(1.5) show +509.689 30.122 m +0 0.172 rmoveto +(2.0) show +272.442 14.419 m +0 1.578 rmoveto +(time \(s\)) show +57.594 38.661 m +0 0.172 rmoveto +(-3) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 92.5714 m +518.4 92.5714 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 92.5714 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 92.5714 o +57.828 88.118 m +(-2) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 141.943 m +518.4 141.943 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 141.943 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 141.943 o +57.734 137.568 m +(-1) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 191.314 m +518.4 191.314 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 191.314 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 191.314 o +61.953 186.775 m +0 0.172 rmoveto +(0) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 240.686 m +518.4 240.686 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 240.686 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 240.686 o +62.781 236.311 m +(1) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 290.057 m +518.4 290.057 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 290.057 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 290.057 o +62.438 285.604 m +(2) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 339.429 m +518.4 339.429 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 339.429 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 339.429 o +62.25 334.89 m +0 0.172 rmoveto +(3) show +61.625 384.425 m +(4) show +52.594 191.453 m +gsave +90 rotate +0 1.578 rmoveto +(volts \(V\)) show +grestore +1.000 setlinewidth +2 setlinecap +72 43.2 m +518.4 43.2 l +518.4 388.8 l +72 388.8 l +72 43.2 l +stroke +/BitstreamVeraSans-Roman findfont +14.000 scalefont +setfont +232.848 395.712 m +0 2.906 rmoveto +(A noisy sine wave) show + +end +showpage Added: trunk/py4science/workbook/fig/noisy_sine.png =================================================================== (Binary files differ) Property changes on: trunk/py4science/workbook/fig/noisy_sine.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/py4science/workbook/files_etc.tex =================================================================== --- trunk/py4science/workbook/files_etc.tex (rev 0) +++ trunk/py4science/workbook/files_etc.tex 2007-10-20 17:57:36 UTC (rev 3971) @@ -0,0 +1,117 @@ +\section{Working with files, the web, arrays, etc\dots} +\label{sec:working_with_files} + +This section is a general overview to show how easy it is to load +and manipulate data on the file system and over the web using python's +built in data structures and numpy arrays. The goal is to exercise +basic programming skills like building filename or web addresses to +automate certain tasks like loading a series of data files or +downloading a bunch of related files off the web, as well as to +illustrate basic numpy and pylab skills. + +\subsection{Loading and saving ASCII data} +\label{sec:ascii_data} + +The simplest file format is a plain text ASCII file of numbers. +Although there are many better formats out there for saveing and +loading data, this format is extremely common because it has the +advantages of being human readable, and thus will survive the test of +time as the \textit{en vogue} programming languages, analysis +applications and data formats come and go, it is easy to parse, and it +is supported by almost all languages and applications. + +In this exercise we will create a data set of two arrays, the first +one regularly sampled time \textit{t} from 0..2 seconds with 20~ms +time step , and the second one an array \texttt{v} of sinusoidal +voltages corrupted by some noise. Let's assume the sine wave has +amplitude 2~V, frequency 10~Hz, and zero mean Gaussian distrubuted +white noise with standard deviation 0.5~V. Your task is to write two +scripts. + +The first script should create the vectors \texttt{t} and \texttt{v}, +plot the time series of \texttt{t} versus \texttt{v}, save them in a +two dimensional numpy array \texttt{X}, and then dump the array +\texttt{X} to a plain text ASCII file called +\texttt{'noisy_sine.dat'}. The file will look like (not identical +because of the noise) + +\begin{verbatim} +0.000000000000000000e+00 1.550947826934816025e-02 +2.000000000000000042e-02 2.493944587057004725e+00 +4.000000000000000083e-02 9.497694074551737975e-01 +5.999999999999999778e-02 -9.185779287524413750e-01 +8.000000000000000167e-02 -2.811127590689064704e+00 +... and so on +\end{verbatim} + +Here is the exercise skeleton of the script to create and plot the +data file + +\lstinputlisting[label=code:noisy_sine_skel,caption={IGNORED}]{skel/noise_sine_skel.py} + +and the graph will look something like Figure~\ref{fig:noisy_sine} + +\begin{center}% +\begin{figure} +\begin{centering}\includegraphics[width=4in]{fig/noise_sine}\par\end{centering} + + +\caption{\label{fig:noisy_sine}A 10~Hz sine wave corrupted by noise} +\end{figure} +\par\end{center} + +The second part of this exercise is to write a script which loads data +from the data file into an array \texttt{X}, extracts the columns into +arrays \texttt{t} and \texttt{v}, and computes the RMS +(root-mean-square) intensity of the signal using the \textt{load} +command. + + +\subsection{Loading and saving binary data} +\label{sec:binary_data} + +ASCII is bloated and slow for working with large arrays, and so binary +data should be used if performance is a consideration. To save the +array \texttt{X} in binary form, use the numpy \texttt{tostring} method + +\begin{lstlisting} +# open the file for writing binary and write the binary string +file('../data/binary_data.dat', 'wb').write(X.tostring()) +\end{lstlisting} + +\noindent This data can later be loaded into a numpy array using +\texttt{fromstring}. This method takes two arguments, a string and a +data type (note that numarray users can use \texttt{fromfile} which is +more efficient for importing data directly from a file). + +\lstinputlisting{code/load_binary_data.py} + +\noindent Note that although Numpy and numarray use different +typecode arguments (Numeric uses strings whereas numarray uses type +objects), the matplotlib.numpy compatibility layer provides symbols +which will work with either \rc{numpy} rc setting. + +\subsection{Processing several data files} +\label{sec:multiple_files} + +Since python is a programming language \textit{par excellence}, it is +easy to process data in batch. When I started the gradual transition +from a full time \matlab\ user to a full time python user, I began +processing my data in python and saving the results to data files for +plotting in \matlab. When that became too cumbersome, I decided to +write matplotlib so I could have all the functionality I needed in one +environment. Here is a brief example showing how to iterate over +several data files, named \fname{basename001.dat, basename002.dat, + basename003.dat, ... basename100.dat} and plot all of the traces to +the same axes. I'll assume for this example that each file is a 1D +ASCII array, which I can load with the \texttt{load} command. + +\begin{lstlisting} +hold(True) # set the hold state to be on +for i in range(1,101): #start at 1, end at 100 + fname = 'basename%03d.dat'%i # %03d pads the integers with zeros + x = load(fname) + plot(x) +\end{lstlisting} + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-20 17:56:57
|
Revision: 3970 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3970&view=rev Author: jdh2358 Date: 2007-10-20 10:56:55 -0700 (Sat, 20 Oct 2007) Log Message: ----------- added files workbook Added Paths: ----------- trunk/py4science/examples/noisy_sine.py Added: trunk/py4science/examples/noisy_sine.py =================================================================== --- trunk/py4science/examples/noisy_sine.py (rev 0) +++ trunk/py4science/examples/noisy_sine.py 2007-10-20 17:56:55 UTC (rev 3970) @@ -0,0 +1,25 @@ +from scipy import arange, sin, pi, randn, zeros +import pylab as p + +a = 2 # 2 volt amplitude +f = 10 # 10 Hz frequency +sigma = 0.5 # 0.5 volt standard deviation noise + +# create the t and v and store them a 2D array X +t = arange(0.0, 2.0, 0.02) # an evenly sampled time array +v = a*sin(2*f*pi*t) + sigma*randn(len(t)) # a noisy sine wave +X = zeros((len(t),2)) # an empty output array +X[:,0] = t # add t to the first column +X[:,1] = v # add s to the 2nd column +p.save('data/noisy_sine.dat', X) # save the output file as ASCII + +# plot the arrays t vs v and label the x-axis, y-axis and title +# save the output figure as noisy_sine.png +p.plot(t, v, 'b-') +p.xlabel('time (s)') +p.ylabel('volts (V)') +p.title('A noisy sine wave') +p.grid() +p.savefig('noisy_sine.png', dpi=150) +p.savefig('noisy_sine.eps') +p.show() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ds...@us...> - 2007-10-19 15:41:30
|
Revision: 3969 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3969&view=rev Author: dsdale Date: 2007-10-19 08:41:25 -0700 (Fri, 19 Oct 2007) Log Message: ----------- whitespace cleanup Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/__init__.py Modified: trunk/matplotlib/lib/matplotlib/__init__.py =================================================================== --- trunk/matplotlib/lib/matplotlib/__init__.py 2007-10-19 15:37:41 UTC (rev 3968) +++ trunk/matplotlib/lib/matplotlib/__init__.py 2007-10-19 15:41:25 UTC (rev 3969) @@ -149,13 +149,10 @@ # --verbose-silent or --verbose-helpful _commandLineVerbose = None - for arg in sys.argv[1:]: if not arg.startswith('--verbose-'): continue _commandLineVerbose = arg[10:] - - def __init__(self): self.set_level('silent') self.fileo = sys.stdout @@ -195,8 +192,6 @@ return True return False - - def wrap(self, fmt, func, level='helpful', always=True): """ return a callable function that wraps func and reports it @@ -225,6 +220,7 @@ verbose=Verbose() + def checkdep_dvipng(): try: stdin, stdout = os.popen4('dvipng -version') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ds...@us...> - 2007-10-19 15:37:44
|
Revision: 3968 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3968&view=rev Author: dsdale Date: 2007-10-19 08:37:41 -0700 (Fri, 19 Oct 2007) Log Message: ----------- changed dependency check for ghostscript, which was failing to identify svn versions Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/__init__.py trunk/matplotlib/lib/matplotlib/config/checkdep.py Modified: trunk/matplotlib/lib/matplotlib/__init__.py =================================================================== --- trunk/matplotlib/lib/matplotlib/__init__.py 2007-10-19 14:43:21 UTC (rev 3967) +++ trunk/matplotlib/lib/matplotlib/__init__.py 2007-10-19 15:37:41 UTC (rev 3968) @@ -55,7 +55,7 @@ """ from __future__ import generators -NEWCONFIG = False +NEWCONFIG = True __version__ = '0.90.1' __revision__ = '$Revision$' @@ -243,7 +243,7 @@ command = 'gs -v' stdin, stdout = os.popen4(command) line = stdout.readlines()[0] - v = line.split()[2] + v = line.split()[-2] vtest = '.'.join(v.split('.')[:2]) # deal with version numbers like '7.07.1' float(vtest) return vtest Modified: trunk/matplotlib/lib/matplotlib/config/checkdep.py =================================================================== --- trunk/matplotlib/lib/matplotlib/config/checkdep.py 2007-10-19 14:43:21 UTC (rev 3967) +++ trunk/matplotlib/lib/matplotlib/config/checkdep.py 2007-10-19 15:37:41 UTC (rev 3968) @@ -1,4 +1,7 @@ -import os, re, sys +import os +import re +import sys +import warnings import distutils.version as version def dvipng(): @@ -19,7 +22,7 @@ command = 'gs -v' stdin, stdout = os.popen4(command) line = stdout.readlines()[0] - v = line.split()[2] + v = line.split()[-2] vtest = '.'.join(v.split('.')[:2]) # deal with version numbers like '7.07.1' float(vtest) return vtest @@ -130,4 +133,4 @@ 'unless ghostscript-%s or later is ' 'installed on your system') % gs_req) - return flag \ No newline at end of file + return flag This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ds...@us...> - 2007-10-19 14:43:50
|
Revision: 3967 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3967&view=rev Author: dsdale Date: 2007-10-19 07:43:21 -0700 (Fri, 19 Oct 2007) Log Message: ----------- removed a gsave/grestore pair surrounding _draw_ps Modified Paths: -------------- trunk/matplotlib/CHANGELOG trunk/matplotlib/lib/matplotlib/backends/backend_ps.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2007-10-19 14:23:48 UTC (rev 3966) +++ trunk/matplotlib/CHANGELOG 2007-10-19 14:43:21 UTC (rev 3967) @@ -1,3 +1,8 @@ +2007-10-19 Removed a gsave/grestore pair surrounding _draw_ps, which + was causing a loss graphics state info (see "EPS output + problem - scatter & edgecolors" on mpl-dev, 2007-10-29) + - DSD + 2007-10-15 Fixed a bug in patches.Ellipse that was broken for aspect='auto'. Scale free ellipses now work properly for equal and auto on Agg and PS, and they fall back on a Modified: trunk/matplotlib/lib/matplotlib/backends/backend_ps.py =================================================================== --- trunk/matplotlib/lib/matplotlib/backends/backend_ps.py 2007-10-19 14:23:48 UTC (rev 3966) +++ trunk/matplotlib/lib/matplotlib/backends/backend_ps.py 2007-10-19 14:43:21 UTC (rev 3967) @@ -915,7 +915,6 @@ """ # local variable eliminates all repeated attribute lookups write = self._pswriter.write - write('gsave\n') if debugPS and command: write("% "+command+"\n") @@ -949,7 +948,6 @@ write("stroke\n") if cliprect: write("grestore\n") - write('grestore\n') def push_gc(self, gc, store=1): """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-19 14:23:51
|
Revision: 3966 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3966&view=rev Author: jdh2358 Date: 2007-10-19 07:23:48 -0700 (Fri, 19 Oct 2007) Log Message: ----------- fixed a verbose report bug in patches Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/collections.py trunk/matplotlib/lib/matplotlib/patches.py Modified: trunk/matplotlib/lib/matplotlib/collections.py =================================================================== --- trunk/matplotlib/lib/matplotlib/collections.py 2007-10-18 18:11:59 UTC (rev 3965) +++ trunk/matplotlib/lib/matplotlib/collections.py 2007-10-19 14:23:48 UTC (rev 3966) @@ -217,6 +217,7 @@ ACCEPTS: float or sequence of floats """ self._linewidths = self._get_value(lw) + def set_linewidths(self, lw): self.set_linewidth(lw) @@ -256,6 +257,7 @@ self._linewidths = (0.0,) else: self._edgecolors = _colors.colorConverter.to_rgba_list(c) + def set_edgecolors(self, c): self.set_edgecolor(c) @@ -721,6 +723,7 @@ return len(ind)>0,dict(ind=ind) def set_pickradius(self,pickradius): self.pickradius = 5 + def get_pickradius(self): return self.pickradius def get_transoffset(self): Modified: trunk/matplotlib/lib/matplotlib/patches.py =================================================================== --- trunk/matplotlib/lib/matplotlib/patches.py 2007-10-18 18:11:59 UTC (rev 3965) +++ trunk/matplotlib/lib/matplotlib/patches.py 2007-10-19 14:23:48 UTC (rev 3966) @@ -849,7 +849,7 @@ if not hasattr(renderer, 'draw_path'): - verbose.report('patches.Ellipse renderer does not support path drawing; falling back on vertex approximation for nonlinear transformation') + mpl.verbose.report('patches.Ellipse renderer does not support path drawing; falling back on vertex approximation for nonlinear transformation') renderer.draw_polygon(gc, rgbFace, self.get_verts()) return This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2007-10-18 18:12:03
|
Revision: 3965 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3965&view=rev Author: mdboom Date: 2007-10-18 11:11:59 -0700 (Thu, 18 Oct 2007) Log Message: ----------- First pass at working PDF backend. Modified Paths: -------------- branches/transforms/lib/matplotlib/backends/backend_pdf.py branches/transforms/lib/matplotlib/backends/backend_ps.py branches/transforms/lib/matplotlib/projections/polar.py branches/transforms/lib/matplotlib/transforms.py branches/transforms/src/_backend_agg.cpp Modified: branches/transforms/lib/matplotlib/backends/backend_pdf.py =================================================================== --- branches/transforms/lib/matplotlib/backends/backend_pdf.py 2007-10-18 18:07:06 UTC (rev 3964) +++ branches/transforms/lib/matplotlib/backends/backend_pdf.py 2007-10-18 18:11:59 UTC (rev 3965) @@ -33,7 +33,10 @@ LOAD_NO_HINTING, KERNING_UNFITTED from matplotlib.mathtext import MathTextParser from matplotlib.transforms import Bbox +from matplotlib.path import Path from matplotlib import ttconv +# MGDTODO: Move this stuff +from matplotlib.backends._backend_agg import get_path_extents # Overview # @@ -90,22 +93,26 @@ """Make one string from sequence of strings, with whitespace in between. The whitespace is chosen to form lines of at most linelen characters, if possible.""" - - s, strings = [strings[0]], strings[1:] - while strings: - if len(s[-1]) + len(strings[0]) < linelen: - s[-1] += ' ' + strings[0] + currpos = 0 + lasti = 0 + result = [] + for i, s in enumerate(strings): + length = len(s) + if currpos + length < linelen: + currpos += length + 1 else: - s.append(strings[0]) - strings = strings[1:] - return '\n'.join(s) + result.append(' '.join(strings[lasti:i])) + lasti = i + currpos = length + result.append(' '.join(strings[lasti:])) + return '\n'.join(result) def pdfRepr(obj): """Map Python objects to PDF syntax.""" # Some objects defined later have their own pdfRepr method. - if 'pdfRepr' in dir(obj): + if hasattr(obj, 'pdfRepr'): return obj.pdfRepr() # Floats. PDF does not have exponential notation (1.0e-10) so we @@ -164,6 +171,13 @@ else: r += "-%02d'%02d'" % (z//3600, z%3600) return pdfRepr(r) + # A bounding box + elif isinstance(obj, Bbox): + r = ["["] + r.extend([pdfRepr(val) for val in obj.lbrt]) + r.append("]") + return fill(r) + else: raise TypeError, \ "Don't know a PDF representation for %s objects." \ @@ -379,7 +393,6 @@ self.markers = {} self.two_byte_charprocs = {} - self.nextMarker = 1 # The PDF spec recommends to include every procset procsets = [ Name(x) @@ -409,8 +422,8 @@ for val in self.alphaStates.values()])) self.writeHatches() xobjects = dict(self.images.values()) - for name, value in self.markers.items(): - xobjects[name] = value[0] + for tup in self.markers.values(): + xobjects[tup[0]] = tup[1] for name, value in self.two_byte_charprocs.items(): xobjects[name] = value self.writeObject(self.XObjectObject, xobjects) @@ -1009,71 +1022,64 @@ img.flipud_out() - def markerObject(self, path, fillp, lw): + def markerObject(self, path, trans, fillp, lw): """Return name of a marker XObject representing the given path.""" - - name = Name('M%d' % self.nextMarker) - ob = self.reserveObject('marker %d' % self.nextMarker) - self.nextMarker += 1 - self.markers[name] = (ob, path, fillp, lw) + key = (path, trans) + result = self.markers.get(key) + if result is None: + name = Name('M%d' % len(self.markers)) + ob = self.reserveObject('marker %d' % len(self.markers)) + self.markers[key] = (name, ob, path, trans, fillp, lw) + else: + name = result[0] return name - + def writeMarkers(self): - for name, tuple in self.markers.items(): - object, path, fillp, lw = tuple + for tup in self.markers.values(): + name, object, path, trans, fillp, lw = tup + a, b, c, d = get_path_extents(path, trans) + bbox = Bbox.from_lbrt(*get_path_extents(path, trans)) + bbox = bbox.padded(lw * 0.5) self.beginStream( object.id, None, {'Type': Name('XObject'), 'Subtype': Name('Form'), - 'BBox': self.pathBbox(path, lw) }) - self.writePath(path, fillp) + 'BBox': bbox }) + self.writePath(path, trans) + if fillp: + self.output(Op.fill_stroke) + else: + self.output(Op.stroke) self.endStream() #@staticmethod - def pathBbox(path, lw): - path.rewind(0) - x, y = [], [] - while True: - code, xp, yp = path.vertex() - if code & agg.path_cmd_mask in \ - (agg.path_cmd_move_to, agg.path_cmd_line_to): - x.append(xp) - y.append(yp) - elif code == agg.path_cmd_stop: - break - return min(x)-lw, min(y)-lw, max(x)+lw, max(y)+lw - pathBbox = staticmethod(pathBbox) - - #@staticmethod - def pathOperations(path): - path.rewind(0) - result = [] - while True: - code, x, y = path.vertex() - code = code & agg.path_cmd_mask - if code == agg.path_cmd_stop: - break - elif code == agg.path_cmd_move_to: - result += (x, y, Op.moveto) - elif code == agg.path_cmd_line_to: - result += (x, y, Op.lineto) - elif code == agg.path_cmd_curve3: - pass # TODO - elif code == agg.path_cmd_curve4: - pass # TODO - elif code == agg.path_cmd_end_poly: - result += (Op.closepath,) - else: - print >>sys.stderr, "pathOperations", code, xp, yp - return result + def pathOperations(path, transform): + tpath = transform.transform_path(path) + + cmds = [] + for points, code in tpath.iter_segments(): + if code == Path.MOVETO: + cmds.extend(points) + cmds.append(Op.moveto) + elif code == Path.LINETO: + cmds.extend(points) + cmds.append(Op.lineto) + elif code == Path.CURVE3: + cmds.extend([points[0], points[1], + points[0], points[1], + points[2], points[3], + Op.curveto]) + elif code == Path.CURVE4: + cmds.extend(points) + cmds.append(Op.curveto) + elif code == Path.CLOSEPOLY: + cmds.append(Op.closepath) + return cmds pathOperations = staticmethod(pathOperations) - - def writePath(self, path, fillp): - self.output(*self.pathOperations(path)) - if fillp: - self.output(Op.fill_stroke) - else: - self.output(Op.stroke) - + + def writePath(self, path, transform): + cmds = self.pathOperations(path, transform) + self.output(*cmds) + def reserveObject(self, name=''): """Reserve an ID for an indirect object. The name is used for debugging in case we forget to print out @@ -1177,59 +1183,6 @@ stat_key, (realpath, Set())) used_characters[1].update(set) - def draw_arc(self, gcEdge, rgbFace, x, y, width, height, - angle1, angle2, rotation): - """ - Draw an arc using GraphicsContext instance gcEdge, centered at x,y, - with width and height and angles from 0.0 to 360.0 - 0 degrees is at 3-o'clock, rotated by `rotation` degrees - positive angles are anti-clockwise - - If the color rgbFace is not None, fill the arc with it. - """ - # source: agg_bezier_arc.cpp in agg23 - - def arc_to_bezier(cx, cy, rx, ry, angle1, sweep, rotation): - halfsweep = sweep / 2.0 - x0, y0 = cos(halfsweep), sin(halfsweep) - tx = (1.0 - x0) * 4.0/3.0; - ty = y0 - tx * x0 / y0; - px = x0, x0+tx, x0+tx, x0 - py = -y0, -ty, ty, y0 - sn, cs = sin(angle1 + halfsweep), cos(angle1 + halfsweep) - result = [ (rx * (pxi * cs - pyi * sn), - ry * (pxi * sn + pyi * cs)) - for pxi, pyi in zip(px, py) ] - result = [ (cx + cos(rotation)*x - sin(rotation)*y, - cy + sin(rotation)*x + cos(rotation)*y) - for x, y in result ] - return reduce(lambda x, y: x + y, result) - - epsilon = 0.01 - angle1 *= pi/180.0 - angle2 *= pi/180.0 - rotation *= pi/180.0 - sweep = angle2 - angle1 - angle1 = angle1 % (2*pi) - sweep = min(max(-2*pi, sweep), 2*pi) - - if sweep < 0.0: - sweep, angle1, angle2 = -sweep, angle2, angle1 - bp = [ pi/2.0 * i - for i in range(4) - if pi/2.0 * i < sweep-epsilon ] - bp.append(sweep) - subarcs = [ arc_to_bezier(x, y, width/2.0, height/2.0, - bp[i], bp[i+1]-bp[i], rotation) - for i in range(len(bp)-1) ] - - self.check_gc(gcEdge, rgbFace) - self.file.output(subarcs[0][0], subarcs[0][1], Op.moveto) - for arc in subarcs: - self.file.output(*(arc[2:] + (Op.curveto,))) - - self.file.output(self.gc.close_and_paint()) - def get_image_magnification(self): return self.image_magnification @@ -1246,82 +1199,29 @@ self.file.output(Op.gsave, w, 0, 0, h, x, y, Op.concat_matrix, imob, Op.use_xobject, Op.grestore) - def draw_line(self, gc, x1, y1, x2, y2): - if npy.isnan(x1) or npy.isnan(x2) or npy.isnan(y1) or npy.isnan(y2): - return - self.check_gc(gc) - self.file.output(x1, y1, Op.moveto, - x2, y2, Op.lineto, self.gc.paint()) - - def draw_lines(self, gc, x, y, transform=None): - self.check_gc(gc) - if transform is not None: - x, y = transform.seq_x_y(x, y) - nan_at = npy.isnan(x) | npy.isnan(y) - next_op = Op.moveto - for i in range(len(x)): - if nan_at[i]: - next_op = Op.moveto - else: - self.file.output(x[i], y[i], next_op) - next_op = Op.lineto + def draw_path(self, gc, path, transform, rgbFace=None): + self.check_gc(gc, rgbFace) + stream = self.file.writePath(path, transform) self.file.output(self.gc.paint()) - def draw_point(self, gc, x, y): - print >>sys.stderr, "draw_point called" - - self.check_gc(gc, gc._rgb) - self.file.output(x, y, 1, 1, - Op.rectangle, Op.fill_stroke) - - def draw_polygon(self, gcEdge, rgbFace, points): - # Optimization for axis-aligned rectangles - if len(points) == 4: - if points[0][0] == points[1][0] and points[1][1] == points[2][1] and \ - points[2][0] == points[3][0] and points[3][1] == points[0][1]: - self.draw_rectangle(gcEdge, rgbFace, - min(points[0][0], points[2][0]), - min(points[1][1], points[3][1]), - abs(points[2][0] - points[0][0]), - abs(points[3][1] - points[1][1])) - return - elif points[0][1] == points[1][1] and points[1][0] == points[2][0] and \ - points[2][1] == points[3][1] and points[3][0] == points[0][0]: - self.draw_rectangle(gcEdge, rgbFace, - min(points[1][0], points[3][0]), - min(points[2][1], points[0][1]), - abs(points[1][0] - points[3][0]), - abs(points[2][1] - points[0][1])) - return - - self.check_gc(gcEdge, rgbFace) - self.file.output(points[0][0], points[0][1], Op.moveto) - for x,y in points[1:]: - self.file.output(x, y, Op.lineto) - self.file.output(self.gc.close_and_paint()) - - def draw_rectangle(self, gcEdge, rgbFace, x, y, width, height): - self.check_gc(gcEdge, rgbFace) - self.file.output(x, y, width, height, Op.rectangle) - self.file.output(self.gc.paint()) - - def draw_markers(self, gc, path, rgbFace, x, y, trans): + def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): self.check_gc(gc, rgbFace) fillp = rgbFace is not None - marker = self.file.markerObject(path, fillp, self.gc._linewidth) - x, y = trans.numerix_x_y(npy.asarray(x), npy.asarray(y)) - nan_at = npy.isnan(x) | npy.isnan(y) - self.file.output(Op.gsave) - ox, oy = 0, 0 - for i in range(len(x)): - if nan_at[i]: continue - dx, dy, ox, oy = x[i]-ox, y[i]-oy, x[i], y[i] - self.file.output(1, 0, 0, 1, dx, dy, - Op.concat_matrix, - marker, Op.use_xobject) - self.file.output(Op.grestore) + output = self.file.output + marker = self.file.markerObject( + marker_path, marker_trans, fillp, self.gc._linewidth) + tpath = trans.transform_path(path) + output(Op.gsave) + lastx, lasty = 0, 0 + for x, y in tpath.vertices: + dx, dy = x - lastx, y - lasty + output(1, 0, 0, 1, dx, dy, Op.concat_matrix, + marker, Op.use_xobject) + lastx, lasty = x, y + output(Op.grestore) + def _setup_textpos(self, x, y, angle, oldx=0, oldy=0, oldangle=0): if angle == oldangle == 0: self.file.output(x - oldx, y - oldy, Op.textpos) @@ -1735,7 +1635,7 @@ def hatch_cmd(self, hatch): if not hatch: - if self._fillcolor: + if self._fillcolor is not None: return self.fillcolor_cmd(self._fillcolor) else: return [Name('DeviceRGB'), Op.setcolorspace_nonstroke] @@ -1757,7 +1657,7 @@ if rgb[0] == rgb[1] == rgb[2]: return [rgb[0], Op.setgray_stroke] else: - return list(rgb) + [Op.setrgb_stroke] + return list(rgb[:3]) + [Op.setrgb_stroke] def fillcolor_cmd(self, rgb): if rgb is None or rcParams['pdf.inheritcolor']: @@ -1765,7 +1665,7 @@ elif rgb[0] == rgb[1] == rgb[2]: return [rgb[0], Op.setgray_nonstroke] else: - return list(rgb) + [Op.setrgb_nonstroke] + return list(rgb[:3]) + [Op.setrgb_nonstroke] def push(self): parent = GraphicsContextPdf(self.file) @@ -1791,11 +1691,12 @@ if (self._cliprect, self._clippath) != (cliprect, clippath): cmds.extend(self.push()) if self._cliprect != cliprect: - cmds.extend([t for t in cliprect] + - [Op.rectangle, Op.clip, Op.endpath]) + cmds.extend([cliprect, Op.rectangle, Op.clip, Op.endpath]) if self._clippath != clippath: - cmds.extend(PdfFile.pathOperations(clippath) + - [Op.clip, Op.endpath]) + cmds.extend( + PdfFile.pathOperations( + *clippath.get_transformed_path_and_affine()) + + [Op.clip, Op.endpath]) return cmds commands = ( @@ -1821,7 +1722,11 @@ for params, cmd in self.commands: ours = [ getattr(self, p) for p in params ] theirs = [ getattr(other, p) for p in params ] - if ours != theirs: + try: + different = ours != theirs + except ValueError: + different = ours.shape != theirs.shape or npy.any(ours != theirs) + if ours is not theirs: cmds.extend(cmd(self, *theirs)) for p in params: setattr(self, p, getattr(other, p)) Modified: branches/transforms/lib/matplotlib/backends/backend_ps.py =================================================================== --- branches/transforms/lib/matplotlib/backends/backend_ps.py 2007-10-18 18:07:06 UTC (rev 3964) +++ branches/transforms/lib/matplotlib/backends/backend_ps.py 2007-10-18 18:11:59 UTC (rev 3965) @@ -1433,14 +1433,4 @@ clip newpath } bind def""", - """/unitcircle { - newpath --1. 0. moveto --1.0 0.552284749831 -0.552284749831 1.0 0.0 1.0 curveto -0.552284749831 1.0 1.0 0.552284749831 1.0 0.0 curveto -1.0 -0.552284749831 0.552284749831 -1.0 0.0 -1.0 curveto --0.552284749831 -1.0 -1.0 -0.552284749831 -1.0 0.0 curveto -closepath - } bind def""", - ] Modified: branches/transforms/lib/matplotlib/projections/polar.py =================================================================== --- branches/transforms/lib/matplotlib/projections/polar.py 2007-10-18 18:07:06 UTC (rev 3964) +++ branches/transforms/lib/matplotlib/projections/polar.py 2007-10-18 18:11:59 UTC (rev 3965) @@ -41,13 +41,13 @@ self._resolution = resolution def transform(self, tr): - xy = npy.zeros(tr.shape, npy.float_) - t = tr[:, 0:1] - r = tr[:, 1:2] - x = xy[:, 0:1] - y = xy[:, 1:2] - x += r * npy.cos(t) - y += r * npy.sin(t) + xy = npy.zeros(tr.shape, npy.float_) + t = tr[:, 0:1] + r = tr[:, 1:2] + x = xy[:, 0:1] + y = xy[:, 1:2] + x[:] = r * npy.cos(t) + y[:] = r * npy.sin(t) return xy transform.__doc__ = Transform.transform.__doc__ Modified: branches/transforms/lib/matplotlib/transforms.py =================================================================== --- branches/transforms/lib/matplotlib/transforms.py 2007-10-18 18:07:06 UTC (rev 3964) +++ branches/transforms/lib/matplotlib/transforms.py 2007-10-18 18:11:59 UTC (rev 3965) @@ -490,6 +490,14 @@ a = npy.array([[-deltaw, -deltah], [deltaw, deltah]]) return Bbox(self._points + a) + def padded(self, p): + """ + Return a new Bbox that is padded on all four sides by the + given value. + """ + points = self._points + return Bbox(points + [[-p, -p], [p, p]]) + def translated(self, tx, ty): """ Return a copy of the Bbox, translated by tx and ty. Modified: branches/transforms/src/_backend_agg.cpp =================================================================== --- branches/transforms/src/_backend_agg.cpp 2007-10-18 18:07:06 UTC (rev 3964) +++ branches/transforms/src/_backend_agg.cpp 2007-10-18 18:11:59 UTC (rev 3965) @@ -1573,12 +1573,12 @@ curved_path.rewind(0); while ((code = curved_path.vertex(&x, &y)) != agg::path_cmd_stop) { - if (code & agg::path_cmd_end_poly == agg::path_cmd_end_poly) - continue; if (x < *x0) *x0 = x; if (y < *y0) *y0 = y; if (x > *x1) *x1 = x; if (y > *y1) *y1 = y; + if ((code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly) + continue; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2007-10-18 18:07:26
|
Revision: 3964 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3964&view=rev Author: mdboom Date: 2007-10-18 11:07:06 -0700 (Thu, 18 Oct 2007) Log Message: ----------- Faster version of fill() for PDF writing Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py Modified: trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py =================================================================== --- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py 2007-10-18 17:40:30 UTC (rev 3963) +++ trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py 2007-10-18 18:07:06 UTC (rev 3964) @@ -90,15 +90,19 @@ """Make one string from sequence of strings, with whitespace in between. The whitespace is chosen to form lines of at most linelen characters, if possible.""" - - s, strings = [strings[0]], strings[1:] - while strings: - if len(s[-1]) + len(strings[0]) < linelen: - s[-1] += ' ' + strings[0] + currpos = 0 + lasti = 0 + result = [] + for i, s in enumerate(strings): + length = len(s) + if currpos + length < linelen: + currpos += length + 1 else: - s.append(strings[0]) - strings = strings[1:] - return '\n'.join(s) + result.append(' '.join(strings[lasti:i])) + lasti = i + currpos = length + result.append(' '.join(strings[lasti:])) + return '\n'.join(result) def pdfRepr(obj): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2007-10-18 17:40:31
|
Revision: 3963 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3963&view=rev Author: mdboom Date: 2007-10-18 10:40:30 -0700 (Thu, 18 Oct 2007) Log Message: ----------- Major speedup in PDF backend by using hasattr() rather than 'in dir()' Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py Modified: trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py =================================================================== --- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py 2007-10-18 15:06:49 UTC (rev 3962) +++ trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py 2007-10-18 17:40:30 UTC (rev 3963) @@ -105,7 +105,7 @@ """Map Python objects to PDF syntax.""" # Some objects defined later have their own pdfRepr method. - if 'pdfRepr' in dir(obj): + if hasattr(obj, 'pdfRepr'): return obj.pdfRepr() # Floats. PDF does not have exponential notation (1.0e-10) so we This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2007-10-18 15:06:51
|
Revision: 3962 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3962&view=rev Author: mdboom Date: 2007-10-18 08:06:49 -0700 (Thu, 18 Oct 2007) Log Message: ----------- Merged revisions 3956-3961 via svnmerge from http://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib ........ r3961 | jdh2358 | 2007-10-18 11:02:13 -0400 (Thu, 18 Oct 2007) | 3 lines Fixed collection.set_facecolor to respect alpha ........ Modified Paths: -------------- branches/transforms/lib/matplotlib/collections.py branches/transforms/lib/matplotlib/mlab.py Property Changed: ---------------- branches/transforms/ Property changes on: branches/transforms ___________________________________________________________________ Name: svnmerge-integrated - /trunk/matplotlib:1-3955 + /trunk/matplotlib:1-3961 Modified: branches/transforms/lib/matplotlib/collections.py =================================================================== --- branches/transforms/lib/matplotlib/collections.py 2007-10-18 15:02:13 UTC (rev 3961) +++ branches/transforms/lib/matplotlib/collections.py 2007-10-18 15:06:49 UTC (rev 3962) @@ -311,7 +311,8 @@ ACCEPTS: matplotlib color arg or sequence of rgba tuples """ - self._facecolors = _colors.colorConverter.to_rgba_list(c) + self._facecolors = _colors.colorConverter.to_rgba_list(c, self._alpha) + set_facecolors = set_facecolor def set_edgecolor(self, c): Modified: branches/transforms/lib/matplotlib/mlab.py =================================================================== --- branches/transforms/lib/matplotlib/mlab.py 2007-10-18 15:02:13 UTC (rev 3961) +++ branches/transforms/lib/matplotlib/mlab.py 2007-10-18 15:06:49 UTC (rev 3962) @@ -1342,9 +1342,15 @@ process_skiprows(reader) + def myfloat(x): + if x==missing: + return npy.nan + else: + return float(x) + def get_func(item, func): # promote functions in this order - funcmap = {int:float, float:dateutil.parser.parse, dateutil.parser.parse:str} + funcmap = {int:myfloat, myfloat:dateutil.parser.parse, dateutil.parser.parse:str} try: func(item) except: if func==str: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |