|
From: <ef...@us...> - 2010-07-16 20:45:00
|
Revision: 8562
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8562&view=rev
Author: efiring
Date: 2010-07-16 20:44:52 +0000 (Fri, 16 Jul 2010)
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.
|
|
From: <md...@us...> - 2010-07-23 16:45:31
|
Revision: 8570
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8570&view=rev
Author: mdboom
Date: 2010-07-23 16:45:24 +0000 (Fri, 23 Jul 2010)
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,
+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...
[truncated message content] |
|
From: <ef...@us...> - 2010-07-24 22:00:02
|
Revision: 8573
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8573&view=rev
Author: efiring
Date: 2010-07-24 21:59:55 +0000 (Sat, 24 Jul 2010)
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.
|
|
From: <ef...@us...> - 2010-07-26 19:14:22
|
Revision: 8579
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8579&view=rev
Author: efiring
Date: 2010-07-26 19:14:16 +0000 (Mon, 26 Jul 2010)
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.
|
|
From: <md...@us...> - 2010-07-28 19:19:33
|
Revision: 8590
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8590&view=rev
Author: mdboom
Date: 2010-07-28 19:19:27 +0000 (Wed, 28 Jul 2010)
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.
|
|
From: <wea...@us...> - 2010-07-29 16:16:24
|
Revision: 8593
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8593&view=rev
Author: weathergod
Date: 2010-07-29 16:16:17 +0000 (Thu, 29 Jul 2010)
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.
|
|
From: <md...@us...> - 2010-07-30 18:56:24
|
Revision: 8601
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8601&view=rev
Author: mdboom
Date: 2010-07-30 18:56:18 +0000 (Fri, 30 Jul 2010)
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.
|
|
From: <md...@us...> - 2010-08-02 12:30:55
|
Revision: 8612
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8612&view=rev
Author: mdboom
Date: 2010-08-02 12:30:48 +0000 (Mon, 02 Aug 2010)
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...
[truncated message content] |
|
From: <md...@us...> - 2010-08-18 17:00:36
|
Revision: 8649
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8649&view=rev
Author: mdboom
Date: 2010-08-18 17:00:29 +0000 (Wed, 18 Aug 2010)
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.
|
|
From: <md...@us...> - 2010-08-18 17:35:34
|
Revision: 8650
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8650&view=rev
Author: mdboom
Date: 2010-08-18 17:35:26 +0000 (Wed, 18 Aug 2010)
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냀Fhʸ\xAE\xB1\xCA\xC6\xD4b\x9CO/\xBD\xA1@Ib[M\x87\xF5\xB0"D\xC3h\xED\x80-\x8C |
|
From: <ef...@us...> - 2010-09-01 19:44:43
|
Revision: 8673
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8673&view=rev
Author: efiring
Date: 2010-09-01 19:44:36 +0000 (Wed, 01 Sep 2010)
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.
|
|
From: <ef...@us...> - 2010-10-03 21:17:46
|
Revision: 8725
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8725&view=rev
Author: efiring
Date: 2010-10-03 21:17:39 +0000 (Sun, 03 Oct 2010)
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.
|
|
From: <md...@us...> - 2010-10-19 14:16:30
|
Revision: 8756
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8756&view=rev
Author: mdboom
Date: 2010-10-19 14:16:23 +0000 (Tue, 19 Oct 2010)
Log Message:
-----------
Fix LogFormatter, as reported by G?\195?\182khan 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.
|
|
From: <ef...@us...> - 2011-01-16 01:00:43
|
Revision: 8920
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8920&view=rev
Author: efiring
Date: 2011-01-16 01:00:37 +0000 (Sun, 16 Jan 2011)
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.
|