Revision: 8562 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8562&view=rev Author: efiring Date: 2010年07月16日 20:44:52 +0000 (2010年7月16日) Log Message: ----------- backends: factored out most of the show() code into ShowBase class. Also fixed various fltkagg problems. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/backend_bases.py branches/v1_0_maint/lib/matplotlib/backends/backend_cocoaagg.py branches/v1_0_maint/lib/matplotlib/backends/backend_fltkagg.py branches/v1_0_maint/lib/matplotlib/backends/backend_gtk.py branches/v1_0_maint/lib/matplotlib/backends/backend_macosx.py branches/v1_0_maint/lib/matplotlib/backends/backend_qt.py branches/v1_0_maint/lib/matplotlib/backends/backend_qt4.py branches/v1_0_maint/lib/matplotlib/backends/backend_tkagg.py branches/v1_0_maint/lib/matplotlib/backends/backend_wx.py Modified: branches/v1_0_maint/lib/matplotlib/backend_bases.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backend_bases.py 2010年07月16日 18:45:49 UTC (rev 8561) +++ branches/v1_0_maint/lib/matplotlib/backend_bases.py 2010年07月16日 20:44:52 UTC (rev 8562) @@ -21,6 +21,11 @@ pressed, x and y locations in pixel and :class:`~matplotlib.axes.Axes` coordinates. +:class:`ShowBase` + The base class for the Show class of each interactive backend; + the 'show' callable is then set to Show.__call__, inherited from + ShowBase. + """ from __future__ import division @@ -33,6 +38,8 @@ import matplotlib.widgets as widgets #import matplotlib.path as path from matplotlib import rcParams +from matplotlib import is_interactive +from matplotlib._pylab_helpers import Gcf from matplotlib.transforms import Bbox, TransformedBbox, Affine2D import cStringIO @@ -49,7 +56,37 @@ _backend_d[format] = backend_class +class ShowBase(object): + """ + Simple base class to generate a show() callable in backends. + Subclass must override mainloop() method. + """ + def __call__(self): + """ + Show all figures. + """ + managers = Gcf.get_all_fig_managers() + if not managers: + return + + for manager in managers: + manager.show() + + try: + if not self._needmain: # ipython flag + return + except AttributeError: + pass + + if not is_interactive(): + self.mainloop() + + def mainloop(self): + pass + + + class RendererBase: """An abstract base class to handle drawing/rendering operations. Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_cocoaagg.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_cocoaagg.py 2010年07月16日 18:45:49 UTC (rev 8561) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_cocoaagg.py 2010年07月16日 20:44:52 UTC (rev 8562) @@ -30,6 +30,8 @@ import matplotlib from matplotlib.figure import Figure from matplotlib.backend_bases import FigureManagerBase, FigureCanvasBase +from matplotlib.backend_bases import ShowBase + from backend_agg import FigureCanvasAgg from matplotlib._pylab_helpers import Gcf @@ -41,10 +43,24 @@ canvas = FigureCanvasCocoaAgg(thisFig) return FigureManagerCocoaAgg(canvas, num) -def show(): - for manager in Gcf.get_all_fig_managers(): - manager.show() +## Below is the original show() function: +#def show(): +# for manager in Gcf.get_all_fig_managers(): +# manager.show() +# +## It appears that this backend is unusual in having a separate +## run function invoked for each figure, instead of a single +## mainloop. Presumably there is no blocking at all. +## +## Using the Show class below should cause no difference in +## behavior. +class Show(ShowBase): + def mainloop(self): + pass + +show = Show() + def draw_if_interactive(): if matplotlib.is_interactive(): figManager = Gcf.get_active() Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_fltkagg.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_fltkagg.py 2010年07月16日 18:45:49 UTC (rev 8561) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_fltkagg.py 2010年07月16日 20:44:52 UTC (rev 8562) @@ -24,24 +24,14 @@ from matplotlib.backend_bases import \ RendererBase, GraphicsContextBase, FigureManagerBase, FigureCanvasBase,\ NavigationToolbar2, cursors +from matplotlib.backend_bases import ShowBase + + from matplotlib.figure import Figure from matplotlib._pylab_helpers import Gcf import matplotlib.backends.windowing as windowing from matplotlib.widgets import SubplotTool - -import thread,time - -Fl_running=thread.allocate_lock() -def Fltk_run_interactive(): - global Fl_running - if Fl_running.acquire(0): - while True: - Fltk.Fl.check() - time.sleep(0.005) - else: - print "fl loop already running" - # the true dots per inch on the screen; should be display dependent # see http://groups.google.com/groups?q=screen+dpi+x11&hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&selm=7077.26e81ad5%40swift.cs.tcd.ie&rnum=5 for some info about screen dpi PIXELS_PER_INCH = 75 @@ -75,30 +65,13 @@ if figManager is not None: figManager.canvas.draw() +class Show(ShowBase): + def mainloop(self): + Fltk.Fl.run() -def ishow(): - """ - Show all the figures and enter the fltk mainloop in another thread - This allows to keep hand in interractive python session - Warning: does not work under windows - This should be the last line of your script - """ - for manager in Gcf.get_all_fig_managers(): - manager.show() - if show._needmain: - thread.start_new_thread(Fltk_run_interactive,()) - show._needmain = False +show = Show() -def show(): - """ - Show all the figures and enter the fltk mainloop - This should be the last line of your script - """ - for manager in Gcf.get_all_fig_managers(): - manager.show() - Fltk.Fl.run() - def new_figure_manager(num, *args, **kwargs): """ Create a new figure manager instance @@ -249,8 +222,9 @@ FigureCanvasBase.stop_event_loop_default(self) stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__ -def destroy_figure(ptr,figman): +def destroy_figure(ptr, figman): figman.window.hide() + Fltk.Fl.wait(0) # This is needed to make the last figure vanish. Gcf.destroy(figman._num) class FigureManagerFltkAgg(FigureManagerBase): @@ -301,6 +275,11 @@ self.canvas.draw() self.window.redraw() + def destroy(self): + self.window.hide() + Fltk.Fl.wait(0) # This is needed to make the last figure vanish. + Gcf.destroy(self._num) + def set_window_title(self, title): self.window_title=title self.window.label(title) Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_gtk.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_gtk.py 2010年07月16日 18:45:49 UTC (rev 8561) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_gtk.py 2010年07月16日 20:44:52 UTC (rev 8562) @@ -20,10 +20,11 @@ _new_tooltip_api = (gtk.pygtk_version[1] >= 12) import matplotlib -from matplotlib import verbose from matplotlib._pylab_helpers import Gcf from matplotlib.backend_bases import RendererBase, GraphicsContextBase, \ FigureManagerBase, FigureCanvasBase, NavigationToolbar2, cursors, TimerBase +from matplotlib.backend_bases import ShowBase + from matplotlib.backends.backend_gdk import RendererGDK, FigureCanvasGDK from matplotlib.cbook import is_string_like, is_writable_file_like from matplotlib.colors import colorConverter @@ -65,17 +66,12 @@ figManager.canvas.draw_idle() -def show(mainloop=True): - """ - Show all the figures and enter the gtk main loop - This should be the last line of your script - """ - for manager in Gcf.get_all_fig_managers(): - manager.window.show() +class Show(ShowBase): + def mainloop(self): + if gtk.main_level() == 0: + gtk.main() - if mainloop and gtk.main_level() == 0 and \ - len(Gcf.get_all_fig_managers())>0: - gtk.main() +show = Show() def new_figure_manager(num, *args, **kwargs): """ Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_macosx.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_macosx.py 2010年07月16日 18:45:49 UTC (rev 8561) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_macosx.py 2010年07月16日 20:44:52 UTC (rev 8562) @@ -7,6 +7,8 @@ from matplotlib._pylab_helpers import Gcf from matplotlib.backend_bases import RendererBase, GraphicsContextBase,\ FigureManagerBase, FigureCanvasBase, NavigationToolbar2 +from matplotlib.backend_bases import ShowBase + from matplotlib.cbook import maxdict from matplotlib.figure import Figure from matplotlib.path import Path @@ -20,19 +22,16 @@ import matplotlib from matplotlib.backends import _macosx -def show(): - """Show all the figures and enter the Cocoa mainloop. - This function will not return until all windows are closed or - the interpreter exits.""" - # Having a Python-level function "show" wrapping the built-in - # function "show" in the _macosx extension module allows us to - # to add attributes to "show". This is something ipython does. - _macosx.show() +class Show(ShowBase): + def mainloop(self): + _macosx.show() +show = Show() + class RendererMac(RendererBase): """ The renderer handles drawing/rendering operations. Most of the renderer's - methods forwards the command to the renderer's graphics context. The + methods forward the command to the renderer's graphics context. The renderer does not wrap a C object and is written in pure Python. """ Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_qt.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_qt.py 2010年07月16日 18:45:49 UTC (rev 8561) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_qt.py 2010年07月16日 20:44:52 UTC (rev 8562) @@ -8,6 +8,8 @@ from matplotlib.cbook import is_string_like, onetrue from matplotlib.backend_bases import RendererBase, GraphicsContextBase, \ FigureManagerBase, FigureCanvasBase, NavigationToolbar2, cursors +from matplotlib.backend_bases import ShowBase + from matplotlib._pylab_helpers import Gcf from matplotlib.figure import Figure from matplotlib.mathtext import MathTextParser @@ -54,24 +56,14 @@ _create_qApp.qAppCreatedHere = False -def show(): - """ - Show all the figures and enter the qt main loop - This should be the last line of your script - """ - for manager in Gcf.get_all_fig_managers(): - manager.window.show() +class Show(ShowBase): + def mainloop(self): + if _create_qApp.qAppCreatedHere: + qt.qApp.exec_loop() - if DEBUG: print 'Inside show' +show = Show() - figManager = Gcf.get_active() - if figManager != None: - figManager.canvas.draw() - if _create_qApp.qAppCreatedHere: - qt.qApp.exec_loop() - - def new_figure_manager( num, *args, **kwargs ): """ Create a new figure manager instance @@ -281,6 +273,9 @@ 'set the canvas size in pixels' self.window.resize(width, height) + def show(self): + self.window.show() + def destroy( self, *args ): if self.window._destroying: return self.window._destroying = True @@ -359,6 +354,7 @@ # reference holder for subplots_adjust window self.adj_window = None + def destroy( self ): for text, tooltip_text, image_file, callback in self.toolitems: if text is not None: Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_qt4.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_qt4.py 2010年07月16日 18:45:49 UTC (rev 8561) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_qt4.py 2010年07月16日 20:44:52 UTC (rev 8562) @@ -9,6 +9,8 @@ from matplotlib.backend_bases import RendererBase, GraphicsContextBase, \ FigureManagerBase, FigureCanvasBase, NavigationToolbar2, IdleEvent, \ cursors, TimerBase +from matplotlib.backend_bases import ShowBase + from matplotlib._pylab_helpers import Gcf from matplotlib.figure import Figure from matplotlib.mathtext import MathTextParser @@ -56,24 +58,14 @@ _create_qApp.qAppCreatedHere = False -def show(): - """ - Show all the figures and enter the qt main loop - This should be the last line of your script - """ - for manager in Gcf.get_all_fig_managers(): - manager.window.show() +class Show(ShowBase): + def mainloop(self): + if _create_qApp.qAppCreatedHere: + QtGui.qApp.exec_() - if DEBUG: print 'Inside show' +show = Show() - figManager = Gcf.get_active() - if figManager != None: - figManager.canvas.draw() - if _create_qApp.qAppCreatedHere: - QtGui.qApp.exec_() - - def new_figure_manager( num, *args, **kwargs ): """ Create a new figure manager instance @@ -370,6 +362,9 @@ 'set the canvas size in pixels' self.window.resize(width, height) + def show(self): + self.window.show() + def destroy( self, *args ): if self.window._destroying: return self.window._destroying = True Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_tkagg.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_tkagg.py 2010年07月16日 18:45:49 UTC (rev 8561) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_tkagg.py 2010年07月16日 20:44:52 UTC (rev 8562) @@ -18,9 +18,10 @@ from matplotlib.backend_bases import RendererBase, GraphicsContextBase from matplotlib.backend_bases import FigureManagerBase, FigureCanvasBase from matplotlib.backend_bases import NavigationToolbar2, cursors, TimerBase +from matplotlib.backend_bases import ShowBase +from matplotlib._pylab_helpers import Gcf from matplotlib.figure import Figure -from matplotlib._pylab_helpers import Gcf from matplotlib.widgets import SubplotTool @@ -63,22 +64,12 @@ if figManager is not None: figManager.show() - -def show(): - """ - Show all figures. - - """ - for manager in Gcf.get_all_fig_managers(): - manager.show() - try: - if not show._needmain: # might have been added by ipython - return - except AttributeError: - pass - if not matplotlib.is_interactive(): +class Show(ShowBase): + def mainloop(self): Tk.mainloop() +show = Show() + def new_figure_manager(num, *args, **kwargs): """ Create a new figure manager instance Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_wx.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_wx.py 2010年07月16日 18:45:49 UTC (rev 8561) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_wx.py 2010年07月16日 20:44:52 UTC (rev 8562) @@ -24,6 +24,8 @@ import sys, os, os.path, math, StringIO, weakref, warnings import numpy as np + + # Debugging settings here... # Debug level set here. If the debug level is less than 5, information # messages (progressively more info for lower value) are printed. In addition, @@ -117,6 +119,8 @@ from matplotlib.backend_bases import RendererBase, GraphicsContextBase,\ FigureCanvasBase, FigureManagerBase, NavigationToolbar2, \ cursors, TimerBase +from matplotlib.backend_bases import ShowBase + from matplotlib._pylab_helpers import Gcf from matplotlib.artist import Artist from matplotlib.cbook import exception_to_str, is_string_like, is_writable_file_like @@ -1394,24 +1398,16 @@ if figManager is not None: figManager.canvas.draw_idle() -def show(): - """ - Show all the figures and enter the wx main loop. - This should be the last line of your script. - """ - DEBUG_MSG("show()", 3, None) +class Show(ShowBase): + def mainloop(self): + needmain = not wx.App.IsMainLoopRunning() + if needmain: + wxapp = wx.GetApp() + if wxapp is not None: + wxapp.MainLoop() - for figwin in Gcf.get_all_fig_managers(): - figwin.frame.Show() +show = Show() - needmain = not wx.App.IsMainLoopRunning() - if needmain and len(Gcf.get_all_fig_managers())>0: - wxapp = wx.GetApp() - if wxapp is not None: - wxapp.MainLoop() - # start the wxPython gui event if there is not already one running - - def new_figure_manager(num, *args, **kwargs): """ Create a new figure manager instance @@ -1555,6 +1551,8 @@ # attach a show method to the figure self.canvas.figure.show = showfig + def show(self): + self.frame.Show() def destroy(self, *args): DEBUG_MSG("destroy()", 1, self) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8570 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8570&view=rev Author: mdboom Date: 2010年07月23日 16:45:24 +0000 (2010年7月23日) Log Message: ----------- Fix image clipping to a path and add a test. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/axes.py branches/v1_0_maint/lib/matplotlib/image.py branches/v1_0_maint/lib/matplotlib/tests/test_image.py Added Paths: ----------- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.pdf branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.png branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg Modified: branches/v1_0_maint/lib/matplotlib/axes.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/axes.py 2010年07月23日 13:18:47 UTC (rev 8569) +++ branches/v1_0_maint/lib/matplotlib/axes.py 2010年07月23日 16:45:24 UTC (rev 8570) @@ -6732,7 +6732,7 @@ im.set_data(X) im.set_alpha(alpha) self._set_artist_props(im) - if not im.get_clip_on(): + if im.get_clip_path() is None: # image does not already have clipping set, clip to axes patch im.set_clip_path(self.patch) #if norm is None and shape is None: Modified: branches/v1_0_maint/lib/matplotlib/image.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/image.py 2010年07月23日 13:18:47 UTC (rev 8569) +++ branches/v1_0_maint/lib/matplotlib/image.py 2010年07月23日 16:45:24 UTC (rev 8570) @@ -338,6 +338,7 @@ gc = renderer.new_gc() gc.set_clip_rectangle(self.axes.bbox.frozen()) gc.set_clip_path(self.get_clip_path()) + print self.get_clip_path() if self._check_unsampled_image(renderer): self._draw_unsampled_image(renderer, gc) @@ -541,7 +542,9 @@ **kwargs ) + print "__init__", self.get_clip_on() + def make_image(self, magnification=1.0): if self._A is None: raise RuntimeError('You must first set the image array or the image attribute') Added: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.pdf =================================================================== (Binary files differ) Property changes on: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.pdf ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.png =================================================================== (Binary files differ) Property changes on: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg (rev 0) +++ branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg 2010年07月23日 16:45:24 UTC (rev 8570) @@ -0,0 +1,659 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with matplotlib (http://matplotlib.sourceforge.net/) --> +<svg width="576pt" height="432pt" viewBox="0 0 576 432" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + version="1.1" + id="svg1"> +<filter id="colorAdd"><feComposite in="SourceGraphic" in2="BackgroundImage" operator="arithmetic" k2="1" k3="1"/></filter> +<g id="figure1"> +<g id="patch1"> +<path style="fill: #ffffff; stroke: #ffffff; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M0.000000 432.000000L576.000000 432.000000L576.000000 0.000000 +L0.000000 0.000000L0.000000 432.000000"/> +</g> +<g id="axes1"> +<g id="patch2"> +<path style="fill: #ffffff; opacity: 1.000000" d="M295.200000 388.800000 +C341.027096 388.800000 384.983402 370.592702 417.388052 338.188052 +C449.792702 305.783402 468.000000 261.827096 468.000000 216.000000 +C468.000000 170.172904 449.792702 126.216598 417.388052 93.811948 +C384.983402 61.407298 341.027096 43.200000 295.200000 43.200000 +C249.372904 43.200000 205.416598 61.407298 173.011948 93.811948 +C140.607298 126.216598 122.400000 170.172904 122.400000 216.000000 +C122.400000 261.827096 140.607298 305.783402 173.011948 338.188052 +C205.416598 370.592702 249.372904 388.800000 295.200000 388.800000z"/> +</g> +<image x="122.400000" y="41.800000" width="347.000000" height="347.000000" xlink:href="data:image/png;base64, +iVBORw0KGgoAAAANSUhEUgAAAVsAAAFbCAYAAAB7zy3tAAAABHNCSVQICAgIfAhkiAAAIABJREFU +eJztfeGS4zzLLNp67vvc+XJ+WECDkJ2ZjTJvfdNdtRtbQggpcbuNZc8Q+X8qxPsxhsiwzyHy54v7 +Q64ygbq6/6++v9LXru+dr+/sC2z/edh/1fd35uex73+Y++98z9/9HXz1u5DLLXEGf346AIIgiN8A +ki1BEMQHQLIlCIL4AEi2BEEQHwDJliAI4gMg2RIEQXwAJFuCIIgPgGRLEATxAZBsCYIgPgCSLUEQ +xAdAsiUIgvgASLYEQRAfAMmWIAjiAyDZEgRBfAAkW4IgiA+AZEsQBPEBkGwJgiA+AJItQRDEB0Cy +JQiC+ABItgRBEB8AyZYgCOIDINkSBEF8ACRbgiCID4BkSxAE8QGQbAmCID4Aki1BEMQHQLIlCIL4 +AEi2BEEQHwDJliAI4gMg2RIEQXwAJFuCIIgPgGRLEATxAZBsCYIgPgCSLUEQxAdAsiUIgvgASLYE +QRAfAMmWIAjiAyDZEgRBfAAkW4IgiA+AZEsQBPEBkGwJgiA+AJItQRDEB0CyJQiC+ABItgRBEB8A +yZYgCOIDINkSBEF8ACRbgiCID4BkSxAE8QGQbAmCID4Aki1BEMQHQLIlCIL4AEi2BEEQHwDJliAI +4gMg2RIEQXwAJFuCIIgPgGRLEATxAZBsCYIgPgCSLUEQxAdAsiUIgvgASLYEQRAfAMmWIAjiAyDZ +EgRBfAAkW4IgiA+AZEsQBPEBkGwJgiA+AJItQRDEB0CyJQiC+ABItgRBEB8AyZYgCOIDINkSBEF8 +ACRbgiCID4BkSxAE8QGQbAmCID4Aki1BEMQHQLIlCIL4AEi2BEEQHwDJliAI4gMg2RIEQXwAJFuC +IIgPgGRLEATxAZBsCYIgPgCSLUEQxAdAsiUIgvgASLYEQRAfAMmWIAjiAyDZEgRBfAD/jfHTIfwf +xVCRMeanXP9EYrvuy0N9Z/+qL7kpu7Pv2r7qq9t/wsnfohb/uK+l/zvb7/h62q/tbV+h7G6/+hao +x7JqA/vo6mm7dvHV+nf66vC/Gvd/Y9yFTXwbY04zEq6MSVAaNrY/yn61vWuL+1J8pf3iS5q2Hntp +u+xvjvRxs9/5ahlu40vG3NIw/Q4qWX7F9ml/1/YrpPsdwrb9Vwm5kPHytZRmdftf69/pq8P/YtxU +tseARDsnuSPVjoRlfNEW9u+I8yu2W5KNsSXi+8qRgPji72+0ew+MotISd7uvMM8qeZ7Tvryuju/s +vmK7Icq0/2Rb+zRl28VFvBX//aGyPQMjIMuK/4Gysdnv7LDu1XL4p8nOTgBI4NNwNPUC+1L3VUaq +g37vti2OhV1G+G/rsN2mfrsP2zquORGdkyPRp9q4bdsI2OZoEi4Sr9fJxVha+ldsN8ensF9tsT+B +fR0if+b+3xF+6r6dWDpblVk+Zvncx5hJtsfANMIpJFX7okpNSvOmznxJ+NJF8Yrzg21vL+HvVDLa +V9JNvnbz0G2PtU8kHqyzPua+pv0NHtIEo9u7U7Tm9C6F8BV1OsoQbH8SpToxb9p0vnfKtsa6aUMa +OA+mEU4hEW0h2bu0gtj+npBdmaEgQUG1Jdamf2swyj62bQmzbm+I/IYhEnHufofjbve5j7TthFqw +I+f20nr6NGIUyX5fId0daTfnOP9u0slAs6+OwEu4j2mEpinxXvz35w+n+QjG5t9dWgHLpw9dbODy +vbbd9bkQscTJALel7Lua7n1oKi8ph85nktpzHMg65mdhq6/t66JGcRLKpT/6qJf6Vu/2JfWgQ4bZ +dekETB/MPtRUs/lpJ7bs/4U+PJ2gkCKYfVrqYJdy6NII9p2ZPXEMTCOcQrcaYbdioEkV6Nwey9Kx +xoeAD9nU18v9mt7Y+RC5Yml8jMVftHHDnVqWUpwK9j4e0wha4npSv52q3Srd4ScNJ81qv9u23pPC +he/AfZdQO3+lXncpAtzeqV8LgTRwHFS2JzHk/sZXqUcVO5abWfKsYKfybW+CoR8gb219ZVWaYpHc +flG2Vckmkr32XRFbOapOAR+Nch2LbW8nphCdHKtPCfUpMi/Ti4+qVuGG2RjFR1Gwl6gGHzVGbba1 +2P2d81hVqbWbqnXMerV6VLmmbOsNsa4+fS/Eu8Gc7TGAqkUCGpKJUK79iwtQxTZtBPaXenFf0X+x +m9sK/ZpWTOT5HVXaqGPdtMk/uUKCvm0+d2IA6x4Ur+ZpSWP0VEOtz+2jflzzZ2eMods2uc8yllcU +60N9Va2j1mOjYlunipLrPLj06xRG+YcK1z5NzJjAevq3KFsj9N5uUa2TAcaieotfkeYkYUGG3aJQ +i7IdtY00vp0pkEGQPHO5pPLYXxSvQj+lzSVCkQ1HbtMpWh2+PZw8R6hnLXF7LnVE+2WSNyw/fY2i +aN23qdRdPnZRwU0b+96r0iWOgTnbU8ClX7vlW506HdgW2tSVCrbd5H911l2HD3y/O9WbFLVAHUil +MS+LrU40c9WdGpZSlBRXQ6zA/4uvUdovuOq09gNdJN8pvVCwKNYhmtIJms8FaG6ErBB3PXdAH553 +tZ1qL+V8VHO8OFTYXkZV/VZVTBwDc7anMO7/LYq2Kl+0T3Wrmq0KdjiBz51drreqUen9mUL0PGV6 +Kk6iTNCXTiKFWNEOVyV4u2cl+6rizSeaYjPVZtzkGkCOM17M4YLiHU6IZge+EovCl2EKt/jCCb+m +zMZYGXm2bRWtTnUqq7JNinV+1hwuKl38Pom3gznbU3BSqZfjIkmtJiIqZOZEV2yczCZVwX78q+3H +bX8K+wP1kJEL9gEKtLMJX6B+s0NpZVixUbQZCjU7Xx32+Vz3hSq0SjzgdXWiXZXndgVEPS8kxTnH +VRUsutHGppw3In5w0CrWbq6nq1emkvgnUNmexJA2V6siMjY53ESGnY1k5dmuWmj/ZUWspXxRw4mU +ixodplp7G6PKTIZI2FPBpf1iP8alTwf6WpWsusps+pvEOAbYlFUJurQRiTyrQJshQ2EcVR0vOdm6 +n/vwmERmDE0c6bFc6APW2w6VaxUCrr+tynbZ16J4B1cjfADM2R4DEACuOhAjyDBrlWOnaEVAqqD/ +2hb3oQ/IZTohYt73ru0sV/C15Gy3Y8h9y+w7Hdc1jlZirSp1pP/u1LL1CNISOdo5Dklv0x7U5ni5 +bVNgQx55fyG8WaaoYME2jUGKn9S2lAPIsefB1QinMPp//brW5p/Iqmjn58DcrYD9wPLh5Si6FgWb +2mcFq43fIdD+tu2qZsdih9ffpjRju1Oy7TpbnQ+B1Hyrf179DlesuVzbtbKy6VskcrvYtsa6aTvL +0zit7aJcRTAnO6Y6VVSnnYpNN2fHnO4xH5SZc5Q+m98C8XYwZ3sKuBJhydHelc99EVdLdrmdxFNV +upW86qqEtOKh9pvLdZaPuiriVnlm1TlKXa86r21vMZ7GWPsLP2OJZxdnUbhLrPu2WsuTKjUSF+fQ +nFPNn+3KglfU6JBVjbf9rfE8totBEgfAnO0p2I/3KVc76j8kYYmHnEbvMz7V83CugJO/8djP1Wiq +sEnwd+pZi7/lnQ3YjzQ52lnuN/iqYrWcbKVDWx0Bdtg252Fxkq+yqjKtp9jXmHhYZztKblaXvK5A +uzkn5d0Jvmrh7t0Iksenpby1hxyujCGaVhvIZhWC8AmyD4I521NIhIKKUEJitKsTQoKkp8q8OfoQ +qLMbVqAOq2+XN2ZQcrhNjrn2pV5ecq4LwUX5Etej/dcVK6rOV+Jyq6n+suor/l0x4vzBUDaKMZRp +/Aa2/dyo0jDLcaVIijJe8sDtLKyzRJwDle1JgMJbFCr+E2lXHGztS5usZO/aKJDy9e9J/WrJ/w7w +0ylYBVvrc6Sgrc5OKCPZyo1ideJerovrCoiLuXRZ5WBfhFwrC6zvbmXBEPgSrGc/25Q4wBZ8DPNt +49QSS56oSwXLfI+DyKo+q73PCY5vfklL20YVq6zrcUkHx8Cc7TGASt3lSJ2YQL2KiI5xv2LBy0SS ++nzyXVdDdLZpBKh4a5+9UhzVtolDwSAr130cdSt3AmoPFGOybZ4UQ9sUsu+FWkxPeLW+i61M31U5 +o2+JLh5tk/LNU5RiARvN07i3ld6WeC+obE8CCM1TdA9v7nJO2NSjOAlF2ylNEUxHWJ/JVgQ+wXZU +22o/VSzaQg42HdFj5l0hrZLUMbLDgBwtMI6rSrBNyhImdKRyU7ji21fxFU+yTSsajNlie5RVDCmP +WtoNaLd9GgyYLivURonP9bNjqlW9Vauz779jhoo/mFFWLExb5mw/gv/6nBjxz8AfcsrZdkoXyAWJ +KBFjo35FwAb6MHu53lA1LJ6cAEyx6SQIv9LxeAXsQYVVdVfzu2InGMy7Nn3PsUQKoc5VnlYjpFxc +4pSgsd622pU4S25WBFSwqU/0B/nVuKs/5zM5MRKGfm3s5aup7nGItznc4iPFiX1v7YhToLI9Bfv1 +7t7AlepDKUZqbqdWUf12NtPXZISB5cgSsyxeUl7iluLPuHQXm0B+V6CrtCa3UaUDc7qhSDUFZVht +3Ve5JBjeh0jkb6Fff4NXnIQUn0Rzch1z3NGHavE1JNSyP2VmKw8gXvdnT7XJHENlavyBKJwGZvlf +vCqQ/JnmAcqSohXI5Qqo55gy4v1gzvYU4Laz2qXzjdK9jlVQclX9TvOUR10UbRBQn5cNheq+jDyt +3PvOqnPU+kVR4VNpaSK8zFXpUi/R3yxLZFl9Cfha6qNd5GSDlpOtlrisqQ1Wr7hSSzh31LicXPHp +MvRZVWXzU7Ah1L++4F2CT4V6ryplIsUOfgZ1Koiz4NKvU8DL9i5dILIhTIG6XLYlUbOX6kv7eiRk +Kb6AcTwFUX1JxBCrVhtWcAJtCLsS4yzbkmznC+uTnxIKAoSr7Hw5CYMfJGFXzJnIGiF+fQzJaQUn +UhgXltkJqUx59DV9pfpJ+CJ1avOUp5jSqMsG8W4wjXASRkhOZlGWCRPTDHjZncvad51YvcQNq3Hj +xy6n25tqePnufq7yIHK8JEc/cKIQSY/rjnx7PerhBtkA/1bmNAhXCds0wqY+/ECZ5pj8ZTZdXyox +J1PpBuHZQwT2Qhwcp02geGpBsbzYjvkjWB9giC9wzPRBu9TLFfwIRe/54PGcRsDfCnEETCMcA6hW +VIzNpb9fzqc0gxGhHWBwo6veODMVOiT3KRJ9jSYFkbQbpDuqsgSf/n/tB5XlMPrI/v3EIqU+yTh8 +0KJRuI9phFzvfoxoavpD8aYcwDm1xFH8qMDQfCqGkzIqzfRAA4Rr/VxvKMPgYBPKU6gjYhCck9KP +lj6b4RKHwRfRnIIR3IAD0ZViqW/Kr+1QtP2Ns0l9f7APVLSgiD0OJGqL4Sob4BPjVQmfIxH1PFnA +AEaJPallq4KTRFruheQ4ctmdgl1ek2ivVUz1mr8MjRNLWnKFqlWgvr5eEeMYqI5n7Ipxojq2MeTx +3ipamS+8+dPUz8eI081JkfwghMJ3bg874I8PT5qkg2NgzvYUCiFlsgWyRLXlNnDQogp+RfGijLJ6 +73Pt7+KfQlZwU+4SctBGcmxZLacJEHvfQHsTzkt2f77nWcHeKmDVyAwsbS/PyJ/BYdi37FUrRpzU +sRGqRNpHQF37CQb7lFb1hmLNXxt0kdsD0i6OsauH4ZXJIt4I5mxPwcgqkSxsd/XFLi23anKwWTVD +/Z+pBkHcJKKGfkeqC8IGgSdVLad1sSnPinFDHlbCt4JdVrhIub2CtTElBQz1VeEOU7NiJx4JlSci +izpWiXjV4p8nDczpqrWebVFBOrNdy8qWF9wI9m2nkTlPJSm/Vbz4wEJVp9fZMbedZXEysP1SL9EF +8X4wZ3sKaXVAkFwQI+7DweJtrX7kA6C2XfowUgJF65flRUFj3Wy7PNwQHXl9m7MdRUmmPkrbPFES +KrUe60NCRc64tm13L61p1PEkFwW16Vd4VVkuMV0l6WU5+Odopg8/WRWfIqhKoS0MaVG0sI8PTaRc +M/TZXESkoS1zBWNlGuEcqGxPYkgVK4ko8Sbwrv7afkWVipPf1xXt1TZu1OU4MC97l7Mdpa+rv1C+ +tV5hbNs6J8pQeK2CrUoxIvC2CnZRDkq+qMhriuIEhCrwWqlgdRJ1c3K3beV69NfVcm07yTupZVCl +lwCGH44r2zkTrlLXtlnR5rbl7EocAHO2xzCCJE2BoNqrajTlZyWvDHhRlV5E2yjaWR/k3tQ5keIQ +hi/huprheEYQtET/KI2iJUq7GxX7UHf57NWxQm9ZnoWCjbRGmER2AL4nJ1IRwemdc3JbJ5ryqbk+ +VCt+DV6H7e7UcJLOkP+NEJb+vG7uO7djPFhGvB1Utoexy9nerVLonrj0dhLC5dYnkKkT5nihDkSP +q7+6/nWXs4V1vOLE/qyAUcWiSvU6IPJHleovnrEJuVeweHOwrjoY0weuxoh3I2zqYAy9Wq552LC5 +W5Vg0a4/CsmfSdkKzDPuT3+obPu7icQb8R/n9hCWnG0cxIvi9TajtLPyq+5aWYByKez80Kx9oZ0d +xK5KBci0GwO2EyfMWJqVCS/yudlHUsdFAYcH8Ffzv+FMTP1mxewhwOoKrVXTQyG5qlKhr/xqdU2h +98q2aOpWnZb8MOaOMYeb2sy6qmizKQ7Jt1N8ZVawXXrdA3EEVLankBSihBDB8kactHncuX2Xwx1u +H0rL18+6fyBaLwdlBn3UVQg5nbD6ChKpvrKyRPL1fmT6k1BvSeGOqM11qHAzoefXFYKCrXlUa5VU +6sXadiKKlQrxOaovBV+y+rK409Nf3sJOIn2dj7FTrcXe192iTfw4Ip6x80WcAnO2p4C5TSAm/+Ev +SlN6e5MnNV9qEsQJORNIq55rnrXYtOpYQrNmtd3lScNmUaxVTaOEMjIdq/oFYYeTu6rOao/mGn2n +OlSWO1/wlUXr3RpdWcul6RsGpSBPR/WD5TYJu3wxdJdi1mRyX75MHPFOUNmeBCjFJFpKbjPKwT6V +TYra2NaVBaaqOoW8vJ4R4gwBhJfzofCcfGd/I50QimL1MZQc707hCoxBNgpXUP+GT3UPdWWCSLeu +Nq8ECF+uBieT2Z8+79bZ2isS65Nh1yaceEDxYpyoxG8VrV/qaKp/VK1o47b4IxiyrFaICSYOgOts +j6GqU1Sp0+ROWSYFO9unYxJtBPzulW9WqJt+ffkYqNZEviXGRd7lfluFK6CWi75KahnUf6tYcUzJ +QoFjgZTx5pbZm8IbxbfaHDT2cSYRfO+Cr3qw+hm+i9eRx9uqY09npPNbUqKJG/MFQnAuzlLjw8tj +WMRhUNkeRvfGLxMabVkizFm3Cp9riZeTN5Ch4KoDbK9xsLsCljjYwc+1fAyUnJFvl/8VVNLBHnjl +a34U+ncCHjm/uShWXMGACnT2nPOdxm5GbJjvhPHjigUnTIhDr3jTWlqPV+YyMQnfU8FeXAkTO9sM +TxfYFxMq/17twpjqD0Dk6hPSOVZmJxT37Y8Y2++l/OjSD5I4Bf5ZnFNoc6+NOl1WLZgDjePE/KVV +BrISra8UKH2g2h2hFNc0wwgStxgwtuQbFFi6zNX12MU4CoG0CnfcKFagEZipIG8n6qCxanuV5z6d +5jTGqGW6r0JUvNG4LtO1XkLtDsHlA5FpiIb4RyUH/qmdOo0Yh2J8UVbCaHLJ9ZqibhDvBpXtKYDQ +wP1QmgIk19u5QlwEDSrPp75AAe/iav2CopWRD/QxaQ+vT0Gh1pvkOv/H3G8o5XwScVsgcHy/wMC+ +gGKtp3g014iz2Drf55UEpspRDdqfwlkU7/xS3HYYOZb8blXeIyb+Urv4BVSVHiNrVWpSpDFXnibG +XK9C33h1MWSutV2+LOIAmLM9hSVXC5foduBVVdsox0R+ywqH6K5TwJloQbHZMdfFBfIs2ue2Vzdg +m2LNanH2ktXeWFVrr0RXhZvIdNfXUnZjO78CtSka2Be0R8Vb/SZlawQOnAt9KYSSOA5EP5zCogy/ +a4GyqlLhJ7eoYmuPMRQ74hyobA9ieUpMNgq2li9lWfktOdlUFgqrqtTO1v/G2MhHdSZaK0OCsH5k +ab9VuLNdl2cN8s+0WG0HDDzoGZ/aqop3qtNxZ6tz5YGklQTDloyVO/xp7WtnK9ckX5ybJ2FZh+tP +nfW27bsOOkVr7a1usY3xhw3U4ZUScQRcZ3sMIDFuFeykkI0SxjbtY7xVykwCxBtTZhPlcZAm2eSk +WMm369sIXYqfIrlgKx/H1dZIdT3evaykFrLi7PK8RQkvf1ss+0sxolodWIakr72tFftXE+SX+kFV +Wr7G8GcFpczemVtmdG3vzbMdzK33TRwF0wjH0BFsQ26gEhO5GQE/tE2X7w2R26evUhDZxDSjHvlg +vKLLqwG2bUu3sVdPBleb7iGCUdo8pxF6kvZYUsX0ZyyoNjebtmkSZvoDhpKJu+s7+tE8VVcseKPN +/PnPBtpiHxsy9bYlnvXEEm2RZMm158E0wkGYahD43KUGgnjFSXRVnLltp3SXq0YxAs0k2T0o8Urb +vHwrYtzFIqCSu5QFPjobBBFMkB6ZldfTCMtSsaksTWni5bnf3HKbvH+5ukja7/bP8qunTPxLmsHK +7O4VLhWDMaxtZY4lL2HzFAWmArovL302X3TXlnRwDFz6dQqtIm0UbEtSRYUCIeVP2R5PbZsqheC7 +r+ruKkNC/eoY7Pit/cVn3HcP2Zc4Y4mttgW11r7hC5QjjCkp46QSg8zU1uWWG2N9HDnWywJiszIY +/tonqto5h6BuFwWb7GD/lTjaeInToLI9BVd2sS+yqthe/YbqRV/9Dae8H6TXKEkZ3ua7ijarUgiz +xIQnC1OvSaXiDTiPazwQQVW4q+L1m1kaN93wF97eHEu+Io50w2oSo+I1+KJEX/Q1S+9VrRab8mU9 +fhpRx3w8fubJJt4M5myP4VkRdnnYIL6iqBYyfE115lSE5oNpS7Sv+q7tCvHm6llW8r9Vpe58NVzQ +Kc29eu7abeI0jnLiQrV7064p+66qzTFAu0ffl7M7JZxjyL7TmYl4K6hsD6K+VOZenWbl2dvE/pKD +ddWJNtYmlOhoYlqFUxydrhxLX1fOFnyAm9nj19UyKLs1B7vOafDDndK8GimQZpujxXaenxWJJVQq +8diteEy9Yo3x+DggXxu533HraznzlM9h45Lqe99mufSon8QxcOnXMTypws2nNUUp0uVcWzUsW9+L +whuTmgqxbpegLaS+quQ+ntcUbrfKoH9ZTXbWqdSRdrq8apCnKJD+jSJ+WaU/qMp4YjfmsOZcF3Vc +fyJDIkcNA345l/tgQ5wBle1BdKpRHsoWFSu9Qrz2QZEtxDoWYYRM0anMtG8KD47M/KAEkEKJa5sP +TjaZaJe+gfxapXi3b8oR/Ripaowhbs/lfcv3pvzvtFQboCIll5MhqmGIzek5qdoYxWUzFr9LP66y +I5b0JVjMNgYpdt2njT2dkYl3gn8W5xQeVelrSrJXqM92vfJ8aIcH9O4xYx+bNP4zFtU5yr6FVNsg +Ocu9An5FES9KsYascp1sFL4beDfCsvQMHo5YYodpVJwuKMtq1BSq9SONil3nEW3SGt5N2UvqGSuI +t4PK9hRA+aFKXVTtojZzfVWFo/GBZVUJZx/lkrmuDMB6zKOmfuOlKvVAXRRumYensWG/Oa69Ck37 +0+mAetE4oXkc5RL6KgvlK6OoyelDkcGqcrQZBKXocQyYFMmfdcXBsgKhfWywMDcyuGrur1Oy6He5 +HCFOgTnbY0AJc6M+d3bTRfs5txeifSDrtk+UWU0/S7pBjLxuYqt11Wepirihj6Jma270q59dDnbA +xq1KFedgr6yP8lYiT21AHQ9IMfiJzeoVTnR39TBvSeHGFGZFC2PzOEsb0sB5UNkeBCrXlghv6mt7 +s/nX+j0ZQ94WVG/Krab6cuBC/wP8v1QfEQaxdqkWyZfz96sQ4qEGV5mgEv0JrK5ei0odXfsrRntx +zbLqQHD1wvBefKUAtNqp2pf3bXWCDFDr9QsuP7RO+RJHwXW2h5Bzq7JVefvtOxW6Ucb1wf260uCO +xJobZHuibZQtohlTUo7dyWZuLwrsZn9Rou0+zAdeemO5wvi0zNdNPf71h5R7lXoz7qZevIsYPypn +rJeiSOWhHr6qJ0VLyXUeVLaH4LM6NvuFkDr7Nl8L9pWs0iWt23dEWVYwmCLbEGurLpEYd4p1ubmG +l/Q5llghkKbhUQ1v9+vLvEejfmHVQrXPOdoROd3JVLbaw3K26WXgQy7fEFl+WTiqVNvDBMFGectm +H/O6yKrpR7FRtFLKiWNgzvYYUGGW4tvtjWq9Ke/INOzRfyW3IJhR+0CFK11f/RjySaCuDMjEu64k +aHze4F7dljytSj5hmT00wvZaps9tYZw4xV1OF6Yc3wTZtk0q0/gQ2orcqNJRY6sPakiviK0vfXnK +iX/Af39ItkdQhcJeyeJBMdKB/5LKFUmq1NUZqlI4su8UsfkaT75M1dkQFl8bYi2rHqp6zr6m4pQ8 +P7hKoCPtrFwljcF9+Z8dL+tZNcepcGf/+giV6G3RV1XCxohWPr9896WyjGnZ71Ya+Fltp2xj3xVy +x+hV6RJHwZztMaASlVU6DNjontLy/a7N3kdSrdV39dGq0iaOJudbfWTSzmO4zf8m9Qy+GiJtlbap +uOZ3/LQm130Zl8GU+Ha3kkDmOlz4flDZLvlXn5v6iPC0r8q0cioqXl/KdqN4pexv1DD+vCi5zoM5 +20MI5Xqzv1OXIoLXt2grklVyEjgSB+nO77JU6VE9h0pFgvODemPbKtiyHy/Pnq1tqdPWNki5X3db +8rCTcUyR+p++kdhXZ7W5emCqySGYo4V9tctyWAlgJyFYmZCUalrWdbWxkWflWz9xxJCnNUWM6rpl +XLSV8jQZMrWNgzgJ5myPAQ7CWiwirfJERbqxzZfyXdvaD25XxdvYLm2LSr3L2X6BaPGyulWsra3N +xn4d7rqettimhxwUz2lLnha/ClS9bovjr7aglvFnkNbSiva5XNv/kq0c8winAAAgAElEQVR1P38n +L9p6Tje+QuIQmEY4BiRCKK7Elwi2ITORbFMU5khpAlM0G9uW0DfLwuZ+Iq9CrJX8L6K9nw3fH6HV +6oMSi60U25Zosd3OtuPGktM1oSkxlXizS+f3gX22tiJrakHu9+/I8bK9J1185HYlVhDhFjeccym5 +zoNphEOos7q79HdbUEWOkYlnvTGWPMKlfu7DdFxPkOizXLq7quri7kh5pLjWuJGUuxOGgJ/+xtdd +GiHdAENCxEX/kxHx5lha+yoSd/JhWVi6wacapKvhB1MJAtHXOG0/vuux2Ga9aV+kTeTsT6ftLLty +s2CzSxUs+9iHEIfAP4tzCk8pgYWkigLGA3inkt3v7lIffVx99wo321RV3KlWJMm8bjbHltUkENZC +tEGnfbqk9A0nhEzCWb1Wxbp8Dc3ueiMtK1fzmh52EFlSC3hTzS/XTUm6Wp51RT0vileyMr327WQB +ShV8iEw1rDCGG7VLnAWV7SGgWvX9WYYzviwRg3aZD0J5eV1nl/x3ytHs1hQA6q+WTCHeVf12y7dA +r46GIO2uOiq6eiNsRN0+Lug7j3xb54oVbsop3PwSkXhgQbLK9ZiHpIcX8k00278mDbVuukElpc4+ +5xd8q3jx8WHR9FBFsvFd+3GMdd9+GWTdY2DO9hh6VbYoSjwAsd2iPqUp2/QhAgfcThVvlDPKo6UP +OCglpwNyvyXq5WZXxLy94VfqnhRsVrMi+MpCr/PhAXEvr0ts0hASocXoZVHLrZ2nKHIc19cDyrkq +3kT+pR3aVRUruipXjGM3b3UCibeDyvYQ0qxWNTvLqh2q1VxnyhDs3Ee+//6keFcf6938S3WG73wD +LGtHI+zed1i670RiOeebyfRrCrbN6arEci6r06yWVUTqUq+Ul5W8xMrbpMe7QJvOhxWSCp3qViCO +pFDhJHSp7VK3LH0Y+Yv2iYYfz7KkC9jef5BV4RInwaVfx1BUaV01sFWlNyp0UX/Zd8r/iiQfdpiv +dXvf/n/NLUtHhiXcrt9R2ksf991SrnqSGlLntKjl8sBDzaPeqlIjeHyQwEIoyU4nZkszdErWmpnv +mku1ftXSM+Bb4URSVO3qu9SZb8VZkrzcVojToLI9hDqrtr/c/Zc4Ql5rc694E1EuCveuzsRSJcDo +JytLsBvhXZI/XZWlrIq2I9r8gAP67pS4pAcUgkadAlMMSaWO1GshNVDAmj1l5Yg3J6cdrFLwVkNk +eUGNmCbGmZve/AU6xaauMhCMRdY6BRtcj62137xJvBfM2R5DVlu9gmzsBxBi8rGq4LqOtM37pnaN ++rXQ0g76bPoxX13OFiNY8sGdIm4UaXlAI58QOtW7GZfVqe5PLn7myf25Sh1Nm7lRT1oisuRo0wmo +U5tQ5/0vCrVRtTYujAsVfFWx1qc2Y4E+m6+SeBP4IppD8FltDtZkl8g1Wqc8rB+Na24097HxVVYx +tL78IK7KUZwAF7Vrak6uxutB3K3pXYk2VjFkNZg9XDFkdSx7X1KU5byObpV2ymsWX3b9bb6GFL+o +ns2HfWl5+Vg6KSoq1nxCWlYd4GeraqtSjfrkKync6leIw2DO9hhQWYrkA6pRvN3KAyllbd639LnL +u6J9c/lu6NfhrvFcSmqNo1WhKT96l1vufG3UcSLtaQ/iPqlB7yJLu0ptVmicFNQFfSuePFZq9zhs +27kNbLT0PXKMi2IFX20fZjPAr+ax+69t5PZJ+RJHwZztIehue+TyTvHiwXPt36vf5RJyUY9hnw/K +G7Vs9k1aoyfOQgZP9vhaRYl4WkXrcQiU3ihg2EoK1icU2o5Ek2GvYO8nu+LXber/I16yk9bhdvZ5 +BuSurD5BVu21lons87rFB9n2OJizPYaNgrXPNr+KiMtPI4V7xVrsvY8bhZvIUtMB95wbnQRXX4AD +0bR93dqjdR5Dq0I7+7S+tlfD6ZSCX4U89IVCfNS4m3W5OHd39hrzlah/OXmJq+JH5WtjwBUPab7y +SVrzUIkDoLI9hK2yha2Ul7WNRnW+1taU6Gq/Vbil7eweYsjW3Q2tpa0I5KGR8rq86qqtXZXDk2TV +S9c2UaTGCQqJc6tCS941VhY0itfa+prbVWGm1RA+oZ2alaZtxCaTsNPLbpdPqMMfEX6Opsw+FcuI +k2DO9hhQcQpsb5TuQmjQ5ubJql0fWJra1hfNNLHs2m6V9fLGrhu1DagK+FJaX2/b3RYTMdW6jule +tYP/RF6x5KvNBUOZCMyf4geePKph/8vwcSzjbrbH/Tiefo3EWXA1wiG0ijQpxvwD12q72OQcbbZB +FXyniMVTdncrC/IB2f3fqd3ulJHjilUHN6rU6XWnaNd1totSnf0NuRRlXhMw5qoHAe9926pawx9G +mykLRxNttdRETjeeLEPtXBRu8tOp46KEHb169s+O8YljYM72GO6UbFdvVS8oyaLy9uq4qtS+zb/5 +Lv2MvXJE9bcq6jwnrW/5mu9Ke+5bN77hIuJJte4U4T7u0m5Rmx11r7PTqePkezOG1rdW38RJMGd7 +CFtluSnrfvSv+Nip0J3Crf18V6VWxdrHsarO2ndVg3eZXtR+UZ5V6S49IHNb7nybatVn1bqscEhx +1NHkvnXxeddPp3ClbINvu9Olr7VZt4lTYM72GJ6U7Kv1rynBzuejCu18avb5nN+8i7P67/teY7uL +M8e0U7RPce5n8/U471Tmbj52yvs7vxTRXX/f+7URZ0FlewiPqlS/YFvKulzoncLttavFgUQ65uVn +r0J7BXynWCvhrypVRcrr/15RtKiZe0W7XXlwazsj0mdV+qRgX1etuF1stdr2J+NntfpVZYu/pl1f +/7L/Tl+2/05fJ+JU5mzPYf4AtH55c8Kb98P+s07Z9bXxpSK3d/9bdaevq9CX60djq6stkq5hp2i7 +g2ax1Yf6bfvXbGWO45VvEre/pU7135RszOoQkb/Fi5btJ9tP+lpH8O++av17fJFsT8GPgG8dOv22 +Ptg+9lX61Tvbja9xY6vfHWNzUkjvi822+P8TUS5EqHvbV0k32eobfZmtfs/X9mSgNyeD5KtiR2b/ +Wv9OXx3+N+P+b8Dflqpnve/sv9OX7b/T14k425iNf+T5kntM4nu0HU29Nr427ZMvVXg14quX2LNe +N7ajscV6va9v+7UXk2sfl8347qYS9vtku9TXP2cT3+6zL11tAzfb+ortpl6/YIv18APZ0S7x7/jv +j685FPkj+cAckn8uX6n/X/Vl9ad9jVTbaI6q2BZVitvTVsda3yjNy2Juax9F+pMsT31U0qivbCzE +slVg+AJuXetv1doIhYYrYtsxWxstY76ztXrt63dtbCyViitlLXPSjL+OOZ8wbr+R9hvD8T/ZdqcE +4r34b/zJ57Jusr9b/7/qq8MpXwobSWGOUr+xTQeGt9mp4cYnCK18gMX/7sXOA7t6AarCvscmDl2V +tnsdneLF/xv1O8TfuhVqcnNjTXNptXUPGttBh2sP8dKZTISZQmWrhhcFvCzNWk/hfkrR7KGLM5/A +w6b95equvtsn3gXmbI+iO5g22gKULr66b2mHKrL7E+UizrBON6OJo1XJewW2xDFie/eQQP6DhtlH +WhfRPE21VccljluVurF1f6/kRhs1vShXP5ndqGF9VY12Cre0UVnqs59Yb3urZLWvJ86AS79OAtXs +aFQsKtjR/OCrGi5+qnI0D6hmq+bslonVsuQbVGs6KBVU5yi+tfE9YjviLgu7Zk46+ZaseO1Z3ydF +253oUKW2viX7Du9dHnejMkGFhm9x23U5V/jIDyLc+8Z634Yf2+Lb/WffWe1Wn8Q7wYcaTkFFbvOw +6S+mbtTr8udsJB+Q8HfBrjqg3PhPkEicBqt6rgp2q0ohVOnVb/xBQlRpoLzTn9xu8rZDtqozTW8i +bAysUfIi7cqBfEWw993nvmPunlRop65l1vfKc+xfAA7x7OYh18cJ5ZWlaMQZ8EU0p1AFg4hnCpCH +9aEOLxlFkMigzA4Z4FPThSL54hfVrm9pp2Dn/zOI0KJzeAo0j22RlEYmNPvzM65KnXTj0Pe4BuZJ +c1w6Zn5ZMK5MG0ve1RVrop6kNJe2rUrNcQm20KZfZ3BUktC65KAN8dJxLMcTo/UA6rmeMK2Noo/i +UzflxNvBnO1RgF7YKdn0N6VAcyzlO/sox0v2bA8EVv3ISGSacscSy8OWt0uP8IPqCsNfkxO21yU/ +ssoyEpdF3e1yp0XFol/dtNVN250C1k2/qiX22bZdPSFwMuzV85LcKFPv6rjJy9rJtvyaln7TKUbz +d0CcAXO2h2E/fhcYWCaSVyVoo1KlHAyjKZPp39eiZvuBRCyoB6s6DiJ0H4oqtMakIgPUMuQzR0lD +XD5cm86xTnt7UTio5awOUaXXOIFmtLMPyhzYVktbjFOKll1WQIgTXVKdKrKo1NQ2l68KNI/Zt2tf +i1KN8kzr5aSayqUpt7iIE2DO9iiGS5NEbxfzyKJkq/K1AxLL7UBb1Cv6vNr6RfmoPiGmejCWJ7eu +l41LUm9hHuotxdSthphxp5iWtcZSSGh4OmFRmVLaSvFv25rtTSnuVR+eaJ7K9vne7o82xh+LTN0u +OfE7hZviTn3CLOhzWTc+m03iDKhsT0KLcm3KEj+JpKv1WuYc/UKZjMiFJqULFNGrv8uRupK9ArZc +cT54VdJTaFXBKvQ4lXfSl6PmUq+2+cbZcNWOBBfqEVXpE9GiegYaq7lkxR5yOmCndtOJEAgS191a +Xle8TZBwoFe48UcqMe7sq1fL1Qa2F5taR7wTzNmeAjIpHhy4QsHfVm023hBsrA2oN1X/EyhmcxHa +ql7zpST4MrVoeVxcOTCK4m3WwaIKdTVXVegoaq723dhcw80xx4xUDXajaOVJ0VbCCpX56Euj96oy +fRdOGPZVJEXcrDRYcrOln3nuymVVLVf1W8pwHkTWvim9zoGrEU6hKFq4T+UHTfqz5oknI//pwgMO +kOWpsKn8XKWOqUZnb7jWU9MnrkrAg7hRvPOIdHuVvKJi5oWveHuV675A5V7jgRMGxDVgK1MTqNAd +0WpRtDDarAx7dazzJNWpUlyvm1Yl1D9xo31/q8KNmBMNljRLkGRM/Kp+pWlv+9inwPgBzNkeA3O2 +RwHX90nRSlJ5t6rU25u/XXvw7Yp1JNmScrQ19+DhBQEmxbuoVAjF/FU1fKty9+1tPvDJtIpbom3o +eVmRUIgWc9yL0i6qFIkvlCH66pWkT3GJRfOUPOdmoT0Saq6bZXdxdvbLTBPvAnO2h2GKFhVu4jkU +HKB2US2mq28x/gMlmVQt2ub1sdscrfcn/ocIdQZmpH3FDe1nrANixTd04QlAgcAv01iFMECB13cf +jAHLm0p+F1VvjBQI7Go1CahTqBtFi7lYLYq4qmXNdYEHVYoK1+ayEH/EYD7Slw/b+B2EnX1nfTzh +YrtPvB3M2R5FPuCCDaVVq/5nxr1Zo2RFguWMnXFbiiotirlVrKZ4LR47yke2u9IBmsJ2DKwrKlXi +kn+ZF1DA7ZzN7X4lQrRY64wm93XWOBQjxlp8lyVcSw4Wx5jucqIfTC3AFHsf8liXpsh2FVT+VgVL +ytXaBtY1rok3gsr2JFCpooqtHCmv1XWPWqZVBylXi2QgJY9b6qbcdlU6ylpb6wtXKWhR6IJ1ReWO +UJgie5V6V4erEq6x1nW51kaS+lvUbqsMcQVEVpoLCe/qVKDUv5z8JQqmH0ZRrqWuqFLoMavQdjvG +trPr1PDajngnmLM9BVSxG7W21FV1WVcBgKQMFVXsdtsiWUUmO8mqVLKdE9EQyPmG2UB1XMdZh2yX +7AOIysNp6spMtUoysUxRxJO40zwW5KVm4T/q8GQXVx/phCUxBymuRIBIpnDbMqlRUL/1gQic0kax +jtRHqSvD3ileUu05cDXCKaDAUVkVbua6sOnUbFK6puGugnhPQBwwXjeDQMrq6yTtD19XO1dFDCsX +UMARlytReyPXwPWqc7/kaWVuiylFJ/wS1/TZ5WTLhT1M8EqeeYZM3ZUVDZr9e84Wc76Ka2slVGc5 +OXgOd6Nwg0Hhx1DrMCfrJ4Te57LCAX12i7eTH8nxEEfAnO1RgPQTkWVVgogsKhaVWc0n1LeI2ZFn +SnDctZsKNf2ZGTFZuipiULaxLdLlZU2xpljEiLXxg6QEKjKpZagLpVjmLclGRM5f1rrIJ9sJoSHy +pDarag1lmG2y+k2rKYrC9U3wU86WxSbne1POuPj+lk05YRPvB9MIR3FHEEjAdjDLSnq+XYhuQ9ZG +ukYk6UgrBOl3150sBY4+ZL49sfakDOTS/DkbTBsIqFuj4YWEYRZ7dStgm0m4El9edbwh7Blbp3ar +Nqk3p3J/6Xy4kFtd+iU7W+8nThCvEHg6h7cEnm0F7Ym3gzfIDsPTBfOoSQ8vqLTphYtQ7239YJKS +SmgeaEi2SSMGTXmdSp9CmK10HsG3tpaG0IghYrtIJk4emSw72/qo73L5D+3qyWwhWgXbNMGzrZ0E +3NbUr5HT12yXJVzQZ73ptk0FtDfoYKgpNRDUeWsLsWci5qXuKTCNcBJpeZfIVuEmCdLYdjfOXH1G +P/HUWVGnjV8nR1Od9oium20u/XG1QKNQ09gspt1NNrP1Yx5tVwWbWeE+jZBSBbe2gEJAC6HjQxmd +bbdeF8eCaQiLtFOvC7lifDC9Xdt/aIPmxPtBZXsKplTn9p2S7VRsbMeNJxWdl+XWBjUh9CGofEPV +JttlH8JWU6zR1hWyqr+XAeNAIo2lXhI3xwqxZ1YYk69LagBvrG1OGnV/XVUAbTtVqtVXVakrebrt +cuMpWK5VuA3xdm2z+pxj6tr6GMqJGYc0x2jfh89XGn+xJ46AOduj2KjWpHh3dQKMB/Z+1M26TgFf +TCXBvEAqWN/6hTocx3jBVx1SLbC4MeZggbWvbj47dQtEcZfzdSi09bLYD8LvVxqEj9K2iwOIrlOt +q69ahkvB9iq2Lv+qfpebbI0vwZiIt4NLv04BFax9opIVkax4r50kvm7VMDzMMP+P5Vt1H7WtrJ8K +DyHsfMFNuit+yNmamkU+Vgk1m5aLYU43K9lW3aKqFlyDG1Hubq7FL7tTw1VJIgn1a109B+pf3t7X +dn9Rk3cK+Yu+u2Vd3bKvrT3OFfFuMGd7FEW1JhUqWS1iPZLRuA7+xf6ufVXJaWWDSFK1i5LFS3iJ +HG3dl8jZWr4Xu7lVyZ069RHsifM7++uDDPt9J/EbovV8850a3eoXmAu1ucblXHgTr1GtL/a5qukb +JVx8b0Mn/hnM2Z5EVaVPn6P5BD/j7lM2qrX93K9SSJfOrkxh3zVvyR2XXHK7cgBPIPWEosUeSF4m +oV8ibhJjUu2hONuHNGw8UokU9u9IG4jWvo/10uWV/VWVZlIcj/v2u8p9lH2MUV/cr+Mh3g7mbI+i +KkwpqnJk6eFtUKZUNv3iPvrz/uVeJd/tS4l5GdPNfpqXsl/HsKjdL6hb/YYa1p5Yl338enfq8guf +S8z6j/uvjKHdn98E6eAYqGxPYadU0yfmQqOZCAih5jPyoXZ5P/b7oFov/6Yfv7JflORUmm3O9gv7 +wDQiIr0a/pd9U8u62/8OKT0pWJH1C33zvpdJsZHAqyq47hPHwJztUVQ1h2UP+8tlthFcVYzyrErN +53eUcXe5X+P6qvJ0Wixz8xSXE7+4x/Hyfvf5zbjtK3JViZ/1jv/ct6HUvOzWz83nozL/3if+Gon3 +g6sRTqEKnu5TO6WaFeqzOi4iqPs0VSw70sFPXFO7xuEvksH+vaX12+zPk4VMH3VfTZ05mpPQJN0x +fQbx3O2/qIh17juxNZfplrMViOMrxGonJi3EWXPBX1GxuI/nVMj3xo/gwSdOO/F2MGd7FIU8VJL6 +tAP9qg4yiWZAOEmGlH0ZVfpInzdFH5LUovWTSGjMg9ZXIlh8Wg7Kzk8hu6qOsZ+NjzwHYOOmtU2e +7j6WjbLD+rt8KE5z+nyVaPOSNFSk/dny/mzqviGWavOqahaLgzgC5mxPQrOqDHUonr9cbHRzbCUl +ezFfpA0vJ/mG90UxQSRV+RUVK0hL2LfVWKzRV9fOjv5Ie2xUpxO5gIK+U6G9nwtwUtNc5uttJ9nJ +jCcIUdacLhKrlCfHXlK0RqxVWcZJyv9cOn7Jj+to8UdkfnJfFvOjOmbO9uNgzvYoQDYBiVyoyg2U +p6NRd7iCwUxAbdq6XO9LBVStwBFpCrrawMFd+5/t7NWJlZByPBjjznc90cM4xMZRVWl9mmvjx045 +HYFP8rnN6TqJrWt281RCjrZpJ904gJRxegVjUPh0+6yWE/mCg4E+m8/e9xIK8WZQ2Z7CPGowR+sK +q9bN/9XXloorMKTn69i6cqjOr9MeMwaCn8NU2I1ilaL2XLXiellUoKMIJfClIvjGrvbmmsyYpro1 +1BfWCBAWroYIIkYCzQp4esyKuCFe96XiCna3asHOAi3RKtgl5dmkE24Ua/iCdvhlwpc4NPfvfsx3 +/hGsPwzb93ZQT7wdzNkeRRBcUpkiwY7TLlEf2gFxeLNdrtZ92WV8qLikmKf/eDGM+E0vkJWXikVF +5pf+Wg5KsDNSFSl2G1/OXmCHyjn9TbJQs08rDZB2Q4Wv7dIYtfeVnhyTxlch2l4lB9GuKxq6NISk +Oc4+GvULwa19QuCbtszZnselbPF4rpONZV+p/1/11eGEL+DUpGQnCbr4sAMVxc5o7ERB8SUxVMih +y7vGZyKAJG42KrZTxCVnK6KC77BdcrJi6nZE7OZr2iGVOcF5XLgfxGunJyxLytXJs1mhoFnNtm0t +rqIKq6K0PlZlGur4CnRVnSl36xMzPSZi3ajTRKTw41RZ++zapj6Jk/hviMBpsWx3ZV+p/1/11eGI +L2BlVI5m5KQMjOmN1Ql3lDJTvfG6Q8k+Xb6UPo2hRyUe61fdTcQHB6oRb8nZXj7xpA1xCJbhjadM +btE9jDWVIR1nZYnjX5RrbatFlYLdsv4VosH5XVS1FqKV4qMjPYFdzbb+CUSbrnrsU0sb7F9r/9BO +yneh4ooWwyPeC6YRTmK3jAv3gTy9YEO8L5NsbWc2RrJa2ibCr4QdsaS/CIuE3JCqh1XIDds9EqM8 +ECOU7R6UQDsxf8ulfk4TtASvshKxFiJ046xgK3lj2iGR6I4IS/8C5L1NK2yIGEl38SsipINz4A2y +k5gHQre0y3ltFqqOsDGSAt7CG113V4ZGYlMvQj9xOZ7agK3IZZdXNESM6TWM1s/AS/k1RvzLvMvS +Lxl5HAMGa/6MLPEVjjNqW/6GZUFfCj4kUgKyuTHmTYZNREwuPkihq78gyvQl+L96Iw3JMvrIbYMI +r7b4pXlZ9wPQSqyjxBfzu8YN+8TbwaVfR1GUlh3RWR6WcvhC8M5HdwPLfOI1IKpfc5cSrI3PeTB7 +ygIk0eWyEBDYoto121Y9S/iMMnx4ole3V9HIfUtRy7UMmtdyV3Cojnd9a5Tt0wN1nJqVZenHyddi +n2V4YtveIEMSxhidVDE/3KtcJF0u/fosqGxPYR497Q0yydupbpRPJzwQW6NpK3aMwcWp9S/d0q9s +O2qZYkZh3tzC9uY3vRh82spI5xaVfumXiMBqA4vLCHgAwQVF2v/djTOzvOKBuDpb3d8YC5L1gc6Y +4TFmjajiRhXYij1oUIi2WyuLD0rY70WKbSHVINn8g1hSDe1NNRwT2BJHwZztUawq1YggZE2xBQll +pDMrwFdRuV6Ule5FmMWvb05CVIUVAzOOKnPw5papUFfWxgxmD4q1xPVqjtbjurEVqNNSu9w80xds +Fafopi8FP05SxRZJzxrr2v82n2p1mvtEXykeJFiPq48nE3eOy9sSR8AX0ZwCXBrXpV6mWKvaRSXs +SlaDNuL4MB0m6eGGRIZun9svClZK/+jb7cPWiXaSZ/rjjiKed60PGdQc7UXC+SGGrEKlxBHLvWCK +5UnhLmrYSczGgysQNnnYjUpNZ0X/csL2mgfw7T8A/xLEUjFZlQ74sYRtl9ONcilxgJ/FB+5H3MRZ +MGd7FHgigx9+Uo6dyp3li58BJZDzQx/JFC5vO7WMqhTi264cAJEdijV8XMppNGM0Z/hgQoynLuEK +4ltzslky9r6NZPMp6tm353uxiYKqFwGVGZfj2bekMdqcpJUcQNZOtG5b+5f43kRWVaoQE9oqnJ7A +puvDlO86W8Q7wZztQSTVOn/wLlY0ymw/K2HIfbqfyL5mwZIXPsXndYjasbVTu2YVpBMHZbtywHmm +5Gzl2rhE2fCxXMOZB/4Yje/LEHka+02+nXjygxDi48svqXEbvFMv9woX7d032qt9gfgl3ORd68oB +9S85CBP8rIp2p4A39hh/22/27fZpwoh3gznbU1CReDR3/udyx1hllttXgPapbkTbRDHxuEM+SkCl +DlDAndr1psPTCP6T2NgvuWC3DZLNcQpEmn9v9emuNIZpkU8UD/Y7Fbr0G2oWLV6xrxeDdqqrudqd +ok325hsJ2GLHE0urgBt7hbEXsl3yu07keHIQ4hCobE8BftRaDoLrTnijFGcid11toEkp6l+8cBZB +lSqz3O/++wELdUUdI3ktvhTW3doB6cpbUs72qkNyHI3inb5cxeKNt5x3NewUaxAgTni1D9UetavC +DVKDwXhH6zrb+HLmGIAIrzLoFVWkNsRsxAkKNb3T4O+NGq2EmX5Q922yz3oKId4N5myPAk9koTZD +agoWRBtnR2wDB+7YtJEgv6uoPGm2y6d2CtzCgL9qm3O21k/Nw2JsmtWwE/mDiq2KOwUbxPiSL4Ep +g4Fh3VYtK/gCcqyPN7uvhpjxa+4U8J2iFQnSXvOs+TWOTrpAordKu7HLs0y8G1yNcAooVGxb4RNs +MFeLl39+tx/V11S2SA12vNpd8C6ve8WhIn9HIiCji+RLxXOp21ULrkhLrtjjLmrYfI2LdMzXFXdW +wx6HPKhSt3tQxAp1Wuqmr0xMAweD559EwEhwOicmkakTZKOA40QL4TYAABN8SURBVEuRVtEqqGPz +Y23+Rj+CcSv4wy+lxLH8w3GRDo6BOdujKOrzqc4OiFSl2RzftxBJydx2Wy5F6sz/5pGqpWhocpJV +avNUWYQHajgNt+nL2sDTbKlOQl3XObzsxuKvBtvW6aYvPEvWvuqjuE27lIf1vtSbIdGOnaJVp+1+ +5YD5wL6AaP3rVfgpQOxtX3YDk3RwDMzZHgSqWRcWUIbqTv7asaLirzD0Mjg4horOHJ7+kXRw+8H8 +J3yLTOUmdgBbWV/nPrxWsnJUWXO2KilD4Qp2EujktaRSl1UMVjdM0eG4NNYdA21eYWwUrpEHzg2+ +z8B8qKRccXoPgZsNH1fi+/nlpXW1/r3DwG3evG5VrSlH27xfIavTpk6wz/QFx4+sLYc64iiYsz0F +lxtYZoxkBmGLudb0aJG1S/ILDvohkiqxHB6P7fzGyoEgNO8DtWDtz/xO9o1tAaOrXRXZzyo16tIU +SGRpK6KtLtNuFIgPTOS2sCZBpdT3CtgI6irbKUnooxItqNYur4pEm7/uEakIbfrA/j3O6NfKBtgL +xNDPLvEuUNmegh0g88e8U7SoXkUlVOmAtn/UD24ZIjrb5DvpkutFZPyxdalAY0kN94o3k0goVycM +W+867BJUgpes7Qwm/Yl2uRxEmjLSG/nNZKWtiEejUG+w+qzw8xNsaY4U2wZBe9utAsa2hSy1+g6H +Kac7Sd/rbE6tbVGtuW3kaZd/neIVEflr8Y+1rdeDsiUdHANztkcxgglFZPklo2LtFJsOWE0A0gOZ +1WWKlHpQ0WldkpkNf+y2lzV73x6XnU1GNRueaogY0EVWsGnMTdsc/r3CRY3rw0PfCm3riaoqYO18 +79qCKt36BuVtZgptgSxX30HsXq/Ft0bZKL7tYYu1bU5hkA7Ogcr2FOwH/GceP3/FVaeLEA27JCys +fsm9Sp/LBbs4SGFVwgDfUC8i6W1etf5StLNekb+vzq5UXyjfULBQn9bOgoL1K/Sifn2VgxFAXT2h +Jd5V4Xq93ihc5/L8drFa70+eacRmg7F8r9fjl7XUN6oUv9SqaO03I5t6IMh2Ha7XzZlxX92/keIm +zuC/msMi3oQpjVzJ2ESnp8Ru7pRXaWXw6/lZX+Vb8lYk0ij1FoMWykr26kQY4WxytqC4IyRYOwuM +G312cyBym6OdZ5Ban0LA9qji0nQ5o+fpVKgH8hbJyg8fklass5PoVJySfEL7eTLA1Q/LyaBTvDie +muNtxrC+5lFAJed3AJNzz4HK9iDaXO2f+EyrFED5ej7W/MCnztUIsd5Wmjxs9/6EqvzqHX+oV7lR +rVdrz9liLtnL1MVSWqPrvJIv8VXiqTnxsWuKvVOwHblqqU9tyioHpJYxyTHfzAoGsjJbI1zVavtk +mWQlXNXkooaBCENxamq3Klp9Vq0iYbPYxnjKlBBvBnO2p6Ai0i71qEoOlGySRwhQiihtlutzCVZo +uy6qF0g0OsC+blQrxquSymw5WEwEhFnGla/Z60xdNjsFe23f16eYLZZmehaVmoNIN6lKVfnqGiWJ +xkb4mL+1mIBoR5yZfH6RCJOKxr6g3NrUn9baV3RFOjgHLv06Ci1HrtQdaaUEpgq25FkK7ojRzQuZ +GEOmNg3hWH8YSzpB2FBviG/04+pI2BZoLWkEOLk8key1DSTbfRUzZlSho/jqCB9JbCHRR8KGc2VH +iLM/v8FXSXASpD+uiyS79LOmGJBc26VfJNtjYBrhFOaPWP/M3ZIm8IcY6o2zv3I9VqujTTngJXCX +CpD0OS/n/+b7//avSytI6gNt54ENDzH4wwwqfnMr0gkj+bpsI/9bfbkSs75mY/e1cG5dzjXJVXE+ +arpCXKGaP1OYi9pLKYXmxtjiS3u1qCLphTH1Rhn4ixtdWtrXf2t6QYrPJcWw/SxpBuIYmEY4Cjt4 +pLAO7oukJWBFDiWFtFHFutT0aYfOzj9uFKvf0Cp2i5KudhtsVWmjlGM0edRrGiHPhyvPVPOaGhaR +nAqQ7vI8XsSTy+vFSPei8hzY9RXtVSgSqU6i3alTvAhK+ecyBinlfqIjHRwDX0RzCiY+ysGj8C/U +i143b1Rk/EnH760KvVW0EkTk5VM5Z3Usvcp09Sl+w+sqD0K1evV2WpZxjRcUsDhx4ZiuKdQ0Nkwv +4JzUX/CAOcple1u0WfoAgrVg4sGNCLhVvC+pVOjk9t/Y+nu6sXbvEyaddHAMzNkeRffL3Ux4VZZ3 +tju/k7xCbWplpuky9F1VhWkXVfeTz0nYmTE1ucJYg1CnxYNazq1yiGkOvLyxTYQy50tkXZ4Fdka9 +iyLe2T4oXjzz6STt1UdjO30m1awxLryxZisctrbex0XKODfk2nNgzvYUJnGsOVm91OFfN7s+LS/7 +J8hG/4ZCTbbwL6nUP3KpyekDH/1dbN0HvPwb1aZx7DwK7QEFAaXaKlaIba+WtSmHl8GUWI3zkw9Z +1fCiSgsBIsHXP8iI5OSq1OuLik22FpyVr7a5H7PNKxbwC16XkU3yBFLdq9RXbc0+x0m2PQfmbI9i +hPTq1GFnP+G5z2tPcCuKq+qUnIBDtyquPOOBBPANl//hb+Ryl0eS/TiTjUS+Kb+7jHDaL1vNOL0s +LvfrnCTfGvZm6/60913tkyuNtjk+U8fwUADYrqrymgzMpdZVALhSQQRefVh9Q1xdn7UMCRjzvImY +RYR0cA5Utqcwf8C4osDL4IdeVyH46xNnWXp4Af4NkfmCGhH9Ey+DcRVoPmc4TjomZkavJPN2KFB/ +rBbIN6lhkUaxlrjQfhag4qz528TjMlVjW25/tDF/Bagy633J9P4vJ6j1IYQ+D2sEpcl3Uofuc0CZ +ZnKDf1Z2lY9s/3fjf2P/0r/dagXSwTEwZ3sUN79cU6V2iY/K1JqiyhTBjWKj7uuuXVauuZ9Uh21c +vWrUjdLOy0JpX9UL+0H+FX3lx3uRSdMw0tDL6yFbmwclrdlWBJSd4seqkNG3EaGr30nMOiuqWkT7 +dOKAfG9SoBAXzl+rdCH+uqIh3ZSVjX8hToHK9hSSUpF4DHeqlGUNreVZ8UU1Xb5XQpX5Y7quVsM+ +86JaSIIrFIzkva2GSLJe/NidKwtkki8+Uhz5W83xqFwvCa88jX0ZIQFxu21pK8mHZuKBz7pqAb8U +IymNostWr1rN5qF4gbiM2JLCNHKNCYu+NNujn4v8YMIE6nftXOkWBbxpcynZOZa/VjZWG5gP4v34 +b1EfxHtgcs9YYGC5yPKrRjvfjvZtDtfqXH1a2cg+E9NlRkttvWANL12HT9++PDj1U55aq4xYRj+k +tLV4RG4Vq7eNALNq7aBPbZtXK2q2N4Jc2qouX21qC+Qa29C2kJ0RurdFMp1tbSVBnBTyySApWotH +p06vJxA46RBnQGV7ChriARWsmJLFXK1In9u1l4bD02ZJbZqvomg9t/lHrvZAyL4yAYTNDHHyHdz9 +9/LL2NSntwfCjtwsvqTGfI7UN/rCvjEnK9De1+zOWJMy9zHkl4cL2jrJxh9/TPndqkIlnKT2Ohpl +q9lnnVAocxUrkoK4VaQ2X24zZn5V3eZJ0YrMT2uPuV3mbD8G5myPwqRJKslqrn4BRlRurGBb/Dj7 +jFSf868qiaHhEj6ruJHqRQRUZhPD3E5xmAPrw4a33rlKfTTTlAaLZFrRhASO87BF+tc5rnZR6CkJ +hfZlODhFIpIXm9iZw4m85HAV4gYiT0o3kb16HxbvdgVEIvlSDn2kVRHN3BDvAZXtKcwftStVfBeC +QLnOp8fK6xKTzSht7Z/neRXKx7K+ViQTkouqgTbrygB/AgzaOe+C8sw2mmxSHGWlAapXGcW/6GqD +bUvu2caoktu7jWYbEbx8BsUrYCAi/u6EFBtOJJTPyUhKU2YF2GxVKJBg2IzFj9v97WPZ24CqXRQv +TDBxBFxnexRj3ayySiXUawMVyWtfMQ8MLGNullUDEm2dMAa0b/K7TnIouxqfKbY6bvTlzTT7quO0 +bVfU4E+kqOC8drb6ks1UhCPsM+c+0UktRxWYXOpI6tf7BCJbcrjabFsfrobVx+JzvtmuRJ3W7Opc +swvxM2f7WVDZnsL8AXtuVmRVuiL+LoRlJQFsp5UKopCrHb1d4eP0Z3OMW6uiTSp0ZOU7t12Z2fai +XGWuxdWljfc5B4f536pw1zWxk3B8X9J+Vt779cP45VQlWxWwfYd1nW1StvaJBUBetzlc8H1tlz/I +KLpvY/s3Lw13u78w8djmb2nDnO1x8M/inIJJlqRKYbsIyq3StO1p40plSGalYiciJXdrdSW3UHxf +IetS126LZLXpdeuvKtvVP8XTowynYGzsGmVZDRvfVXXaXvaljQIFh8G3MdbOt9vFS9Y9/aLQRrs2 +cmuHqxZc0e58a25Tp4t4L6hsT0Elr0awf7aPqxJEQPHaG7bGulKhU7BDYu1uUcfLuxGG+FpdV53O +7SN8CBzfQ5JaFg2+dnUK5H61gbv7A3xM/7Ed72WwcwbwyqJ+reLazKSa2pX9VDadYb9eD/s2WC/X +bOfno9pRU2eqdVW6GoGWf4s6Vnn48ze5Hb4bd1Gwu32BT+LtYM72KMZW0aKJoAlep+7a4v4ktKyO +zW7kPpBZgLzw0dmdSu6ULcaLBJnZsoxVMcSiQm8UNOIutCjIE51toF8cCxpKGRfsPynWq65RrdhO +YYgacXi/xXfKqWppp7kdvoOhKth2X4p/4giobE/BlAnmS3H/SbWqrE+bjc2+dVkzBGP9szP4boS8 +P+un35qjfSVnu+ZwIx+M549u3/p21SllLF/Yty+gnrf0hX377gyuMGdP6WaSzUchPHeK+1CPeeBW +wb74L629TXV6r2B3+2XsxHvBdbZHMY+qnSq925cgtdVmPPuQdR8v6UXm3yyrarIqyof9uk4Wwi9B +3CPaNSeIL3nqfGaC7PZFSw+aPvI621lx63Nl/+wTyXLns9lPc2/qWfWffDJn+xkwjXAUkEbAT31h +v7TBu/vLjbGOMAX8dqyFl/QD+jDz1GasPmq/0MZvHI1JT0jGhZzbdEFXBngi4z057+laZ+DJRzmJ +oCp1bx2hNqS62/8SyaqIP82HJCs5NZB8dPu67ueTCnECTCOcwvwx2wGGf7RRVG7TCN62POjg+2OS +lj2+a5fldekXXt5L2d5c+rc3yCQewfV0wjTy1y7avjT700+sQBoRA5CK96e1f5g7sL3dB/v4TqIk +pQDQBxBU2oeY0qU/ThZ2WMt0/YdpgJpOsKV+urTV1tfyr95MYxrhx8GlX6dgcmInt+rE79Tnru0L +dumlLq6KZaNgRx8HxvcPZfmSW/v0A6jtLpQv/1Y74tBc5aqv9qllXyLe27aTMFOsmEyHOOLyPacB +kk8N29rHTrV+p21aFkYcAZXtKZgAqTfI6kMORa3aQZeWVHXKFn2jKh2hiGr71HZRsM1yLckxoYpN +6hFt7cDuFC/EuFOvImAred/jnZL9VYW71HVtFcaD46vttbFVyapUYjvkMe6/8O+r9vXfTtk25Zjn +pbI9h//8z52IyLNU+Ur9/6qvDid9lU2rrgq3lmNddfeK4u3ssPyrPnbTsvPfTdHT1D3YR6ha9q+d +OhSV/TBb5Sqy3ChKarCEtKhQ9K2NKm7sU13nG+NEQteNb6zTtQ59oz/BOuIIyg2ybqa/W/+/6qvD +QV92xL9ClLX8O23uym37VUK+K/9Om68Q8LsI+w47P3flu5/HXXmte6W8/uS+Uv5im5TuQIImjuDP +TwdA/GKMZxOC+L8Cki3xc6CKIn4RSLYEQRAfAMmWIAjiAyDZEgRBfAAkW+LnwBtkxC8CyZb4OfAG +GfGLQLIlCIL4AEi2xM+BaQTiF4FkS/wcmEYgfhFItgRBEB8AyZYgCOIDINkSBEF8ACRb4ufAG2TE +LwLJlvg58AYZ8YtAsiUIgvgASLbEz4FpBOIXgWRL/ByYRiB+EUi2BEEQHwDJlvg5MI1A/CKQbImf +A9MIxC8CyZYgCOIDINkSBEF8ACRbgiCID4BkS/wceIOM+EUg2RI/B94gI34RSLYEQRAfAMmW+Dkw +jUD8IpBsiZ8D0wjELwLJliAI4gMg2RIEQXwAJFuCIIgPgGRL/Bx4g4z4RSDZEj8H3iAjfhFItgRB +EB8AyZb4OTCNQPwikGyJnwPTCMQvAsmWIAjiAyDZEj8HphGIXwSSLfFzYBqB+EUg2RIEQXwAJFuC +IIgPgGRLEATxAZBsiZ8Db5ARvwgkW+LnwBtkxC8CyZYgCOIDINkSPwemEYhfBJIt8XNgGoH4RSDZ +EgRBfAAkW4IgiA+AZEsQBPEBkGyJnwNvkBG/CCRb4ufAG2TELwLJliAI4gMg2RI/B6YRiF8Eki3x +c2AagfhFINkSBEF8ACRb4ufANALxi0CyJX4OTCMQvwgkW4IgiA+AZEsQBPEBkGwJgiA+AJIt8XPg +DTLiF4FkS/wceIOM+EUg2RIEQXwAJFvi58A0AvGLQLIlfg5MIxC/CCRbgiCID4BkSxAE8QGQbAmC +ID4Aki3xc+ANMuIXgWRL/Bx4g4z4RSDZEgRBfAAkW+LnwDQC8YtAsiV+DkwjEL8IJFuCIIgPgGRL +/ByYRiB+EUi2xM+BaQTiF4FkSxAE8QGQbAmCID4Aki1BEMQHQLIlfg68QUb8IpBsiZ8Db5ARvwgk +W4IgiA+AZEv8HJhGIH4R/j++r947wxbxCQAAAABJRU5ErkJggg== +"/> +<g id="matplotlib.axis1"> +<g id="xtick1"> +<g id="text1"> +<defs> +<path id="c_7b26b13f539f13a4c64eef23b6952d29" d="M4.890625 -31.390625l26.312500 0.000000l0.000000 8.000000l-26.312500 0.000000z"/> +<path id="c_42baa63129a918535c52adb20d687ea7" d="M12.406250 -8.296875l16.109375 0.000000l0.000000 -55.625000l-17.531250 3.515625l0.000000 -8.984375l17.437500 -3.515625l9.859375 0.000000l0.000000 64.609375l16.109375 0.000000l0.000000 8.296875l-41.984375 0.000000z"/> +<path id="c_1260a2df50f305f3db244e29828f968e" d="M10.796875 -72.906250l38.718750 0.000000l0.000000 8.312500l-29.687500 0.000000l0.000000 17.859375q2.140625 -0.734375 4.281250 -1.093750q2.156250 -0.359375 4.312500 -0.359375q12.203125 0.000000 19.328125 6.687500q7.140625 6.687500 7.140625 18.109375q0.000000 11.765625 -7.328125 18.296875q-7.328125 6.515625 -20.656250 6.515625q-4.593750 0.000000 -9.359375 -0.781250q-4.750000 -0.781250 -9.828125 -2.343750l0.000000 -9.921875q4.390625 2.390625 9.078125 3.562500q4.687500 1.171875 9.906250 1.171875q8.453125 0.000000 13.375000 -4.437500q4.937500 -4.437500 4.937500 -12.062500q0.000000 -7.609375 -4.937500 -12.046875q-4.921875 -4.453125 -13.375000 -4.453125q-3.953125 0.000000 -7.890625 0.875000q-3.921875 0.875000 -8.015625 2.734375z"/> +<path id="c_7a2040fe3b94fcd41d0a72c84e93b115" d="M31.781250 -66.406250q-7.609375 0.000000 -11.453125 7.500000q-3.828125 7.484375 -3.828125 22.531250q0.000000 14.984375 3.828125 22.484375q3.843750 7.500000 11.453125 7.500000q7.671875 0.000000 11.500000 -7.500000q3.843750 -7.500000 3.843750 -22.484375q0.000000 -15.046875 -3.843750 -22.531250q-3.828125 -7.500000 -11.500000 -7.500000M31.781250 -74.218750q12.265625 0.000000 18.734375 9.703125q6.468750 9.687500 6.468750 28.140625q0.000000 18.406250 -6.468750 28.109375q-6.468750 9.687500 -18.734375 9.687500q-12.250000 0.000000 -18.718750 -9.687500q-6.468750 -9.703125 -6.468750 -28.109375q0.000000 -18.453125 6.468750 -28.140625q6.468750 -9.703125 18.718750 -9.703125"/> +<path id="c_40880da00a2fb346f185ce8104650367" d="M25.000000 -67.921875q-3.906250 0.000000 -6.593750 2.718750q-2.687500 2.703125 -2.687500 6.609375q0.000000 3.859375 2.687500 6.515625q2.687500 2.656250 6.593750 2.656250q3.906250 0.000000 6.593750 -2.656250q2.687500 -2.656250 2.687500 -6.515625q0.000000 -3.859375 -2.718750 -6.593750q-2.703125 -2.734375 -6.562500 -2.734375M25.000000 -74.218750q3.125000 0.000000 6.000000 1.203125q2.890625 1.187500 4.984375 3.437500q2.250000 2.187500 3.375000 4.984375q1.125000 2.781250 1.125000 6.000000q0.000000 6.437500 -4.515625 10.906250q-4.515625 4.468750 -11.062500 4.468750q-6.593750 0.000000 -11.000000 -4.390625q-4.390625 -4.390625 -4.390625 -10.984375q0.000000 -6.546875 4.484375 -11.078125q4.500000 -4.546875 11.000000 -4.546875"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(146.848084,211.828125)scale(0.120000)"> +<use xlink:href="#c_7b26b13f539f13a4c64eef23b6952d29"/> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7" x="36.083984"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="99.707031"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="163.330078"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="226.953125"/> +</g> +</g> +</g> +<g id="xtick2"> +<g id="text2"> +<defs> +<path id="c_ed3f3ed3ebfbd18bcb9c012009a68ad1" d="M19.187500 -8.296875l34.421875 0.000000l0.000000 8.296875l-46.281250 0.000000l0.000000 -8.296875q5.609375 -5.812500 15.296875 -15.593750q9.703125 -9.796875 12.187500 -12.640625q4.734375 -5.312500 6.609375 -9.000000q1.890625 -3.687500 1.890625 -7.250000q0.000000 -5.812500 -4.078125 -9.468750q-4.078125 -3.671875 -10.625000 -3.671875q-4.640625 0.000000 -9.796875 1.609375q-5.140625 1.609375 -11.000000 4.890625l0.000000 -9.968750q5.953125 -2.390625 11.125000 -3.609375q5.187500 -1.218750 9.484375 -1.218750q11.328125 0.000000 18.062500 5.671875q6.734375 5.656250 6.734375 15.125000q0.000000 4.500000 -1.687500 8.531250q-1.671875 4.015625 -6.125000 9.484375q-1.218750 1.421875 -7.765625 8.187500q-6.531250 6.765625 -18.453125 18.921875"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(179.676061,211.828125)scale(0.120000)"> +<use xlink:href="#c_7b26b13f539f13a4c64eef23b6952d29"/> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7" x="36.083984"/> +<use xlink:href="#c_ed3f3ed3ebfbd18bcb9c012009a68ad1" x="99.707031"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="163.330078"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="226.953125"/> +</g> +</g> +</g> +<g id="xtick3"> +<g id="text3"> +<defs> +<path id="c_cd96f817f3cab988d24a2b49a5577fe6" d="M10.984375 -1.515625l0.000000 -8.984375q3.718750 1.765625 7.515625 2.687500q3.812500 0.921875 7.484375 0.921875q9.765625 0.000000 14.906250 -6.562500q5.156250 -6.562500 5.890625 -19.953125q-2.828125 4.203125 -7.187500 6.453125q-4.343750 2.250000 -9.609375 2.250000q-10.937500 0.000000 -17.312500 -6.609375q-6.375000 -6.625000 -6.375000 -18.109375q0.000000 -11.218750 6.640625 -18.000000q6.640625 -6.796875 17.671875 -6.796875q12.656250 0.000000 19.312500 9.703125q6.671875 9.687500 6.671875 28.140625q0.000000 17.234375 -8.187500 27.515625q-8.171875 10.281250 -21.984375 10.281250q-3.718750 0.000000 -7.531250 -0.734375q-3.796875 -0.734375 -7.906250 -2.203125M30.609375 -32.421875q6.640625 0.000000 10.515625 -4.531250q3.890625 -4.546875 3.890625 -12.468750q0.000000 -7.859375 -3.890625 -12.421875q-3.875000 -4.562500 -10.515625 -4.562500q-6.640625 0.000000 -10.515625 4.562500q-3.875000 4.562500 -3.875000 12.421875q0.000000 7.921875 3.875000 12.468750q3.875000 4.531250 10.515625 4.531250"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(211.686396,211.828125)scale(0.120000)"> +<use xlink:href="#c_7b26b13f539f13a4c64eef23b6952d29"/> +<use xlink:href="#c_cd96f817f3cab988d24a2b49a5577fe6" x="36.083984"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="99.707031"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="163.330078"/> +</g> +</g> +</g> +<g id="xtick4"> +<g id="text4"> +<defs> +<path id="c_cc8d6d580d1b10c8632f7a42cd53db8a" d="M33.015625 -40.375000q-6.640625 0.000000 -10.531250 4.546875q-3.875000 4.531250 -3.875000 12.437500q0.000000 7.859375 3.875000 12.437500q3.890625 4.562500 10.531250 4.562500q6.640625 0.000000 10.515625 -4.562500q3.875000 -4.578125 3.875000 -12.437500q0.000000 -7.906250 -3.875000 -12.437500q-3.875000 -4.546875 -10.515625 -4.546875M52.593750 -71.296875l0.000000 8.984375q-3.718750 -1.750000 -7.500000 -2.671875q-3.781250 -0.937500 -7.500000 -0.937500q-9.765625 0.000000 -14.921875 6.593750q-5.140625 6.593750 -5.875000 19.921875q2.875000 -4.250000 7.218750 -6.515625q4.359375 -2.265625 9.578125 -2.265625q10.984375 0.000000 17.359375 6.671875q6.375000 6.656250 6.375000 18.125000q0.000000 11.234375 -6.640625 18.031250q-6.640625 6.781250 -17.671875 6.781250q-12.656250 0.000000 -19.343750 -9.687500q-6.687500 -9.703125 -6.687500 -28.109375q0.000000 -17.281250 8.203125 -27.562500q8.203125 -10.281250 22.015625 -10.281250q3.718750 0.000000 7.500000 0.734375q3.781250 0.734375 7.890625 2.187500"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(236.960880,211.828125)scale(0.120000)"> +<use xlink:href="#c_7b26b13f539f13a4c64eef23b6952d29"/> +<use xlink:href="#c_cc8d6d580d1b10c8632f7a42cd53db8a" x="36.083984"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="99.707031"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="163.330078"/> +</g> +</g> +</g> +<g id="xtick5"> +<g id="text5"> +<defs> +<path id="c_3dcfa38a02242cb63ec6726c6e70be7a" d="M40.578125 -39.312500q7.078125 1.515625 11.046875 6.312500q3.984375 4.781250 3.984375 11.812500q0.000000 10.781250 -7.421875 16.703125q-7.421875 5.906250 -21.093750 5.906250q-4.578125 0.000000 -9.437500 -0.906250q-4.859375 -0.906250 -10.031250 -2.718750l0.000000 -9.515625q4.093750 2.390625 8.968750 3.609375q4.890625 1.218750 10.218750 1.218750q9.265625 0.000000 14.125000 -3.656250q4.859375 -3.656250 4.859375 -10.640625q0.000000 -6.453125 -4.515625 -10.078125q-4.515625 -3.640625 -12.562500 -3.640625l-8.500000 0.000000l0.000000 -8.109375l8.890625 0.000000q7.265625 0.000000 11.125000 -2.906250q3.859375 -2.906250 3.859375 -8.375000q0.000000 -5.609375 -3.984375 -8.609375q-3.968750 -3.015625 -11.390625 -3.015625q-4.062500 0.000000 -8.703125 0.890625q-4.640625 0.875000 -10.203125 2.718750l0.000000 -8.781250q5.625000 -1.562500 10.531250 -2.343750q4.906250 -0.781250 9.250000 -0.781250q11.234375 0.000000 17.765625 5.109375q6.546875 5.093750 6.546875 13.781250q0.000000 6.062500 -3.468750 10.234375q-3.468750 4.171875 -9.859375 5.781250"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(260.512948,211.828125)scale(0.120000)"> +<use xlink:href="#c_7b26b13f539f13a4c64eef23b6952d29"/> +<use xlink:href="#c_3dcfa38a02242cb63ec6726c6e70be7a" x="36.083984"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="99.707031"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="163.330078"/> +</g> +</g> +</g> +<g id="xtick6"> +<g id="text6"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(289.348437,211.828125)scale(0.120000)"> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="63.623047"/> +</g> +</g> +</g> +<g id="xtick7"> +<g id="text7"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(308.340177,211.828125)scale(0.120000)"> +<use xlink:href="#c_3dcfa38a02242cb63ec6726c6e70be7a"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="63.623047"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="127.246094"/> +</g> +</g> +</g> +<g id="xtick8"> +<g id="text8"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(331.853183,211.828125)scale(0.120000)"> +<use xlink:href="#c_cc8d6d580d1b10c8632f7a42cd53db8a"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="63.623047"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="127.246094"/> +</g> +</g> +</g> +<g id="xtick9"> +<g id="text9"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(357.080791,211.828125)scale(0.120000)"> +<use xlink:href="#c_cd96f817f3cab988d24a2b49a5577fe6"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="63.623047"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="127.246094"/> +</g> +</g> +</g> +<g id="xtick10"> +<g id="text10"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(381.731752,211.828125)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_ed3f3ed3ebfbd18bcb9c012009a68ad1" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="127.246094"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="190.869141"/> +</g> +</g> +</g> +<g id="xtick11"> +<g id="text11"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(414.559729,211.828125)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="127.246094"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="190.869141"/> +</g> +</g> +</g> +</g> +<g id="matplotlib.axis2"> +<g id="ytick1"> +<g id="text12"> +<defs> +<path id="c_956f18cfdaf972f35a6c2b4aaac2532b" d="M8.203125 -72.906250l46.875000 0.000000l0.000000 4.203125l-26.468750 68.703125l-10.296875 0.000000l24.906250 -64.593750l-35.015625 0.000000z"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(218.601069,403.970369)scale(0.120000)"> +<use xlink:href="#c_7b26b13f539f13a4c64eef23b6952d29"/> +<use xlink:href="#c_956f18cfdaf972f35a6c2b4aaac2532b" x="36.083984"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="99.707031"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="163.330078"/> +</g> +</g> +</g> +<g id="ytick2"> +<g id="text13"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(176.925000,384.981296)scale(0.120000)"> +<use xlink:href="#c_7b26b13f539f13a4c64eef23b6952d29"/> +<use xlink:href="#c_cc8d6d580d1b10c8632f7a42cd53db8a" x="36.083984"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="99.707031"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="163.330078"/> +</g> +</g> +</g> +<g id="ytick3"> +<g id="text14"> +<defs> +<path id="c_a0416418d96557a09b8c1332d34883ba" d="M37.796875 -64.312500l-24.906250 38.921875l24.906250 0.000000zM35.203125 -72.906250l12.406250 0.000000l0.000000 47.515625l10.406250 0.000000l0.000000 8.203125l-10.406250 0.000000l0.000000 17.187500l-9.812500 0.000000l0.000000 -17.187500l-32.906250 0.000000l0.000000 -9.515625z"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(141.136948,354.774044)scale(0.120000)"> +<use xlink:href="#c_7b26b13f539f13a4c64eef23b6952d29"/> +<use xlink:href="#c_a0416418d96557a09b8c1332d34883ba" x="36.083984"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="99.707031"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="163.330078"/> +</g> +</g> +</g> +<g id="ytick4"> +<g id="text15"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(113.675810,315.407188)scale(0.120000)"> +<use xlink:href="#c_7b26b13f539f13a4c64eef23b6952d29"/> +<use xlink:href="#c_3dcfa38a02242cb63ec6726c6e70be7a" x="36.083984"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="99.707031"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="163.330078"/> +</g> +</g> +</g> +<g id="ytick5"> +<g id="text16"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(96.413017,269.563512)scale(0.120000)"> +<use xlink:href="#c_7b26b13f539f13a4c64eef23b6952d29"/> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7" x="36.083984"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="99.707031"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="163.330078"/> +</g> +</g> +</g> +<g id="ytick6"> +<g id="text17"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(102.696875,220.367188)scale(0.120000)"> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="63.623047"/> +</g> +</g> +</g> +<g id="ytick7"> +<g id="text18"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(101.459892,171.170863)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="63.623047"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="127.246094"/> +</g> +</g> +</g> +<g id="ytick8"> +<g id="text19"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(118.332060,125.327188)scale(0.120000)"> +<use xlink:href="#c_3dcfa38a02242cb63ec6726c6e70be7a"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="63.623047"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="127.246094"/> +</g> +</g> +</g> +<g id="ytick9"> +<g id="text20"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(145.465073,85.960331)scale(0.120000)"> +<use xlink:href="#c_a0416418d96557a09b8c1332d34883ba"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="63.623047"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="127.246094"/> +</g> +</g> +</g> +<g id="ytick10"> +<g id="text21"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(181.503125,55.753079)scale(0.120000)"> +<use xlink:href="#c_cc8d6d580d1b10c8632f7a42cd53db8a"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="63.623047"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="127.246094"/> +</g> +</g> +</g> +<g id="ytick11"> +<g id="text22"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(223.319819,36.764006)scale(0.120000)"> +<use xlink:href="#c_956f18cfdaf972f35a6c2b4aaac2532b"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="63.623047"/> +<use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="127.246094"/> +</g> +</g> +</g> +</g> +<g id="patch3"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M295.200000 388.800000 +C341.027096 388.800000 384.983402 370.592702 417.388052 338.188052 +C449.792702 305.783402 468.000000 261.827096 468.000000 216.000000 +C468.000000 170.172904 449.792702 126.216598 417.388052 93.811948 +C384.983402 61.407298 341.027096 43.200000 295.200000 43.200000 +C249.372904 43.200000 205.416598 61.407298 173.011948 93.811948 +C140.607298 126.216598 122.400000 170.172904 122.400000 216.000000 +C122.400000 261.827096 140.607298 305.783402 173.011948 338.188052 +C205.416598 370.592702 249.372904 388.800000 295.200000 388.800000z"/> +</g> +</g> +</g> +</svg> Modified: branches/v1_0_maint/lib/matplotlib/tests/test_image.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/test_image.py 2010年07月23日 13:18:47 UTC (rev 8569) +++ branches/v1_0_maint/lib/matplotlib/tests/test_image.py 2010年07月23日 16:45:24 UTC (rev 8570) @@ -95,7 +95,20 @@ assert_array_equal(arr_dpi1, arr_dpi100) +@image_comparison(baseline_images=['image_clip']) +def test_image_clip(): + from math import pi + fig = plt.figure() + ax = fig.add_subplot(111, projection='hammer') + + d = [[1,2],[3,4]] + + ax.imshow(d, extent=(-pi,pi,-pi/2,pi/2)) + + fig.savefig('image_clip') + + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8573 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8573&view=rev Author: efiring Date: 2010年07月24日 21:59:55 +0000 (2010年7月24日) Log Message: ----------- rcParams: don't include deprecated keys. Some other rc cleanups are included in this changeset. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/__init__.py branches/v1_0_maint/lib/matplotlib/rcsetup.py Modified: branches/v1_0_maint/lib/matplotlib/__init__.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/__init__.py 2010年07月23日 16:47:30 UTC (rev 8572) +++ branches/v1_0_maint/lib/matplotlib/__init__.py 2010年07月24日 21:59:55 UTC (rev 8573) @@ -632,25 +632,50 @@ validate = dict([ (key, converter) for key, (default, converter) in \ defaultParams.iteritems() ]) + msg_depr = "%s is deprecated and replaced with %s; please use the latter." + msg_depr_ignore = "%s is deprecated and ignored. Use %s" def __setitem__(self, key, val): try: if key in _deprecated_map.keys(): alt = _deprecated_map[key] - warnings.warn('%s is deprecated in matplotlibrc. Use %s \ -instead.'% (key, alt)) + warnings.warn(self.msg_depr % (key, alt)) key = alt elif key in _deprecated_ignore_map: alt = _deprecated_ignore_map[key] - warnings.warn('%s is deprecated. Use %s instead.'% (key, alt)) + warnings.warn(self.msg_depr_ignore % (key, alt)) return cval = self.validate[key](val) dict.__setitem__(self, key, cval) except KeyError: raise KeyError('%s is not a valid rc parameter.\ -See rcParams.keys() for a list of valid parameters.'%key) +See rcParams.keys() for a list of valid parameters.' % (key,)) + def __getitem__(self, key): + if key in _deprecated_map.keys(): + alt = _deprecated_map[key] + warnings.warn(self.msg_depr % (key, alt)) + key = alt + elif key in _deprecated_ignore_map: + alt = _deprecated_ignore_map[key] + warnings.warn(self.msg_depr_ignore % (key, alt)) + key = alt + return dict.__getitem__(self, key) + def keys(self): + """ + Return sorted list of keys. + """ + k = dict.keys(self) + k.sort() + return k + + def values(self): + """ + Return values in order of sorted keys. + """ + return [self[k] for k in self.keys()] + def rc_params(fail_on_error=False): 'Return the default params updated from the values in the rc file' @@ -810,12 +835,12 @@ for k,v in kwargs.items(): name = aliases.get(k) or k key = '%s.%s' % (g, name) - if key not in rcParams: + try: + rcParams[key] = v + except KeyError: raise KeyError('Unrecognized key "%s" for group "%s" and name "%s"' % (key, g, name)) - rcParams[key] = v - def rcdefaults(): """ Restore the default rc params - the ones that were created at Modified: branches/v1_0_maint/lib/matplotlib/rcsetup.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/rcsetup.py 2010年07月23日 16:47:30 UTC (rev 8572) +++ branches/v1_0_maint/lib/matplotlib/rcsetup.py 2010年07月24日 21:59:55 UTC (rev 8573) @@ -347,8 +347,8 @@ defaultParams = { 'backend' : ['Agg', validate_backend], # agg is certainly present 'backend_fallback' : [True, validate_bool], # agg is certainly present - 'numerix' : ['obsolete', validate_numerix], - 'maskedarray' : ['obsolete', validate_maskedarray], #to be removed + #'numerix' : ['obsolete', validate_numerix], + #'maskedarray' : ['obsolete', validate_maskedarray], #to be removed 'toolbar' : ['toolbar2', validate_toolbar], 'datapath' : [None, validate_path_exists], # handled by _get_data_path_cached 'units' : [False, validate_bool], @@ -385,7 +385,7 @@ 'font.variant' : ['normal', str], # 'font.stretch' : ['normal', str], # 'font.weight' : ['normal', str], # - 'font.size' : [12.0, validate_float], # + 'font.size' : [12, validate_float], # Base font size in points 'font.serif' : [['Bitstream Vera Serif', 'DejaVu Serif', 'New Century Schoolbook', 'Century Schoolbook L', 'Utopia', 'ITC Bookman', 'Bookman', @@ -412,13 +412,16 @@ 'text.latex.preamble' : [[''], validate_stringlist], 'text.latex.preview' : [False, validate_bool], 'text.dvipnghack' : [None, validate_bool_maybe_none], - 'text.fontstyle' : ['normal', str], - 'text.fontangle' : ['normal', str], - 'text.fontvariant' : ['normal', str], - 'text.fontweight' : ['normal', str], - 'text.fontsize' : ['medium', validate_fontsize], 'text.hinting' : [True, validate_bool], + # The following are deprecated and replaced by, e.g., 'font.style' + #'text.fontstyle' : ['normal', str], + #'text.fontangle' : ['normal', str], + #'text.fontvariant' : ['normal', str], + #'text.fontweight' : ['normal', str], + #'text.fontsize' : ['medium', validate_fontsize], + + 'mathtext.cal' : ['cursive', validate_font_properties], 'mathtext.rm' : ['serif', validate_font_properties], 'mathtext.tt' : ['monospace', validate_font_properties], @@ -483,9 +486,6 @@ 'legend.shadow' : [False, validate_bool], - - - # tick properties 'xtick.major.size' : [4, validate_float], # major xtick size in points 'xtick.minor.size' : [2, validate_float], # minor xtick size in points This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8579 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8579&view=rev Author: efiring Date: 2010年07月26日 19:14:16 +0000 (2010年7月26日) Log Message: ----------- [3032390] subplot: more robust argument handling, consistent with 0.99.3 Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/axes.py branches/v1_0_maint/lib/matplotlib/gridspec.py Modified: branches/v1_0_maint/lib/matplotlib/axes.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/axes.py 2010年07月26日 18:20:35 UTC (rev 8578) +++ branches/v1_0_maint/lib/matplotlib/axes.py 2010年07月26日 19:14:16 UTC (rev 8579) @@ -8295,6 +8295,7 @@ being created. *plotNum* starts at 1 in the upper left corner and increases to the right. + If *numRows* <= *numCols* <= *plotNum* < 10, *args* can be the decimal integer *numRows* * 100 + *numCols* * 10 + *plotNum*. """ @@ -8304,25 +8305,28 @@ if len(args) == 1: if isinstance(args[0], SubplotSpec): self._subplotspec = args[0] - else: - s = str(args[0]) - if len(s) != 3: - raise ValueError('Argument to subplot must be a 3 digits long') - rows, cols, num = map(int, s) + try: + s = str(int(args[0])) + rows, cols, num = map(int, s) + except ValueError: + raise ValueError( + 'Single argument to subplot must be a 3-digit integer') self._subplotspec = GridSpec(rows, cols)[num-1] # num - 1 for converting from MATLAB to python indexing elif len(args)==3: rows, cols, num = args + rows = int(rows) + cols = int(cols) if isinstance(num, tuple) and len(num) == 2: + num = [int(n) for n in num] self._subplotspec = GridSpec(rows, cols)[num[0]-1:num[1]] else: - self._subplotspec = GridSpec(rows, cols)[num-1] + self._subplotspec = GridSpec(rows, cols)[int(num)-1] # num - 1 for converting from MATLAB to python indexing else: - raise ValueError( 'Illegal argument to subplot') + raise ValueError('Illegal argument(s) to subplot: %s' % (args,)) - self.update_params() # _axes_class is set in the subplot_class_factory Modified: branches/v1_0_maint/lib/matplotlib/gridspec.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/gridspec.py 2010年07月26日 18:20:35 UTC (rev 8578) +++ branches/v1_0_maint/lib/matplotlib/gridspec.py 2010年07月26日 19:14:16 UTC (rev 8579) @@ -70,7 +70,7 @@ def get_height_ratios(self): return self._row_height_ratios - + def get_grid_positions(self, fig): """ return lists of bottom and top position of rows, left and @@ -116,9 +116,9 @@ sepWidths = [0] + ([sepW] * (ncols-1)) cellWs = np.add.accumulate(np.ravel(zip(sepWidths, cellWidths))) - + figTops = [top - cellHs[2*rowNum] for rowNum in range(nrows)] figBottoms = [top - cellHs[2*rowNum+1] for rowNum in range(nrows)] figLefts = [left + cellWs[2*colNum] for colNum in range(ncols)] @@ -126,8 +126,8 @@ return figBottoms, figTops, figLefts, figRights - + def __getitem__(self, key): """ create and return a SuplotSpec instance. @@ -287,7 +287,7 @@ def get_subplot_params(self, fig=None): """ - return a dictionary of subplot layout parameters. + return a dictionary of subplot layout parameters. """ if fig is None: @@ -324,7 +324,7 @@ """ specifies the location of the subplot in the given *GridSpec*. """ - + def __init__(self, gridspec, num1, num2=None): """ The subplot will occupy the num1-th cell of the given This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8590 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8590&view=rev Author: mdboom Date: 2010年07月28日 19:19:27 +0000 (2010年7月28日) Log Message: ----------- [3031954] polar plot axis labeling problem Radial axis labels should now be placed correctly, even for small values of rmax Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/projections/polar.py branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/polar_units.png Modified: branches/v1_0_maint/lib/matplotlib/projections/polar.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/projections/polar.py 2010年07月28日 18:50:21 UTC (rev 8589) +++ branches/v1_0_maint/lib/matplotlib/projections/polar.py 2010年07月28日 19:19:27 UTC (rev 8590) @@ -13,7 +13,8 @@ from matplotlib.path import Path from matplotlib.ticker import Formatter, Locator, FormatStrFormatter from matplotlib.transforms import Affine2D, Affine2DBase, Bbox, \ - BboxTransformTo, IdentityTransform, Transform, TransformWrapper + BboxTransformTo, IdentityTransform, Transform, TransformWrapper, \ + ScaledTranslation, blended_transform_factory import matplotlib.spines as mspines class PolarAxes(Axes): @@ -287,13 +288,17 @@ Affine2D().scale(np.pi * 2.0, 1.0) + self.transData) # The r-axis labels are put at an angle and padded in the r-direction - self._r_label1_position = Affine2D().translate(22.5, self._rpad) + self._r_label1_position = ScaledTranslation( + 22.5, self._rpad, + blended_transform_factory(Affine2D(), BboxTransformTo(self.viewLim))) self._yaxis_text1_transform = ( self._r_label1_position + Affine2D().scale(1.0 / 360.0, 1.0) + self._yaxis_transform ) - self._r_label2_position = Affine2D().translate(22.5, self._rpad) + self._r_label2_position = ScaledTranslation( + 22.5, -self._rpad, + blended_transform_factory(Affine2D(), BboxTransformTo(self.viewLim))) self._yaxis_text2_transform = ( self._r_label2_position + Affine2D().scale(1.0 / 360.0, 1.0) + @@ -435,9 +440,10 @@ angle = self._r_label1_position.to_values()[4] if rpad is not None: self._rpad = rpad - rmax = self.get_rmax() - self._r_label1_position.clear().translate(angle, self._rpad * rmax) - self._r_label2_position.clear().translate(angle, -self._rpad * rmax) + self._r_label1_position._t = (angle, self._rpad) + self._r_label1_position.invalidate() + self._r_label2_position._t = (angle, -self._rpad) + self._r_label2_position.invalidate() for t in self.yaxis.get_ticklabels(): t.update(kwargs) return self.yaxis.get_gridlines(), self.yaxis.get_ticklabels() @@ -516,11 +522,11 @@ dt = dt0 * -1.0 dt = (dt / np.pi) * 180.0 - rpad = self._r_label1_position.to_values()[5] - self._r_label1_position.clear().translate( - p.r_label_angle - dt, rpad) - self._r_label2_position.clear().translate( - p.r_label_angle - dt, -rpad) + rpad = self._rpad + self._r_label1_position._t = (p.r_label_angle - dt, rpad) + self._r_label1_position.invalidate() + self._r_label2_position._t = (p.r_label_angle - dt, -rpad) + self._r_label2_position.invalidate() elif p.mode == 'zoom': startt, startr = p.trans_inverse.transform_point((p.x, p.y)) Modified: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/polar_units.png =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8593 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8593&view=rev Author: weathergod Date: 2010年07月29日 16:16:17 +0000 (2010年7月29日) Log Message: ----------- Fix documentation for set_linestyle() and set_marker() and a few other functions properly display their available values on the web docs. Also changed pentagram to pentagon in the docstrings. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/artist.py branches/v1_0_maint/lib/matplotlib/axes.py branches/v1_0_maint/lib/matplotlib/lines.py Modified: branches/v1_0_maint/lib/matplotlib/artist.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/artist.py 2010年07月29日 14:09:11 UTC (rev 8592) +++ branches/v1_0_maint/lib/matplotlib/artist.py 2010年07月29日 16:16:17 UTC (rev 8593) @@ -826,7 +826,7 @@ for a line that begins with ACCEPTS: Eg., for a line linestyle, return - [ '-' | '--' | '-.' | ':' | 'steps' | 'None' ] + "[ ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'steps'`` | ``'None'`` ]" """ name = 'set_%s'%attr Modified: branches/v1_0_maint/lib/matplotlib/axes.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/axes.py 2010年07月29日 14:09:11 UTC (rev 8592) +++ branches/v1_0_maint/lib/matplotlib/axes.py 2010年07月29日 16:16:17 UTC (rev 8593) @@ -5549,22 +5549,22 @@ *marker*: can be one of: - ===== ============== - Value Description - ===== ============== - 's' square - 'o' circle - '^' triangle up - '>' triangle right - 'v' triangle down - '<' triangle left - 'd' diamond - 'p' pentagram - 'h' hexagon - '8' octagon - '+' plus - 'x' cross - ===== ============== + ======= ============== + Value Description + ======= ============== + ``'s'`` square + ``'o'`` circle + ``'^'`` triangle up + ``'>'`` triangle right + ``'v'`` triangle down + ``'<'`` triangle left + ``'d'`` diamond + ``'p'`` pentagon + ``'h'`` hexagon + ``'8'`` octagon + ``'+'`` plus + ``'x'`` cross + ======= ============== The marker can also be a tuple (*numsides*, *style*, *angle*), which will create a custom, regular symbol. @@ -5655,7 +5655,7 @@ 'v' : (3,math.pi,0), # triangle down '<' : (3,3*math.pi/2.0,0), # triangle left 'd' : (4,0,0), # diamond - 'p' : (5,0,0), # pentagram + 'p' : (5,0,0), # pentagon 'h' : (6,0,0), # hexagon '8' : (8,0,0), # octagon '+' : (4,0,2), # plus Modified: branches/v1_0_maint/lib/matplotlib/lines.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/lines.py 2010年07月29日 14:09:11 UTC (rev 8592) +++ branches/v1_0_maint/lib/matplotlib/lines.py 2010年07月29日 16:16:17 UTC (rev 8593) @@ -712,13 +712,13 @@ ================ ================= linestyle description ================ ================= - '-' solid - '--' dashed - '-.' dash_dot - ':' dotted - 'None' draw nothing - ' ' draw nothing - '' draw nothing + ``'-'`` solid + ``'--'`` dashed + ``'-.'`` dash_dot + ``':'`` dotted + ``'None'`` draw nothing + ``' '`` draw nothing + ``''`` draw nothing ================ ================= 'steps' is equivalent to 'steps-pre' and is maintained for @@ -729,8 +729,8 @@ :meth:`set_drawstyle` To set the drawing style (stepping) of the plot. - ACCEPTS: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and - any drawstyle in combination with a linestyle, e.g. 'steps--'. + ACCEPTS: [ ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'None'`` | ``' '`` | ``''`` ] + and any drawstyle in combination with a linestyle, e.g. ``'steps--'``. """ for ds in self.drawStyleKeys: # long names are first in the list @@ -759,28 +759,28 @@ ========== ========================== marker description ========== ========================== - '.' point - ',' pixel - 'o' circle - 'v' triangle_down - '^' triangle_up - '<' triangle_left - '>' triangle_right - '1' tri_down - '2' tri_up - '3' tri_left - '4' tri_right - 's' square - 'p' pentagon - '*' star - 'h' hexagon1 - 'H' hexagon2 - '+' plus - 'x' x - 'D' diamond - 'd' thin_diamond - '|' vline - '_' hline + ``'.'`` point + ``','`` pixel + ``'o'`` circle + ``'v'`` triangle_down + ``'^'`` triangle_up + ``'<'`` triangle_left + ``'>'`` triangle_right + ``'1'`` tri_down + ``'2'`` tri_up + ``'3'`` tri_left + ``'4'`` tri_right + ``'s'`` square + ``'p'`` pentagon + ``'*'`` star + ``'h'`` hexagon1 + ``'H'`` hexagon2 + ``'+'`` plus + ``'x'`` x + ``'D'`` diamond + ``'d'`` thin_diamond + ``'|'`` vline + ``'_'`` hline TICKLEFT tickleft TICKRIGHT tickright TICKUP tickup @@ -789,19 +789,23 @@ CARETRIGHT caretright CARETUP caretup CARETDOWN caretdown - 'None' nothing - ' ' nothing - '' nothing + ``'None'`` nothing + ``' '`` nothing + ``''`` nothing '$...$' render the string using mathtext ========== ========================== - ACCEPTS: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' - | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' - | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' + ACCEPTS: [ ``'+'`` | ``'*'`` | ``','`` | ``'.'`` + | ``'1'`` | ``'2'`` | ``'3'`` | ``'4'`` + | ``'<'`` | ``'>'`` | ``'D'`` | ``'H'`` + | ``'^'`` | ``'_'`` | ``'d'`` | ``'h'`` + | ``'o'`` | ``'p'`` | ``'s'`` | ``'v'`` + | ``'x'`` | ``'|'`` | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT - | 'None' | ' ' | '' | '$...$'] + | CARETUP | CARETDOWN | CARETLEFT | CARETRIGHT + | ``'None'`` | ``' '`` | ``''`` | '$...$'] """ if marker in self._markers: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8601 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8601&view=rev Author: mdboom Date: 2010年07月30日 18:56:18 +0000 (2010年7月30日) Log Message: ----------- [3036982] imsave: wrong image size Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/image.py branches/v1_0_maint/lib/matplotlib/tests/test_image.py Modified: branches/v1_0_maint/lib/matplotlib/image.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/image.py 2010年07月30日 18:47:19 UTC (rev 8600) +++ branches/v1_0_maint/lib/matplotlib/image.py 2010年07月30日 18:56:18 UTC (rev 8601) @@ -1225,7 +1225,7 @@ from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas from matplotlib.figure import Figure - figsize = [x / float(dpi) for x in arr.shape] + figsize = [x / float(dpi) for x in arr.shape[::-1]] fig = Figure(figsize=figsize, dpi=dpi, frameon=False) canvas = FigureCanvas(fig) im = fig.figimage(arr, cmap=cmap, vmin=vmin, vmax=vmax, origin=origin) Modified: branches/v1_0_maint/lib/matplotlib/tests/test_image.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/test_image.py 2010年07月30日 18:47:19 UTC (rev 8600) +++ branches/v1_0_maint/lib/matplotlib/tests/test_image.py 2010年07月30日 18:56:18 UTC (rev 8601) @@ -77,15 +77,13 @@ # the data is 100% identical. from numpy import random random.seed(1) - data = random.rand(256, 256) + data = random.rand(256, 128) buff_dpi1 = cStringIO.StringIO() plt.imsave(buff_dpi1, data, dpi=1) - plt.imsave("test_dpi1.png", data, dpi=1) buff_dpi100 = cStringIO.StringIO() plt.imsave(buff_dpi100, data, dpi=100) - plt.imsave("test_dpi100.png", data, dpi=1) buff_dpi1.seek(0) arr_dpi1 = plt.imread(buff_dpi1) @@ -93,6 +91,9 @@ buff_dpi100.seek(0) arr_dpi100 = plt.imread(buff_dpi100) + assert arr_dpi1.shape == (256, 128, 4) + assert arr_dpi100.shape == (256, 128, 4) + assert_array_equal(arr_dpi1, arr_dpi100) @image_comparison(baseline_images=['image_clip']) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8612 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8612&view=rev Author: mdboom Date: 2010年08月02日 12:30:48 +0000 (2010年8月02日) Log Message: ----------- Fix image placement bug introduced in 8585 (reported by JJ) Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/image.py branches/v1_0_maint/lib/matplotlib/tests/test_image.py Added Paths: ----------- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/imshow.pdf branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/imshow.png branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/imshow.svg Modified: branches/v1_0_maint/lib/matplotlib/image.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/image.py 2010年08月01日 21:12:58 UTC (rev 8611) +++ branches/v1_0_maint/lib/matplotlib/image.py 2010年08月02日 12:30:48 UTC (rev 8612) @@ -596,7 +596,6 @@ l, b, r, t = self.axes.bbox.extents widthDisplay = (round(r*magnification) + 0.5) - (round(l*magnification) - 0.5) heightDisplay = (round(t*magnification) + 0.5) - (round(b*magnification) - 0.5) - im.apply_translation(tx, ty) # resize viewport to display rx = widthDisplay / numcols Added: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/imshow.pdf =================================================================== (Binary files differ) Property changes on: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/imshow.pdf ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/imshow.png =================================================================== (Binary files differ) Property changes on: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/imshow.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/imshow.svg =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/imshow.svg (rev 0) +++ branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/imshow.svg 2010年08月02日 12:30:48 UTC (rev 8612) @@ -0,0 +1,395 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with matplotlib (http://matplotlib.sourceforge.net/) --> +<svg width="576pt" height="432pt" viewBox="0 0 576 432" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + version="1.1" + id="svg1"> +<filter id="colorAdd"><feComposite in="SourceGraphic" in2="BackgroundImage" operator="arithmetic" k2="1" k3="1"/></filter> +<g id="figure1"> +<g id="patch1"> +<path style="fill: #ffffff; stroke: #ffffff; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M0.000000 432.000000L576.000000 432.000000L576.000000 0.000000 +L0.000000 0.000000L0.000000 432.000000"/> +</g> +<g id="axes1"> +<g id="patch2"> +<path style="fill: #ffffff; opacity: 1.000000" d="M122.400000 388.800000L468.000000 388.800000L468.000000 43.200000 +L122.400000 43.200000L122.400000 388.800000"/> +</g> +<defs> + <clipPath id="p3268b4c49a7b373f0e4e01e239475b1d"> +<rect x="122.400000" y="43.200000" width="345.600000" height="345.600000"/> + </clipPath> +</defs><image x="122.400000" y="41.800000" width="347.000000" height="347.000000" clip-path="url(#p3268b4c49a7b373f0e4e01e239475b1d)" xlink:href="data:image/png;base64, +iVBORw0KGgoAAAANSUhEUgAAAVsAAAFbCAYAAAB7zy3tAAAABHNCSVQICAgIfAhkiAAAGkVJREFU +eJzt3V+W28ZygPECRrac5OFuIN6HVuJFOhvRPnw3kKck9hWRhyGA6uqqRgPklMzW9ztHJog/DXB0 +9KkH5MjTsiwCAPhY8/e+AAD4ERBbAEhAbAEgAbEFgATEFgASEFsASEBsASABsQWABMQWABIQWwBI +QGwBIAGxBYAExBYAEhBbAEhAbAEgAbEFgATEFgASEFsASEBsASABsQWABMQWABIQWwBIQGwBIAGx +BYAExBYAEhBbAEhAbAEgAbEFgATEFgASEFsASEBsASABsQWABMQWABIQWwBIQGwBIAGxBYAExBYA +EhBbAEhAbAEgAbEFgATEFgASEFsASEBsASABsQWABMQWABIQWwBIQGwBIAGxBYAExBYAEhBbAEhA +bAEgAbEFgATEFgASEFsASEBsASABsQWABMQWABIQWwBIQGwBIAGxBYAExBYAEhBbAEhAbAEgAbEF +gATEFgASEFsASEBsASABsQWABMQWABIQWwBIQGwBIAGxBYAExBYAEhBbAEhAbAEgAbEFgATEFgAS +EFsASEBsASABsQWABMQWABIQWwBIQGwBIAGxBYAExBYAEhBbAEhAbAEgAbEFgATEFgASEFsASEBs +ASABsQWABMQWABIQWwBIQGwBIAGxBYAExBYAEhBbAEhAbAEgAbEFgATEFgASEFsASEBsASABsQWA +BMQWABIQWwBIQGwBIAGxBYAExBYAEhBbAEhAbAEgAbEFgATEFgASEFsASPDpe18AnuePP/77169f +//kl3mM68dxbPlp3Zcwz5zo6tuf43tdy9jqecc7Sly8/ff3117c/wh3wUojtQL5+/eeX3377r9/9 +rZOUf8Cj59Gv+eB579gSHHt27Na2K+P3vsbW6zp7ztkcX/r993/8RmzHwW0EXLR87wsAXgqxBYAE +xBYAEhBbAEhAbH849g0Z+ybPI/t7784fvYN/9TqiY+N394/HaD3v3Qb4+DTCUN5E5N+DbVffRb/6 +aQFpbJtEppPnnC5e+9nzrK8vPC54ndOZr6U3vmMm6iMhtkP5JDmxPYqQWT4KkbfdjZEdM3gN09H6 +C0F2x/Rem722g/MU4xp83zkUYjuUo5ltT2Bb2zpneSJOnMyjDo8Nlg1pNFZP6KaecTvCatfpcbex +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 ++eWwAAAAAElFTkSuQmCC +"/> +<g id="matplotlib.axis1"> +<g id="xtick1"> +<g id="line2d1"> +<defs><path id="m30e32995789d870ad79a2e54c91cf9c6" d="M0.000000 0.000000L0.000000 -4.000000"/></defs> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="122.400000" y="388.800000"/> +</g></g> +<g id="line2d2"> +<defs><path id="m9281cae24120827b11d5ea8a7ad3e96b" d="M0.000000 0.000000L0.000000 4.000000"/></defs> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="122.400000" y="43.200000"/> +</g></g> +<g id="text1"> +<defs> +<path id="c_7a2040fe3b94fcd41d0a72c84e93b115" d="M31.781250 -66.406250q-7.609375 0.000000 -11.453125 7.500000q-3.828125 7.484375 -3.828125 22.531250q0.000000 14.984375 3.828125 22.484375q3.843750 7.500000 11.453125 7.500000q7.671875 0.000000 11.500000 -7.500000q3.843750 -7.500000 3.843750 -22.484375q0.000000 -15.046875 -3.843750 -22.531250q-3.828125 -7.500000 -11.500000 -7.500000M31.781250 -74.218750q12.265625 0.000000 18.734375 9.703125q6.468750 9.687500 6.468750 28.140625q0.000000 18.406250 -6.468750 28.109375q-6.468750 9.687500 -18.734375 9.687500q-12.250000 0.000000 -18.718750 -9.687500q-6.468750 -9.703125 -6.468750 -28.109375q0.000000 -18.453125 6.468750 -28.140625q6.468750 -9.703125 18.718750 -9.703125"/> +<path id="c_ed3e21196fb739f392806f09ca0594ef" d="M10.687500 -12.406250l10.312500 0.000000l0.000000 12.406250l-10.312500 0.000000z"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(113.650000,401.706250)scale(0.120000)"> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +<g id="xtick2"> +<g id="line2d3"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="180.000000" y="388.800000"/> +</g></g> +<g id="line2d4"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="180.000000" y="43.200000"/> +</g></g> +<g id="text2"> +<defs> +<path id="c_1260a2df50f305f3db244e29828f968e" d="M10.796875 -72.906250l38.718750 0.000000l0.000000 8.312500l-29.687500 0.000000l0.000000 17.859375q2.140625 -0.734375 4.281250 -1.093750q2.156250 -0.359375 4.312500 -0.359375q12.203125 0.000000 19.328125 6.687500q7.140625 6.687500 7.140625 18.109375q0.000000 11.765625 -7.328125 18.296875q-7.328125 6.515625 -20.656250 6.515625q-4.593750 0.000000 -9.359375 -0.781250q-4.750000 -0.781250 -9.828125 -2.343750l0.000000 -9.921875q4.390625 2.390625 9.078125 3.562500q4.687500 1.171875 9.906250 1.171875q8.453125 0.000000 13.375000 -4.437500q4.937500 -4.437500 4.937500 -12.062500q0.000000 -7.609375 -4.937500 -12.046875q-4.921875 -4.453125 -13.375000 -4.453125q-3.953125 0.000000 -7.890625 0.875000q-3.921875 0.875000 -8.015625 2.734375z"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(171.375000,401.706250)scale(0.120000)"> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="95.410156"/> +</g> +</g> +</g> +<g id="xtick3"> +<g id="line2d5"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="237.600000" y="388.800000"/> +</g></g> +<g id="line2d6"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="237.600000" y="43.200000"/> +</g></g> +<g id="text3"> +<defs> +<path id="c_42baa63129a918535c52adb20d687ea7" d="M12.406250 -8.296875l16.109375 0.000000l0.000000 -55.625000l-17.531250 3.515625l0.000000 -8.984375l17.437500 -3.515625l9.859375 0.000000l0.000000 64.609375l16.109375 0.000000l0.000000 8.296875l-41.984375 0.000000z"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(229.107812,401.706250)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +<g id="xtick4"> +<g id="line2d7"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="295.200000" y="388.800000"/> +</g></g> +<g id="line2d8"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="295.200000" y="43.200000"/> +</g></g> +<g id="text4"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(286.832812,401.550000)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="95.410156"/> +</g> +</g> +</g> +<g id="xtick5"> +<g id="line2d9"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="352.800000" y="388.800000"/> +</g></g> +<g id="line2d10"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="352.800000" y="43.200000"/> +</g></g> +<g id="text5"> +<defs> +<path id="c_ed3f3ed3ebfbd18bcb9c012009a68ad1" d="M19.187500 -8.296875l34.421875 0.000000l0.000000 8.296875l-46.281250 0.000000l0.000000 -8.296875q5.609375 -5.812500 15.296875 -15.593750q9.703125 -9.796875 12.187500 -12.640625q4.734375 -5.312500 6.609375 -9.000000q1.890625 -3.687500 1.890625 -7.250000q0.000000 -5.812500 -4.078125 -9.468750q-4.078125 -3.671875 -10.625000 -3.671875q-4.640625 0.000000 -9.796875 1.609375q-5.140625 1.609375 -11.000000 4.890625l0.000000 -9.968750q5.953125 -2.390625 11.125000 -3.609375q5.187500 -1.218750 9.484375 -1.218750q11.328125 0.000000 18.062500 5.671875q6.734375 5.656250 6.734375 15.125000q0.000000 4.500000 -1.687500 8.531250q-1.671875 4.015625 -6.125000 9.484375q-1.218750 1.421875 -7.765625 8.187500q-6.531250 6.765625 -18.453125 18.921875"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(344.089062,401.706250)scale(0.120000)"> +<use xlink:href="#c_ed3f3ed3ebfbd18bcb9c012009a68ad1"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +<g id="xtick6"> +<g id="line2d11"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="410.400000" y="388.800000"/> +</g></g> +<g id="line2d12"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="410.400000" y="43.200000"/> +</g></g> +<g id="text6"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(401.814062,401.706250)scale(0.120000)"> +<use xlink:href="#c_ed3f3ed3ebfbd18bcb9c012009a68ad1"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="95.410156"/> +</g> +</g> +</g> +<g id="xtick7"> +<g id="line2d13"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="468.000000" y="388.800000"/> +</g></g> +<g id="line2d14"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="468.000000" y="43.200000"/> +</g></g> +<g id="text7"> +<defs> +<path id="c_3dcfa38a02242cb63ec6726c6e70be7a" d="M40.578125 -39.312500q7.078125 1.515625 11.046875 6.312500q3.984375 4.781250 3.984375 11.812500q0.000000 10.781250 -7.421875 16.703125q-7.421875 5.906250 -21.093750 5.906250q-4.578125 0.000000 -9.437500 -0.906250q-4.859375 -0.906250 -10.031250 -2.718750l0.000000 -9.515625q4.093750 2.390625 8.968750 3.609375q4.890625 1.218750 10.218750 1.218750q9.265625 0.000000 14.125000 -3.656250q4.859375 -3.656250 4.859375 -10.640625q0.000000 -6.453125 -4.515625 -10.078125q-4.515625 -3.640625 -12.562500 -3.640625l-8.500000 0.000000l0.000000 -8.109375l8.890625 0.000000q7.265625 0.000000 11.125000 -2.906250q3.859375 -2.906250 3.859375 -8.375000q0.000000 -5.609375 -3.984375 -8.609375q-3.968750 -3.015625 -11.390625 -3.015625q-4.062500 0.000000 -8.703125 0.890625q-4.640625 0.875000 -10.203125 2.718750l0.000000 -8.781250q5.625000 -1.562500 10.531250 -2.343750q4.906250 -0.781250 9.250000 -0.781250q11.234375 0.000000 17.765625 5.109375q6.546875 5.093750 6.546875 13.781250q0.000000 6.062500 -3.468750 10.234375q-3.468750 4.171875 -9.859375 5.781250"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(459.312500,401.706250)scale(0.120000)"> +<use xlink:href="#c_3dcfa38a02242cb63ec6726c6e70be7a"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +</g> +<g id="matplotlib.axis2"> +<g id="ytick1"> +<g id="line2d15"> +<defs><path id="m3400efa6b1638b3fea9e19e898273957" d="M0.000000 0.000000L4.000000 0.000000"/></defs> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="122.400000" y="388.800000"/> +</g></g> +<g id="line2d16"> +<defs><path id="m20b58b2501143cb5e0a5e8f1ef6f1643" d="M0.000000 0.000000L-4.000000 0.000000"/></defs> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="468.000000" y="388.800000"/> +</g></g> +<g id="text8"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(100.900000,393.167188)scale(0.120000)"> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +<g id="ytick2"> +<g id="line2d17"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="122.400000" y="331.200000"/> +</g></g> +<g id="line2d18"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="468.000000" y="331.200000"/> +</g></g> +<g id="text9"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(101.150000,335.567188)scale(0.120000)"> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="95.410156"/> +</g> +</g> +</g> +<g id="ytick3"> +<g id="line2d19"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="122.400000" y="273.600000"/> +</g></g> +<g id="line2d20"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="468.000000" y="273.600000"/> +</g></g> +<g id="text10"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(101.415625,277.967188)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +<g id="ytick4"> +<g id="line2d21"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="122.400000" y="216.000000"/> +</g></g> +<g id="line2d22"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="468.000000" y="216.000000"/> +</g></g> +<g id="text11"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(101.665625,220.289062)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="95.410156"/> +</g> +</g> +</g> +<g id="ytick5"> +<g id="line2d23"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="122.400000" y="158.400000"/> +</g></g> +<g id="line2d24"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="468.000000" y="158.400000"/> +</g></g> +<g id="text12"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(100.978125,162.767187)scale(0.120000)"> +<use xlink:href="#c_ed3f3ed3ebfbd18bcb9c012009a68ad1"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +<g id="ytick6"> +<g id="line2d25"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="122.400000" y="100.800000"/> +</g></g> +<g id="line2d26"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="468.000000" y="100.800000"/> +</g></g> +<g id="text13"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(101.228125,105.167188)scale(0.120000)"> +<use xlink:href="#c_ed3f3ed3ebfbd18bcb9c012009a68ad1"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="95.410156"/> +</g> +</g> +</g> +<g id="ytick7"> +<g id="line2d27"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="122.400000" y="43.200000"/> +</g></g> +<g id="line2d28"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="468.000000" y="43.200000"/> +</g></g> +<g id="text14"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(101.025000,47.567187)scale(0.120000)"> +<use xlink:href="#c_3dcfa38a02242cb63ec6726c6e70be7a"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +</g> +<g id="patch3"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M122.400000 43.200000L468.000000 43.200000"/> +</g> +<g id="patch4"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M468.000000 388.800000L468.000000 43.200000"/> +</g> +<g id="patch5"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M122.400000 388.800000L468.000000 388.800000"/> +</g> +<g id="patch6"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M122.400000 388.800000L122.400000 43.200000"/> +</g> +</g> +</g> +</svg> Modified: branches/v1_0_maint/lib/matplotlib/tests/test_image.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/test_image.py 2010年08月01日 21:12:58 UTC (rev 8611) +++ branches/v1_0_maint/lib/matplotlib/tests/test_image.py 2010年08月02日 12:30:48 UTC (rev 8612) @@ -109,7 +109,20 @@ fig.savefig('image_clip') +@image_comparison(baseline_images=['imshow']) +def test_imshow(): + import numpy as np + import matplotlib.pyplot as plt + fig = plt.figure() + arr = np.arange(100).reshape((10, 10)) + ax = fig.add_subplot(111) + ax.imshow(arr, interpolation="bilinear", extent=(1,2,1,2)) + ax.set_xlim(0,3) + ax.set_ylim(0,3) + + fig.savefig('imshow') + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8649 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8649&view=rev Author: mdboom Date: 2010年08月18日 17:00:29 +0000 (2010年8月18日) Log Message: ----------- Fix positions of r axis labels when rmin != 0.0 in polar plots. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/projections/polar.py branches/v1_0_maint/lib/matplotlib/transforms.py Modified: branches/v1_0_maint/lib/matplotlib/projections/polar.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/projections/polar.py 2010年08月18日 16:09:19 UTC (rev 8648) +++ branches/v1_0_maint/lib/matplotlib/projections/polar.py 2010年08月18日 17:00:29 UTC (rev 8649) @@ -14,7 +14,7 @@ from matplotlib.ticker import Formatter, Locator, FormatStrFormatter from matplotlib.transforms import Affine2D, Affine2DBase, Bbox, \ BboxTransformTo, IdentityTransform, Transform, TransformWrapper, \ - ScaledTranslation, blended_transform_factory + ScaledTranslation, blended_transform_factory, BboxTransformToMaxOnly import matplotlib.spines as mspines class PolarAxes(Axes): @@ -41,16 +41,16 @@ self._axis = axis def transform(self, tr): - xy = np.zeros(tr.shape, np.float_) + xy = np.empty(tr.shape, np.float_) if self._axis is not None: rmin = self._axis.viewLim.ymin else: rmin = 0 - t = tr[:, 0:1] - r = tr[:, 1:2] - x = xy[:, 0:1] - y = xy[:, 1:2] + t = tr[:, 0:1] + r = tr[:, 1:2] + x = xy[:, 0:1] + y = xy[:, 1:2] if rmin != 0: r = r - rmin @@ -188,7 +188,7 @@ def view_limits(self, vmin, vmax): vmin, vmax = self.base.view_limits(vmin, vmax) - return 0, vmax + return vmin, vmax def __init__(self, *args, **kwargs): @@ -290,7 +290,8 @@ # The r-axis labels are put at an angle and padded in the r-direction self._r_label1_position = ScaledTranslation( 22.5, self._rpad, - blended_transform_factory(Affine2D(), BboxTransformTo(self.viewLim))) + blended_transform_factory( + Affine2D(), BboxTransformToMaxOnly(self.viewLim))) self._yaxis_text1_transform = ( self._r_label1_position + Affine2D().scale(1.0 / 360.0, 1.0) + @@ -298,7 +299,8 @@ ) self._r_label2_position = ScaledTranslation( 22.5, -self._rpad, - blended_transform_factory(Affine2D(), BboxTransformTo(self.viewLim))) + blended_transform_factory( + Affine2D(), BboxTransformToMaxOnly(self.viewLim))) self._yaxis_text2_transform = ( self._r_label2_position + Affine2D().scale(1.0 / 360.0, 1.0) + Modified: branches/v1_0_maint/lib/matplotlib/transforms.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/transforms.py 2010年08月18日 16:09:19 UTC (rev 8648) +++ branches/v1_0_maint/lib/matplotlib/transforms.py 2010年08月18日 17:00:29 UTC (rev 8649) @@ -2107,6 +2107,31 @@ get_matrix.__doc__ = Affine2DBase.get_matrix.__doc__ +class BboxTransformToMaxOnly(BboxTransformTo): + """ + :class:`BboxTransformTo` is a transformation that linearly + transforms points from the unit bounding box to a given + :class:`Bbox` with a fixed upper left of (0, 0). + """ + def __repr__(self): + return "BboxTransformToMaxOnly(%s)" % (self._boxout) + __str__ = __repr__ + + def get_matrix(self): + if self._invalid: + xmax, ymax = self._boxout.max + if DEBUG and (xmax == 0 or ymax == 0): + raise ValueError("Transforming to a singular bounding box.") + self._mtx = np.array([[xmax, 0.0, 0.0], + [ 0.0, ymax, 0.0], + [ 0.0, 0.0, 1.0]], + np.float_) + self._inverted = None + self._invalid = 0 + return self._mtx + get_matrix.__doc__ = Affine2DBase.get_matrix.__doc__ + + class BboxTransformFrom(Affine2DBase): """ :class:`BboxTransformFrom` linearly transforms points from a given This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8650 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8650&view=rev Author: mdboom Date: 2010年08月18日 17:35:26 +0000 (2010年8月18日) Log Message: ----------- Fix unit tests for polar rmin changes in last commit. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/projections/polar.py branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.pdf branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.png branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.svg Modified: branches/v1_0_maint/lib/matplotlib/projections/polar.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/projections/polar.py 2010年08月18日 17:00:29 UTC (rev 8649) +++ branches/v1_0_maint/lib/matplotlib/projections/polar.py 2010年08月18日 17:35:26 UTC (rev 8650) @@ -188,7 +188,7 @@ def view_limits(self, vmin, vmax): vmin, vmax = self.base.view_limits(vmin, vmax) - return vmin, vmax + return 0, vmax def __init__(self, *args, **kwargs): Modified: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.pdf =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.pdf 2010年08月18日 17:00:29 UTC (rev 8649) +++ branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/polar_rmin.pdf 2010年08月18日 17:35:26 UTC (rev 8650) @@ -15,113 +15,118 @@ 9 0 obj << /Filter /FlateDecode /Length 11 0 R >> stream -x\x9C\xED\x9DϮ<?n\xDD\xF7\xF5\xB5L6\xFDWik 1\xE0]\xE2\xB2\xB2r\x90\xC6u\x80\xAC\xFCZyĜշKE];;?\xAF\xAE1\xE3\xF9ޮ\xAE\xAE\x92DR$Ͽ=\xD2\xF9Wg<\xFF\x87\xFE\xFB\x97G8\xC3\xF9wg\xEDM\xFF\xFBe\xFF[rҿ\xC2\xE7\xF5\xF9\xF1\xFA\xDE\xDF\xEB_y\xA4\xEBҕW\xD2M9\xE7וz\xB5\xBD?˽\xBF\xFA\x95K\x88\xAD\xC7v\xB6\xF8*\xA1\xA7q\x85\x91\xF5\xBB1\xBC\xE2u\x85\xFB5\x8E\xA1{c\xE5J1\x9Es\x96\x92^u\xE8\xC7\xE2\xAD\x9C1\xB5W\x8A\xAD\x8E+\xA7\xAB\x9C\xA5\x85\xD7uƮ\xD0\xCF\xDEl~\xA4\xEF\x9Cs\xBC\xFF\xAD\xC7ݯ\xF3\xFC\xBD\xEA\xFAb\xCFW\xC9\xF9\xBA\xFFһ\xB8Qd=v\xFD\xA9u\xD4\xF9\xBAx\xF2\xF5\xFE\xD7\xF17g҃?/9/\xC7q\xAD\x83q\xBF\xA7\xF7Ll\xEF\xF5\xB4e\xDD8b\xAC\x9A\xF5\xC7\xC0\xDFŦw\x99\xFF~L\x9B\xFB=7\xCF\xCFwqK\xE4\x86\xF1\\xDCǰM>\x82\xF27\xE7\xFF<\xFE\xFB\xF1\xBF\xCF_\xC9\xF9\x95\x9C?_r\xFE\xF3\xF9\xBF\x84So8\xCF\xFF4\x88\xC5\xFB;}\xAF\xBD\xAER\xCF)h\xC8I\xEF\xAC\xC9i\xADf\xFDSЕ. -9 -\xB8\xA7+\xD9\xF5c\xCA)\xA51jz\x97WU\x9Fk\xAA]\xCF5i\x85c\xD7tp~\xD5\xDC\xF4G\x99\xEBE\x8F+!\xB71\xDE\xF7KRR\xB1\x94֢]O)\x84\xA6A\xA7b\xF7\xC7W\xEDZ\x972\xD2\xE0~M`\xAD5\xE50\xE2e\xF7\x87W\xB9\xF4Ҋ\xBD\xBF~Nokɞ߇\x94\x87@Yo\xA1\xEB\xFA\xB9b\xBD\xA2>\xE3~]O\x92\xE0p\x85\xA6iM\xCDRJ-]\xD0\xED\xFE\xEBծ\xA0\x97I\xA9h҂\xBE\x9E\xAE\xF3żs\xBF\x96%kZ\xBC\xBA\xDE/t=.զ\xE9\x8C\xC3\xEE\xB7z\xEEm\xAE7\xA6\xE3\xD2d\x87>k\x8Du\x8F&Y\xD7\xEB+\i\xB4z\xE5\xDA\xDF\xF7\xF78Z\xAAz`\xD6\xF5\xCCtĦ\xF7 \xF5}\xFFUr\xE8\xE1*A\xEF\xD2+\xE8\xD1W˹\xA7\xF7\xFBk\xB9Z\x91L\xCDO\xD0\xF8r\xD7|iA\xE3\xFB\xFD\xABV[C(\xA8\x83\xA4\xEC\xD2d\x871\xFA\xF7\xF4\xC5C MK\xAA\xCB]\xA3\xEDU\xEB#%xO\xDF(\x9A\x99\xD1G@\xD7!y\x90\xD9\xF0\xB5<\xD2'}\xA1\x94!\x81E\xC3\xEB\xAD\xF6\xAB\xBE\x96W\xDD\xF8 -\xCDw,\xDF%\xA5'\xD5B-\xF3\xF8\xF8һ\xA9E\xEC\xF5[\xFA\xBA\xFE\x90*K\xBA\xE254YI+\xF5)<ү\x96c\x95pI\xB3\xA54\xAD\xD6\xBE\x85K\xAF|iH\xF6S\x837\xD5%\xCD\xD5\xD0\xC7M\x8F\xD2ȳ&7\xF2]=\xFB\xE2U5V]z!\xB5Hzn\x99\xFBZ)\x9A\xACvi\xA1\xA2\xDE,ǚ5\xAEL\x91F{e-m֛k\xA1\xA2F֊\xC4T\xB39o\xBFICk\xB3\xCB1\xC7r\xF1\xA1\x97\xD0\xF34i%\xA4\xCAHӫ\x8F*\xB9\x89&\x86z\x87W\xE0\xDA%\xB0\xCB -9\xAE5\xF7a\xB7\xEB\xE9\xB1غ\x97>\xAFKFR\xD5\xECV\xBB\xFF\xD2:t&+\xD4y]\xFA\x96[FO\xB8_z#\x95\xAD!J\xAC\xE6\xDBg\x9ET\xB4\x90\xA8\xA1~[r%\xC5\xEF=\xA4a\xA3\xA5&=K\xB0h\xF7wɑ~\xACJX\xA3]\xD7*i\xBAL\xAB\xB8_r\x8F\xA1\xE5b\x93rN҂\xEC\xF1I\xEF+D\xD1\x8Cl\xCD$"\x97$\xFA\xBAl\xF8IP\xABG\x85,Y\xB9l\xA1\x85(\x97\x86\xDFK\xB1\xFB\xA5%B\xE9U4 -\xF2\xBA\xA4Zܟ\xC3+\xE9iTM\x9B\xE49]\xE6\xFE\x9C\x84\xF1\xB1FTߤXW됰d\xBB[\xB2 \xA0\x8Cұ\xD6MId#\xAA\xAD\xE7jw냀Fhy\xAE\xB1\xCA\xC6\xD4b\x9CO/\xBD\xA1@Ib[M\x87\xF5\xB0"D\xC3h\xED\x80-\x8C
Revision: 8673 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8673&view=rev Author: efiring Date: 2010年09月01日 19:44:36 +0000 (2010年9月01日) Log Message: ----------- [3054467] fix bug in PatchCollection; restore attribute access to Patch.fill Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/collections.py branches/v1_0_maint/lib/matplotlib/patches.py Modified: branches/v1_0_maint/lib/matplotlib/collections.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/collections.py 2010年08月30日 15:20:42 UTC (rev 8672) +++ branches/v1_0_maint/lib/matplotlib/collections.py 2010年09月01日 19:44:36 UTC (rev 8673) @@ -1034,7 +1034,7 @@ if match_original: def determine_facecolor(patch): - if patch.fill: + if patch.get_fill(): return patch.get_facecolor() return [0, 0, 0, 0] Modified: branches/v1_0_maint/lib/matplotlib/patches.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/patches.py 2010年08月30日 15:20:42 UTC (rev 8672) +++ branches/v1_0_maint/lib/matplotlib/patches.py 2010年09月01日 19:44:36 UTC (rev 8673) @@ -312,13 +312,18 @@ ACCEPTS: [True | False] """ - self._fill = b + self._fill = bool(b) self.set_facecolor(self._original_facecolor) def get_fill(self): 'return whether fill is set' return self._fill + # Make fill a property so as to preserve the long-standing + # but somewhat inconsistent behavior in which fill was an + # attribute. + fill = property(get_fill, set_fill) + def set_hatch(self, hatch): """ Set the hatching pattern This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8725 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8725&view=rev Author: efiring Date: 2010年10月03日 21:17:39 +0000 (2010年10月03日) Log Message: ----------- bugfix: applied patch by Stan West to fix error in colormap reversal Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/_cm.py branches/v1_0_maint/lib/matplotlib/cm.py Modified: branches/v1_0_maint/lib/matplotlib/_cm.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/_cm.py 2010年10月03日 21:04:10 UTC (rev 8724) +++ branches/v1_0_maint/lib/matplotlib/_cm.py 2010年10月03日 21:17:39 UTC (rev 8725) @@ -1554,7 +1554,7 @@ (0.000, 0.000, 0.000), (0.0547, 1.000, 1.000), (0.250, 0.027, 0.250), #(0.2500, 0.250, 0.250), (1.000, 1.000, 1.000)), - 'green': ((0, 0, 0), (1, 1, 0)), + 'green': ((0, 0, 0), (1, 1, 1)), 'blue': ( (0.000, 0.000, 0.000), (0.500, 1.000, 1.000), (0.735, 0.000, 0.000), (1.000, 1.000, 1.000)) Modified: branches/v1_0_maint/lib/matplotlib/cm.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/cm.py 2010年10月03日 21:04:10 UTC (rev 8724) +++ branches/v1_0_maint/lib/matplotlib/cm.py 2010年10月03日 21:17:39 UTC (rev 8725) @@ -34,7 +34,8 @@ # each time, so the colors are identical # and the result is shades of gray. else: - valnew = [(1.0 - a, b, c) for a, b, c in reversed(val)] + # Flip x and exchange the y values facing x = 0 and x = 1. + valnew = [(1.0 - x, y1, y0) for x, y0, y1 in reversed(val)] data_r[key] = valnew return data_r This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8756 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8756&view=rev Author: mdboom Date: 2010年10月19日 14:16:23 +0000 (2010年10月19日) Log Message: ----------- Fix LogFormatter, as reported by G?195円?182円khan Sever Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/symlog.pdf branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/symlog.png branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/symlog.svg branches/v1_0_maint/lib/matplotlib/ticker.py Modified: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/symlog.pdf =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/symlog.png =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/symlog.svg =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/symlog.svg 2010年10月19日 12:44:14 UTC (rev 8755) +++ branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/symlog.svg 2010年10月19日 14:16:23 UTC (rev 8756) @@ -11,12 +11,12 @@ <g id="figure1"> <g id="patch1"> <path style="fill: #ffffff; stroke: #ffffff; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M0.000000 432.000000L576.000000 432.000000L576.000000 0.000000 -L0.000000 0.000000L0.000000 432.000000"/> +L0.000000 0.000000z"/> </g> <g id="axes1"> <g id="patch2"> <path style="fill: #ffffff; opacity: 1.000000" d="M72.000000 388.800000L518.400000 388.800000L518.400000 43.200000 -L72.000000 43.200000L72.000000 388.800000"/> +L72.000000 43.200000z"/> </g> <g id="line2d1"> <defs> @@ -136,12 +136,9 @@ <g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="518.400000" y="381.525282"/> </g></g> <g id="text7"> -<defs> -<path id="c_f47f2818876b2f1a61c47f270461e46e" d="M25.000000 2.203125q-12.250000 0.000000 -16.671875 -10.078125q-4.421875 -10.093750 -4.421875 -24.015625q0.000000 -8.687500 1.578125 -16.343750q1.593750 -7.671875 6.296875 -13.015625q4.718750 -5.359375 13.218750 -5.359375q6.593750 0.000000 10.781250 3.234375q4.203125 3.218750 6.406250 8.328125q2.203125 5.093750 3.000000 10.937500q0.812500 5.828125 0.812500 12.218750q0.000000 8.593750 -1.593750 16.093750q-1.578125 7.500000 -6.218750 12.750000q-4.640625 5.250000 -13.187500 5.250000M25.000000 -0.390625q5.562500 0.000000 8.296875 -5.703125q2.734375 -5.718750 3.375000 -12.656250q0.640625 -6.937500 0.640625 -14.750000q0.000000 -7.515625 -0.640625 -13.859375q-0.640625 -6.359375 -3.359375 -11.500000q-2.703125 -5.156250 -8.312500 -5.156250q-5.656250 0.000000 -8.390625 5.187500q-2.734375 5.171875 -3.375000 11.500000q-0.640625 6.312500 -0.640625 13.828125q0.000000 5.562500 0.265625 10.500000q0.281250 4.937500 1.453125 10.187500q1.171875 5.250000 3.781250 8.843750q2.609375 3.578125 6.906250 3.578125"/> -</defs> <g id="mathtext1"> -<g style="fill: #000000" transform="translate(62.000000,386.025282)"> -<use xlink:href="#c_f47f2818876b2f1a61c47f270461e46e" transform="translate(0.000000,-1.000000)scale(0.120000)"/> +<g style="fill: #000000" transform="translate(60.000000,386.525282)"> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" transform="translate(0.000000,-1.093750)scale(0.120000)"/> </g> </g> </g> Modified: branches/v1_0_maint/lib/matplotlib/ticker.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/ticker.py 2010年10月19日 12:44:14 UTC (rev 8755) +++ branches/v1_0_maint/lib/matplotlib/ticker.py 2010年10月19日 14:16:23 UTC (rev 8756) @@ -608,7 +608,7 @@ sign = np.sign(x) # only label the decades fx = math.log(abs(x))/math.log(b) - isDecade = is_decade(fx) + isDecade = is_close_to_int(fx) if not isDecade and self.labelOnlyBase: s = '' #if 0: pass elif fx>10000: s= '%1.0e'%fx @@ -630,15 +630,18 @@ def __call__(self, x, pos=None): 'Return the format for tick val *x* at position *pos*' b = self._base + usetex = rcParams['text.usetex'] + # only label the decades if x == 0: - return '0ドル$' + if usetex: + return '0ドル$' + else: + return '$\mathdefault{0}$' sign = np.sign(x) fx = math.log(abs(x))/math.log(b) - isDecade = is_decade(fx) + isDecade = is_close_to_int(fx) - usetex = rcParams['text.usetex'] - if sign == -1: sign_string = '-' else: @@ -1187,13 +1190,18 @@ else: return long(x-0.5) def is_decade(x, base=10): -y if not np.isfinite(x): + if not np.isfinite(x): return False if x == 0.0: return True lx = math.log(x)/math.log(base) - return abs(lx - nearest_long(lx)) < 1e-10 + return is_close_to_int(lx) +def is_close_to_int(x): + if not np.isfinite(x): + return False + return abs(x - nearest_long(x)) < 1e-10 + class LogLocator(Locator): """ Determine the tick locations for log axes This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 8920 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8920&view=rev Author: efiring Date: 2011年01月16日 01:00:37 +0000 (2011年1月16日) Log Message: ----------- Change pcolor and contourf default antialiasing to False; closes 3151847. To avoid misplaced boundaries and artifacts with alpha < 1, we do not stroke the pcolor and contourf patch boundaries by default; but without that stroking, antialiasing produces boundary artifacts that tend to be visually disturbing. Therefore we sacrifice antialiasing for these patches. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/axes.py branches/v1_0_maint/lib/matplotlib/contour.py Modified: branches/v1_0_maint/lib/matplotlib/axes.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/axes.py 2011年01月15日 19:49:09 UTC (rev 8919) +++ branches/v1_0_maint/lib/matplotlib/axes.py 2011年01月16日 01:00:37 UTC (rev 8920) @@ -6921,14 +6921,14 @@ %(PolyCollection)s - Note: the default *antialiaseds* is taken from + Note: the default *antialiaseds* is False if the default + *edgecolors*="none" is used. This eliminates artificial lines + at patch boundaries, and works regardless of the value of + alpha. If *edgecolors* is not "none", then the default + *antialiaseds* is taken from rcParams['patch.antialiased'], which defaults to *True*. - In some cases, particularly if *alpha* is 1, - you may be able to reduce rendering artifacts (light or - dark patch boundaries) by setting it to *False*. An - alternative it to set *edgecolors* to 'face'. Unfortunately, - there seems to be no single combination of parameters that - eliminates artifacts under all conditions. + Stroking the edges may be preferred if *alpha* is 1, but + will cause artifacts otherwise. """ @@ -6977,22 +6977,29 @@ C = compress(ravelmask, ma.filled(C[0:Ny-1,0:Nx-1]).ravel()) + linewidths = (0.25,) + if 'linewidth' in kwargs: + kwargs['linewidths'] = kwargs.pop('linewidth') + kwargs.setdefault('linewidths', linewidths) + if shading == 'faceted': edgecolors = 'k', else: edgecolors = 'none' - linewidths = (0.25,) - # Not sure if we want to have the following, or just trap - # invalid kwargs and raise an exception. if 'edgecolor' in kwargs: kwargs['edgecolors'] = kwargs.pop('edgecolor') - if 'linewidth' in kwargs: - kwargs['linewidths'] = kwargs.pop('linewidth') + ec = kwargs.setdefault('edgecolors', edgecolors) + + # aa setting will default via collections to patch.antialiased + # unless the boundary is not stroked, in which case the + # default will be False; with unstroked boundaries, aa + # makes artifacts that are often disturbing. if 'antialiased' in kwargs: kwargs['antialiaseds'] = kwargs.pop('antialiased') - kwargs.setdefault('edgecolors', edgecolors) - kwargs.setdefault('linewidths', linewidths) + if 'antialiaseds' not in kwargs and ec.lower() == "none": + kwargs['antialiaseds'] = False + collection = mcoll.PolyCollection(verts, **kwargs) collection.set_alpha(alpha) Modified: branches/v1_0_maint/lib/matplotlib/contour.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/contour.py 2011年01月15日 19:49:09 UTC (rev 8919) +++ branches/v1_0_maint/lib/matplotlib/contour.py 2011年01月16日 01:00:37 UTC (rev 8920) @@ -662,7 +662,14 @@ self.colors = kwargs.get('colors', None) norm = kwargs.get('norm', None) self.extend = kwargs.get('extend', 'neither') - self.antialiased = kwargs.get('antialiased', True) + self.antialiased = kwargs.get('antialiased', None) + if self.antialiased is None and self.filled: + self.antialiased = False # eliminate artifacts; we are not + # stroking the boundaries. + # The default for line contours will be taken from + # the LineCollection default, which uses the + # rcParams['lines.antialiased'] + self.nchunk = kwargs.get('nchunk', 0) self.locator = kwargs.get('locator', None) if (isinstance(norm, colors.LogNorm) @@ -734,11 +741,15 @@ tlinewidths = self._process_linewidths() self.tlinewidths = tlinewidths tlinestyles = self._process_linestyles() + aa = self.antialiased + if aa is not None: + aa = (self.antialiased,) for level, width, lstyle, segs in \ zip(self.levels, tlinewidths, tlinestyles, self.allsegs): # Default zorder taken from LineCollection zorder = kwargs.get('zorder', 2) col = collections.LineCollection(segs, + antialiaseds = aa, linewidths = width, linestyle = lstyle, alpha=self.alpha, @@ -1358,6 +1369,10 @@ Override axis units by specifying an instance of a :class:`matplotlib.units.ConversionInterface`. + *antialiased*: [ True | False ] + enable antialiasing, overriding the defaults. For + filled contours, the default is True. For line contours, + it is taken from rcParams['lines.antialiased']. contour-only keyword arguments: @@ -1385,9 +1400,6 @@ contourf-only keyword arguments: - *antialiased*: [ True | False ] - enable antialiasing - *nchunk*: [ 0 | integer ] If 0, no subdivision of the domain. Specify a positive integer to divide the domain into subdomains of roughly *nchunk* by *nchunk* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.