You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(115) |
Aug
(120) |
Sep
(137) |
Oct
(170) |
Nov
(461) |
Dec
(263) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(120) |
Feb
(74) |
Mar
(35) |
Apr
(74) |
May
(245) |
Jun
(356) |
Jul
(240) |
Aug
(115) |
Sep
(78) |
Oct
(225) |
Nov
(98) |
Dec
(271) |
2009 |
Jan
(132) |
Feb
(84) |
Mar
(74) |
Apr
(56) |
May
(90) |
Jun
(79) |
Jul
(83) |
Aug
(296) |
Sep
(214) |
Oct
(76) |
Nov
(82) |
Dec
(66) |
2010 |
Jan
(46) |
Feb
(58) |
Mar
(51) |
Apr
(77) |
May
(58) |
Jun
(126) |
Jul
(128) |
Aug
(64) |
Sep
(50) |
Oct
(44) |
Nov
(48) |
Dec
(54) |
2011 |
Jan
(68) |
Feb
(52) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2018 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
|
|
|
|
|
|
1
(4) |
2
|
3
(8) |
4
(16) |
5
(40) |
6
(16) |
7
(9) |
8
(15) |
9
(6) |
10
(4) |
11
(28) |
12
(6) |
13
(2) |
14
(7) |
15
(8) |
16
|
17
|
18
(9) |
19
(2) |
20
(7) |
21
(3) |
22
(6) |
23
(25) |
24
(16) |
25
(8) |
26
(7) |
27
(3) |
28
(1) |
29
(4) |
30
(21) |
31
(15) |
|
|
|
|
|
Revision: 7596 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7596&view=rev Author: efiring Date: 2009年08月30日 06:29:58 +0000 (2009年8月30日) Log Message: ----------- New version of empty_datetime.png; it is not clear what caused the change, but the new version is nicer, so let's hope it is produced consistently now. The difference is that there is no x ticklabel on the far left. Modified Paths: -------------- trunk/matplotlib/test/test_matplotlib/baseline/TestAxes/empty_datetime.png Modified: trunk/matplotlib/test/test_matplotlib/baseline/TestAxes/empty_datetime.png =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7595 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7595&view=rev Author: astraw Date: 2009年08月30日 04:44:28 +0000 (2009年8月30日) Log Message: ----------- testing: add support for KnownFailures Modified Paths: -------------- trunk/matplotlib/CHANGELOG trunk/matplotlib/setup.py trunk/matplotlib/test/mplTest/MplNosePlugin.py trunk/matplotlib/test/run-mpl-test.py trunk/matplotlib/test/test_matplotlib/TestAxes.py Added Paths: ----------- trunk/matplotlib/lib/matplotlib/testing/ trunk/matplotlib/lib/matplotlib/testing/__init__.py trunk/matplotlib/lib/matplotlib/testing/decorators.py trunk/matplotlib/lib/matplotlib/testing/noseclasses.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2009年08月30日 04:44:11 UTC (rev 7594) +++ trunk/matplotlib/CHANGELOG 2009年08月30日 04:44:28 UTC (rev 7595) @@ -1,3 +1,7 @@ +2009年08月29日 Added matplotlib.testing package, which contains a Nose + plugin and a decorator that lets tests be marked as + KnownFailures - ADS + 2009年08月20日 Added scaled dict to AutoDateFormatter for customized scales - JDH Added: trunk/matplotlib/lib/matplotlib/testing/decorators.py =================================================================== --- trunk/matplotlib/lib/matplotlib/testing/decorators.py (rev 0) +++ trunk/matplotlib/lib/matplotlib/testing/decorators.py 2009年08月30日 04:44:28 UTC (rev 7595) @@ -0,0 +1,24 @@ +from matplotlib.testing.noseclasses import KnownFailureTest +import sys + +def knownfailureif(fail_condition, msg=None): + # based on numpy.testing.dec.knownfailureif + if msg is None: + msg = 'Test known to fail' + def known_fail_decorator(f): + # Local import to avoid a hard nose dependency and only incur the + # import time overhead at actual test-time. + import nose + def failer(*args, **kwargs): + try: + # Always run the test (to generate images). + result = f(*args, **kwargs) + except: + if fail_condition: + raise KnownFailureTest(msg) + else: + raise + # Fixme: Should raise KnownFailureDidNotFail if fail_condition==True? + return result + return nose.tools.make_decorator(f)(failer) + return known_fail_decorator Added: trunk/matplotlib/lib/matplotlib/testing/noseclasses.py =================================================================== --- trunk/matplotlib/lib/matplotlib/testing/noseclasses.py (rev 0) +++ trunk/matplotlib/lib/matplotlib/testing/noseclasses.py 2009年08月30日 04:44:28 UTC (rev 7595) @@ -0,0 +1,41 @@ +import os +from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin + +class KnownFailureTest(Exception): + '''Raise this exception to mark a test as a known failing test.''' + pass + +class KnownFailure(ErrorClassPlugin): + '''Plugin that installs a KNOWNFAIL error class for the + KnownFailureClass exception. When KnownFailureTest is raised, + the exception will be logged in the knownfail attribute of the + result, 'K' or 'KNOWNFAIL' (verbose) will be output, and the + exception will not be counted as an error or failure. + + This is based on numpy.testing.noseclasses.KnownFailure. + ''' + enabled = True + knownfail = ErrorClass(KnownFailureTest, + label='KNOWNFAIL', + isfailure=False) + + def options(self, parser, env=os.environ): + env_opt = 'NOSE_WITHOUT_KNOWNFAIL' + parser.add_option('--no-knownfail', action='store_true', + dest='noKnownFail', default=env.get(env_opt, False), + help='Disable special handling of KnownFailureTest ' + 'exceptions') + + def configure(self, options, conf): + if not self.can_configure: + return + self.conf = conf + disable = getattr(options, 'noKnownFail', False) + if disable: + self.enabled = False + + def addError( self, test, err ): + # Fixme (Really weird): if I don't leave empty method here, + # nose gets confused and KnownFails become testing errors when + # using the MplNosePlugin and MplTestCase. + pass Modified: trunk/matplotlib/setup.py =================================================================== --- trunk/matplotlib/setup.py 2009年08月30日 04:44:11 UTC (rev 7594) +++ trunk/matplotlib/setup.py 2009年08月30日 04:44:28 UTC (rev 7595) @@ -50,6 +50,7 @@ 'matplotlib', 'matplotlib.backends', 'matplotlib.projections', + 'matplotlib.testing', # 'matplotlib.toolkits', 'mpl_toolkits', 'mpl_toolkits.mplot3d', Modified: trunk/matplotlib/test/mplTest/MplNosePlugin.py =================================================================== --- trunk/matplotlib/test/mplTest/MplNosePlugin.py 2009年08月30日 04:44:11 UTC (rev 7594) +++ trunk/matplotlib/test/mplTest/MplNosePlugin.py 2009年08月30日 04:44:28 UTC (rev 7595) @@ -12,6 +12,7 @@ from path_utils import * import directories as dirs from MplTestCase import MplTestCase +from matplotlib.testing.noseclasses import KnownFailureTest #======================================================================= @@ -48,7 +49,8 @@ TEST_ERRORED = -1 TEST_FAILED = 0 - TEST_PASSED = 1 + TEST_KNOWN_FAILED = 1 + TEST_PASSED = 2 #-------------------------------------------------------------------- # Some 'property' functions @@ -148,7 +150,11 @@ err : 3-tuple sys.exc_info() tuple """ - self.testResults.append( (test, self.TEST_ERRORED, err) ) + (type, value, traceback) = err + if isinstance(value,KnownFailureTest): + self.testResults.append( (test, self.TEST_KNOWN_FAILED, err) ) + else: + self.testResults.append( (test, self.TEST_ERRORED, err) ) #-------------------------------------------------------------------- def addFailure( self, test, err ): Modified: trunk/matplotlib/test/run-mpl-test.py =================================================================== --- trunk/matplotlib/test/run-mpl-test.py 2009年08月30日 04:44:11 UTC (rev 7594) +++ trunk/matplotlib/test/run-mpl-test.py 2009年08月30日 04:44:28 UTC (rev 7595) @@ -44,6 +44,7 @@ import nose from mplTest import MplNosePlugin, path_utils +from matplotlib.testing.noseclasses import KnownFailure if '--clean' in args: # perform the cleaning process and exit @@ -90,7 +91,7 @@ ### Run nose success = nose.run( argv = args, - plugins = [ MplNosePlugin() ] ) + plugins = [ MplNosePlugin(), KnownFailure() ] ) ### do other stuff here Modified: trunk/matplotlib/test/test_matplotlib/TestAxes.py =================================================================== --- trunk/matplotlib/test/test_matplotlib/TestAxes.py 2009年08月30日 04:44:11 UTC (rev 7594) +++ trunk/matplotlib/test/test_matplotlib/TestAxes.py 2009年08月30日 04:44:28 UTC (rev 7595) @@ -3,6 +3,7 @@ #======================================================================= from mplTest import MplTestCase, units +from matplotlib.testing.decorators import knownfailureif #======================================================================= # Add import modules below. @@ -57,6 +58,7 @@ self.checkImage( fname ) #-------------------------------------------------------------------- + @knownfailureif(True, "Fails due to SF bug 2846058") def test_formatter_ticker( self ): """Test Some formatter and ticker issues.""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7594 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7594&view=rev Author: astraw Date: 2009年08月30日 04:44:11 +0000 (2009年8月30日) Log Message: ----------- buildbot: wipe build directory to ensure clean rebuilds Modified Paths: -------------- trunk/matplotlib/test/_buildbot_install.py Modified: trunk/matplotlib/test/_buildbot_install.py =================================================================== --- trunk/matplotlib/test/_buildbot_install.py 2009年08月30日 04:44:03 UTC (rev 7593) +++ trunk/matplotlib/test/_buildbot_install.py 2009年08月30日 04:44:11 UTC (rev 7594) @@ -10,6 +10,11 @@ if os.path.exists(TARGET): shutil.rmtree(TARGET) +if 1: + build_path = 'build' + if os.path.exists(build_path): + shutil.rmtree(build_path) + check_call('virtualenv %s'%(TARGET,)) TARGET_py = os.path.join(TARGET,'bin','python') check_call('%s setup.py install'%TARGET_py) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7593 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7593&view=rev Author: astraw Date: 2009年08月30日 04:44:03 +0000 (2009年8月30日) Log Message: ----------- fix typo Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/cbook.py Modified: trunk/matplotlib/lib/matplotlib/cbook.py =================================================================== --- trunk/matplotlib/lib/matplotlib/cbook.py 2009年08月30日 04:43:54 UTC (rev 7592) +++ trunk/matplotlib/lib/matplotlib/cbook.py 2009年08月30日 04:44:03 UTC (rev 7593) @@ -910,7 +910,7 @@ def get_recursive_filelist(args): """ - Recurs all the files and dirs in *args* ignoring symbolic links + Recurse all the files and dirs in *args* ignoring symbolic links and return the files as a list of strings """ files = [] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7592 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7592&view=rev Author: astraw Date: 2009年08月30日 04:43:54 +0000 (2009年8月30日) Log Message: ----------- testing: use standard nose mechanism for printing test name Modified Paths: -------------- trunk/matplotlib/test/_buildbot_test.py trunk/matplotlib/test/mplTest/MplNosePlugin.py Modified: trunk/matplotlib/test/_buildbot_test.py =================================================================== --- trunk/matplotlib/test/_buildbot_test.py 2009年08月30日 03:45:21 UTC (rev 7591) +++ trunk/matplotlib/test/_buildbot_test.py 2009年08月30日 04:43:54 UTC (rev 7592) @@ -13,5 +13,5 @@ TARGET_py = os.path.join(TARGET,'bin','python') check_call('%s -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)"'%TARGET_py) -check_call('%s run-mpl-test.py --all --keep-failed'%TARGET_py, +check_call('%s run-mpl-test.py --verbose --all --keep-failed'%TARGET_py, cwd='test') Modified: trunk/matplotlib/test/mplTest/MplNosePlugin.py =================================================================== --- trunk/matplotlib/test/mplTest/MplNosePlugin.py 2009年08月30日 03:45:21 UTC (rev 7591) +++ trunk/matplotlib/test/mplTest/MplNosePlugin.py 2009年08月30日 04:43:54 UTC (rev 7592) @@ -702,10 +702,6 @@ rmdir( self.outputDir ) mkdir( self.outputDir, recursive = True ) - # sys.stdout.write( "%s\n %s \n" % (test.id(), test.shortDescription()) ) - print "%s" % (test.id()) - print " %s" % (test.shortDescription()) - #-------------------------------------------------------------------- def stopContext( self, context ): """Called after the tests in a context have run and the context has been This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7591 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7591&view=rev Author: jdh2358 Date: 2009年08月30日 03:45:21 +0000 (2009年8月30日) Log Message: ----------- Merged revisions 7589 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7589 | jdh2358 | 2009年08月29日 22:40:08 -0500 (2009年8月29日) | 1 line added minor kwarg to get_?ticklines and applied ginpu patch ........ Modified Paths: -------------- trunk/matplotlib/doc/users/license.rst trunk/matplotlib/lib/matplotlib/blocking_input.py trunk/matplotlib/lib/matplotlib/figure.py Property Changed: ---------------- trunk/matplotlib/ Property changes on: trunk/matplotlib ___________________________________________________________________ Modified: svnmerge-integrated - /branches/mathtex:1-7263 /branches/v0_98_5_maint:1-7253 /branches/v0_99_maint:1-7584 + /branches/mathtex:1-7263 /branches/v0_98_5_maint:1-7253 /branches/v0_99_maint:1-7590 Modified: trunk/matplotlib/doc/users/license.rst =================================================================== --- trunk/matplotlib/doc/users/license.rst 2009年08月30日 03:44:06 UTC (rev 7590) +++ trunk/matplotlib/doc/users/license.rst 2009年08月30日 03:45:21 UTC (rev 7591) @@ -28,7 +28,7 @@ derivative works, distribute, and otherwise use matplotlib |version| alone or in any derivative version, provided, however, that JDH's License Agreement and JDH's notice of copyright, i.e., "Copyright (c) -2002-2008 John D. Hunter; All Rights Reserved" are retained in +2002-2009 John D. Hunter; All Rights Reserved" are retained in matplotlib |version| alone or in any derivative version prepared by Licensee. Modified: trunk/matplotlib/lib/matplotlib/blocking_input.py =================================================================== --- trunk/matplotlib/lib/matplotlib/blocking_input.py 2009年08月30日 03:44:06 UTC (rev 7590) +++ trunk/matplotlib/lib/matplotlib/blocking_input.py 2009年08月30日 03:45:21 UTC (rev 7591) @@ -114,15 +114,25 @@ Class that creates a callable object to retrieve mouse clicks in a blocking way. - This class will also retrieve keyboard clicks and treat them like + This class will also retrieve keyboard clicks and treat them like appropriate mouse clicks (delete and backspace are like mouse button 3, enter is like mouse button 2 and all others are like mouse button 1). """ - def __init__(self, fig): + + button_add = 1 + button_pop = 3 + button_stop = 2 + + def __init__(self, fig, mouse_add=1, mouse_pop=3, mouse_stop=2): BlockingInput.__init__(self, fig=fig, eventslist=('button_press_event', 'key_press_event') ) + self.button_add = mouse_add + self.button_pop = mouse_pop + self.button_stop= mouse_stop + + def post_event(self): """ This will be called to process events @@ -133,19 +143,19 @@ self.key_event() else: self.mouse_event() - + def mouse_event(self): '''Process a mouse click event''' event = self.events[-1] button = event.button - if button == 3: - self.button3(event) - elif button == 2: - self.button2(event) + if button == self.button_pop: + self.mouse_event_pop(event,-1) + elif button == self.button_stop: + self.mouse_event_stop(event) else: - self.button1(event) + self.mouse_event_add(event) def key_event(self): ''' @@ -154,16 +164,16 @@ ''' event = self.events[-1] - key = event.key + key = event.key.lower() - if key == 'backspace' or key == 'delete': - self.button3(event) - elif key == 'enter': - self.button2(event) + if key in ['backspace', 'delete']: + self.mouse_event_pop(event) + elif key in ['escape', 'enter']: # on windows XP and wxAgg, the enter key doesn't seem to register + self.mouse_event_stop(event) else: - self.button1(event) + self.mouse_event_add(event) - def button1( self, event ): + def mouse_event_add( self, event ): """ Will be called for any event involving a button other than button 2 or 3. This will add a click if it is inside axes. @@ -171,34 +181,34 @@ if event.inaxes: self.add_click(event) else: # If not a valid click, remove from event list - BlockingInput.pop(self) + BlockingInput.pop(self,-1) - def button2( self, event ): + def mouse_event_stop( self, event ): """ Will be called for any event involving button 2. Button 2 ends blocking input. """ # Remove last event just for cleanliness - BlockingInput.pop(self) + BlockingInput.pop(self,-1) # This will exit even if not in infinite mode. This is # consistent with matlab and sometimes quite useful, but will # require the user to test how many points were actually # returned before using data. - self.fig.canvas.stop_event_loop() + self.fig.canvas.stop_event_loop(event) - def button3( self, event ): + def mouse_event_pop( self, event ): """ Will be called for any event involving button 3. Button 3 removes the last click. """ # Remove this last event - BlockingInput.pop(self) + BlockingInput.pop(self,-1) # Now remove any existing clicks if possible if len(self.events)>0: - self.pop() + self.pop(event,-1) def add_click(self,event): """ @@ -211,11 +221,23 @@ # If desired plot up click if self.show_clicks: + + # make sure we don't mess with the axes zoom + xlim = event.inaxes.get_xlim() + ylim = event.inaxes.get_ylim() + + # plot the clicks self.marks.extend( event.inaxes.plot([event.xdata,], [event.ydata,], 'r+') ) + + # before we draw, make sure to reset the limits + event.inaxes.set_xlim(xlim) + event.inaxes.set_ylim(ylim) self.fig.canvas.draw() - def pop_click(self,index=-1): + + + def pop_click(self,event,index=-1): """ This removes a click from the list of clicks. Defaults to removing the last click. @@ -223,25 +245,49 @@ self.clicks.pop(index) if self.show_clicks: + + # make sure we don't mess with the axes zoom + xlim = event.inaxes.get_xlim() + ylim = event.inaxes.get_ylim() + mark = self.marks.pop(index) mark.remove() + + # before we draw, make sure to reset the limits + event.inaxes.set_xlim(xlim) + event.inaxes.set_ylim(ylim) self.fig.canvas.draw() + # NOTE: I do NOT understand why the above 3 lines does not work + # for the keyboard backspace event on windows XP wxAgg. + # maybe event.inaxes here is a COPY of the actual axes? - def pop(self,index=-1): + + def pop(self,event,index=-1): """ This removes a click and the associated event from the object. Defaults to removing the last click, but any index can be supplied. """ - self.pop_click(index) + self.pop_click(event,index) BlockingInput.pop(self,index) - def cleanup(self): + def cleanup(self,event=None): # clean the figure if self.show_clicks: + if event: + # make sure we don't mess with the axes zoom + xlim = event.inaxes.get_xlim() + ylim = event.inaxes.get_ylim() + for mark in self.marks: mark.remove() self.marks = [] + + if event: + # before we draw, make sure to reset the limits + event.inaxes.set_xlim(xlim) + event.inaxes.set_ylim(ylim) + self.fig.canvas.draw() # Call base class to remove callbacks Modified: trunk/matplotlib/lib/matplotlib/figure.py =================================================================== --- trunk/matplotlib/lib/matplotlib/figure.py 2009年08月30日 03:44:06 UTC (rev 7590) +++ trunk/matplotlib/lib/matplotlib/figure.py 2009年08月30日 03:45:21 UTC (rev 7591) @@ -1095,11 +1095,12 @@ ax.update_params() ax.set_position(ax.figbox) - def ginput(self, n=1, timeout=30, show_clicks=True): + def ginput(self, n=1, timeout=30, show_clicks=True, mouse_add=1, mouse_pop=3, mouse_stop=2): """ call signature:: - ginput(self, n=1, timeout=30, show_clicks=True) + ginput(self, n=1, timeout=30, show_clicks=True, + mouse_add=1, mouse_pop=3, mouse_stop=2) Blocking call to interact with the figure. @@ -1120,7 +1121,9 @@ manager) selects a point. """ - blocking_mouse_input = BlockingMouseInput(self) + blocking_mouse_input = BlockingMouseInput(self, mouse_add =mouse_add, + mouse_pop =mouse_pop, + mouse_stop=mouse_stop) return blocking_mouse_input(n=n, timeout=timeout, show_clicks=show_clicks) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7590 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7590&view=rev Author: jdh2358 Date: 2009年08月30日 03:44:06 +0000 (2009年8月30日) Log Message: ----------- sync before merge Modified Paths: -------------- trunk/matplotlib/make.osx Modified: trunk/matplotlib/make.osx =================================================================== --- trunk/matplotlib/make.osx 2009年08月30日 03:40:08 UTC (rev 7589) +++ trunk/matplotlib/make.osx 2009年08月30日 03:44:06 UTC (rev 7590) @@ -5,7 +5,7 @@ PYTHON=python${PYVERSION} ZLIBVERSION=1.2.3 PNGVERSION=1.2.33 -FREETYPEVERSION=2.3.7 +FREETYPEVERSION=2.3.5 MACOSX_DEPLOYMENT_TARGET=10.4 ## You shouldn't need to configure past this point This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7589 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7589&view=rev Author: jdh2358 Date: 2009年08月30日 03:40:08 +0000 (2009年8月30日) Log Message: ----------- added minor kwarg to get_?ticklines and applied ginpu patch Modified Paths: -------------- branches/v0_99_maint/doc/users/license.rst branches/v0_99_maint/lib/matplotlib/blocking_input.py branches/v0_99_maint/lib/matplotlib/figure.py Modified: branches/v0_99_maint/doc/users/license.rst =================================================================== --- branches/v0_99_maint/doc/users/license.rst 2009年08月30日 01:04:11 UTC (rev 7588) +++ branches/v0_99_maint/doc/users/license.rst 2009年08月30日 03:40:08 UTC (rev 7589) @@ -28,7 +28,7 @@ derivative works, distribute, and otherwise use matplotlib |version| alone or in any derivative version, provided, however, that JDH's License Agreement and JDH's notice of copyright, i.e., "Copyright (c) -2002-2008 John D. Hunter; All Rights Reserved" are retained in +2002-2009 John D. Hunter; All Rights Reserved" are retained in matplotlib |version| alone or in any derivative version prepared by Licensee. Modified: branches/v0_99_maint/lib/matplotlib/blocking_input.py =================================================================== --- branches/v0_99_maint/lib/matplotlib/blocking_input.py 2009年08月30日 01:04:11 UTC (rev 7588) +++ branches/v0_99_maint/lib/matplotlib/blocking_input.py 2009年08月30日 03:40:08 UTC (rev 7589) @@ -114,15 +114,25 @@ Class that creates a callable object to retrieve mouse clicks in a blocking way. - This class will also retrieve keyboard clicks and treat them like + This class will also retrieve keyboard clicks and treat them like appropriate mouse clicks (delete and backspace are like mouse button 3, enter is like mouse button 2 and all others are like mouse button 1). """ - def __init__(self, fig): + + button_add = 1 + button_pop = 3 + button_stop = 2 + + def __init__(self, fig, mouse_add=1, mouse_pop=3, mouse_stop=2): BlockingInput.__init__(self, fig=fig, eventslist=('button_press_event', 'key_press_event') ) + self.button_add = mouse_add + self.button_pop = mouse_pop + self.button_stop= mouse_stop + + def post_event(self): """ This will be called to process events @@ -133,19 +143,19 @@ self.key_event() else: self.mouse_event() - + def mouse_event(self): '''Process a mouse click event''' event = self.events[-1] button = event.button - if button == 3: - self.button3(event) - elif button == 2: - self.button2(event) + if button == self.button_pop: + self.mouse_event_pop(event,-1) + elif button == self.button_stop: + self.mouse_event_stop(event) else: - self.button1(event) + self.mouse_event_add(event) def key_event(self): ''' @@ -154,16 +164,16 @@ ''' event = self.events[-1] - key = event.key + key = event.key.lower() - if key == 'backspace' or key == 'delete': - self.button3(event) - elif key == 'enter': - self.button2(event) + if key in ['backspace', 'delete']: + self.mouse_event_pop(event) + elif key in ['escape', 'enter']: # on windows XP and wxAgg, the enter key doesn't seem to register + self.mouse_event_stop(event) else: - self.button1(event) + self.mouse_event_add(event) - def button1( self, event ): + def mouse_event_add( self, event ): """ Will be called for any event involving a button other than button 2 or 3. This will add a click if it is inside axes. @@ -171,34 +181,34 @@ if event.inaxes: self.add_click(event) else: # If not a valid click, remove from event list - BlockingInput.pop(self) + BlockingInput.pop(self,-1) - def button2( self, event ): + def mouse_event_stop( self, event ): """ Will be called for any event involving button 2. Button 2 ends blocking input. """ # Remove last event just for cleanliness - BlockingInput.pop(self) + BlockingInput.pop(self,-1) # This will exit even if not in infinite mode. This is # consistent with matlab and sometimes quite useful, but will # require the user to test how many points were actually # returned before using data. - self.fig.canvas.stop_event_loop() + self.fig.canvas.stop_event_loop(event) - def button3( self, event ): + def mouse_event_pop( self, event ): """ Will be called for any event involving button 3. Button 3 removes the last click. """ # Remove this last event - BlockingInput.pop(self) + BlockingInput.pop(self,-1) # Now remove any existing clicks if possible if len(self.events)>0: - self.pop() + self.pop(event,-1) def add_click(self,event): """ @@ -211,11 +221,23 @@ # If desired plot up click if self.show_clicks: + + # make sure we don't mess with the axes zoom + xlim = event.inaxes.get_xlim() + ylim = event.inaxes.get_ylim() + + # plot the clicks self.marks.extend( event.inaxes.plot([event.xdata,], [event.ydata,], 'r+') ) + + # before we draw, make sure to reset the limits + event.inaxes.set_xlim(xlim) + event.inaxes.set_ylim(ylim) self.fig.canvas.draw() - def pop_click(self,index=-1): + + + def pop_click(self,event,index=-1): """ This removes a click from the list of clicks. Defaults to removing the last click. @@ -223,25 +245,49 @@ self.clicks.pop(index) if self.show_clicks: + + # make sure we don't mess with the axes zoom + xlim = event.inaxes.get_xlim() + ylim = event.inaxes.get_ylim() + mark = self.marks.pop(index) mark.remove() + + # before we draw, make sure to reset the limits + event.inaxes.set_xlim(xlim) + event.inaxes.set_ylim(ylim) self.fig.canvas.draw() + # NOTE: I do NOT understand why the above 3 lines does not work + # for the keyboard backspace event on windows XP wxAgg. + # maybe event.inaxes here is a COPY of the actual axes? - def pop(self,index=-1): + + def pop(self,event,index=-1): """ This removes a click and the associated event from the object. Defaults to removing the last click, but any index can be supplied. """ - self.pop_click(index) + self.pop_click(event,index) BlockingInput.pop(self,index) - def cleanup(self): + def cleanup(self,event=None): # clean the figure if self.show_clicks: + if event: + # make sure we don't mess with the axes zoom + xlim = event.inaxes.get_xlim() + ylim = event.inaxes.get_ylim() + for mark in self.marks: mark.remove() self.marks = [] + + if event: + # before we draw, make sure to reset the limits + event.inaxes.set_xlim(xlim) + event.inaxes.set_ylim(ylim) + self.fig.canvas.draw() # Call base class to remove callbacks Modified: branches/v0_99_maint/lib/matplotlib/figure.py =================================================================== --- branches/v0_99_maint/lib/matplotlib/figure.py 2009年08月30日 01:04:11 UTC (rev 7588) +++ branches/v0_99_maint/lib/matplotlib/figure.py 2009年08月30日 03:40:08 UTC (rev 7589) @@ -1086,11 +1086,12 @@ ax.update_params() ax.set_position(ax.figbox) - def ginput(self, n=1, timeout=30, show_clicks=True): + def ginput(self, n=1, timeout=30, show_clicks=True, mouse_add=1, mouse_pop=3, mouse_stop=2): """ call signature:: - ginput(self, n=1, timeout=30, show_clicks=True) + ginput(self, n=1, timeout=30, show_clicks=True, + mouse_add=1, mouse_pop=3, mouse_stop=2) Blocking call to interact with the figure. @@ -1111,7 +1112,9 @@ manager) selects a point. """ - blocking_mouse_input = BlockingMouseInput(self) + blocking_mouse_input = BlockingMouseInput(self, mouse_add =mouse_add, + mouse_pop =mouse_pop, + mouse_stop=mouse_stop) return blocking_mouse_input(n=n, timeout=timeout, show_clicks=show_clicks) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7588 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7588&view=rev Author: jswhit Date: 2009年08月30日 01:04:11 +0000 (2009年8月30日) Log Message: ----------- workaround for contourf bug (mask regions outside map) Modified Paths: -------------- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py =================================================================== --- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2009年08月30日 00:08:34 UTC (rev 7587) +++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2009年08月30日 01:04:11 UTC (rev 7588) @@ -2831,9 +2831,17 @@ region (see examples/contour_demo.py).""") # mask for points outside projection limb. xymask = np.logical_or(np.greater(x,1.e20),np.greater(y,1.e20)) + # mask outside projection region (workaround for contourf bug?) + epsx = 0.1*(self.xmax-self.xmin) + epsy = 0.1*(self.ymax-self.ymin) + outsidemask = np.logical_or(np.logical_or(x > self.xmax+epsx,\ + x < self.xmin-epsy),\ + np.logical_or(y > self.ymax+epsy,\ + y < self.ymin-epsy)) data = ma.asarray(data) - # combine with data mask. - mask = np.logical_or(ma.getmaskarray(data),xymask) + # combine masks. + mask = \ + np.logical_or(outsidemask,np.logical_or(ma.getmaskarray(data),xymask)) data = ma.masked_array(data,mask=mask) # allow callers to override the hold state by passing hold=True|False b = ax.ishold() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7587 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7587&view=rev Author: astraw Date: 2009年08月30日 00:08:34 +0000 (2009年8月30日) Log Message: ----------- testing: add missing import and add SF bug ID Modified Paths: -------------- trunk/matplotlib/test/test_matplotlib/TestAxes.py Modified: trunk/matplotlib/test/test_matplotlib/TestAxes.py =================================================================== --- trunk/matplotlib/test/test_matplotlib/TestAxes.py 2009年08月30日 00:03:25 UTC (rev 7586) +++ trunk/matplotlib/test/test_matplotlib/TestAxes.py 2009年08月30日 00:08:34 UTC (rev 7587) @@ -2,7 +2,7 @@ """The Axes unit-test class implementation.""" #======================================================================= -from mplTest import MplTestCase +from mplTest import MplTestCase, units #======================================================================= # Add import modules below. @@ -88,6 +88,8 @@ fig.savefig( fname ) self.checkImage( fname ) + # See SF bug 2846058 + # https://sourceforge.net/tracker/?func=detail&aid=2846058&group_id=80706&atid=560720 fname = self.outFile( "formatter_ticker_005.png" ) ax.set_xlabel( "x-label 005" ) ax.autoscale_view() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7586 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7586&view=rev Author: astraw Date: 2009年08月30日 00:03:25 +0000 (2009年8月30日) Log Message: ----------- remove 'import *' usage Modified Paths: -------------- trunk/matplotlib/test/test_matplotlib/TestAxes.py Modified: trunk/matplotlib/test/test_matplotlib/TestAxes.py =================================================================== --- trunk/matplotlib/test/test_matplotlib/TestAxes.py 2009年08月29日 18:14:28 UTC (rev 7585) +++ trunk/matplotlib/test/test_matplotlib/TestAxes.py 2009年08月30日 00:03:25 UTC (rev 7586) @@ -2,7 +2,7 @@ """The Axes unit-test class implementation.""" #======================================================================= -from mplTest import * +from mplTest import MplTestCase #======================================================================= # Add import modules below. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7585 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7585&view=rev Author: efiring Date: 2009年08月29日 18:14:28 +0000 (2009年8月29日) Log Message: ----------- Merged revisions 7582-7584 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7582 | jdh2358 | 2009年08月29日 06:35:35 -1000 (2009年8月29日) | 1 line added Michael Sarahan's image tutorial from the scipy mpl sprint ........ r7583 | jdh2358 | 2009年08月29日 06:46:44 -1000 (2009年8月29日) | 1 line minor tweaks to the image tut ........ r7584 | efiring | 2009年08月29日 07:48:37 -1000 (2009年8月29日) | 2 lines Semilogx, semilogy ensure one axis is linear; patch by Tony Yu ........ Modified Paths: -------------- trunk/matplotlib/doc/_templates/indexsidebar.html trunk/matplotlib/doc/_templates/layout.html trunk/matplotlib/doc/devel/coding_guide.rst trunk/matplotlib/doc/users/index.rst trunk/matplotlib/doc/users/transforms_tutorial.rst trunk/matplotlib/doc/users/whats_new.rst trunk/matplotlib/lib/matplotlib/axes.py Added Paths: ----------- trunk/matplotlib/doc/_static/stinkbug.png trunk/matplotlib/doc/users/image_tutorial.rst Property Changed: ---------------- trunk/matplotlib/ trunk/matplotlib/doc/pyplots/README trunk/matplotlib/doc/sphinxext/gen_gallery.py trunk/matplotlib/doc/sphinxext/gen_rst.py trunk/matplotlib/examples/misc/multiprocess.py trunk/matplotlib/examples/mplot3d/contour3d_demo.py trunk/matplotlib/examples/mplot3d/contourf3d_demo.py trunk/matplotlib/examples/mplot3d/polys3d_demo.py trunk/matplotlib/examples/mplot3d/scatter3d_demo.py trunk/matplotlib/examples/mplot3d/surface3d_demo.py trunk/matplotlib/examples/mplot3d/wire3d_demo.py trunk/matplotlib/lib/matplotlib/sphinxext/mathmpl.py trunk/matplotlib/lib/matplotlib/sphinxext/only_directives.py trunk/matplotlib/lib/matplotlib/sphinxext/plot_directive.py Property changes on: trunk/matplotlib ___________________________________________________________________ Modified: svnmerge-integrated - /branches/mathtex:1-7263 /branches/v0_98_5_maint:1-7253 /branches/v0_99_maint:1-7569 + /branches/mathtex:1-7263 /branches/v0_98_5_maint:1-7253 /branches/v0_99_maint:1-7584 Modified: svn:mergeinfo - /branches/v0_91_maint:5753-5771 /branches/v0_98_5_maint:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint:5753-5771 /branches/v0_98_5_maint:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Copied: trunk/matplotlib/doc/_static/stinkbug.png (from rev 7584, branches/v0_99_maint/doc/_static/stinkbug.png) =================================================================== (Binary files differ) Modified: trunk/matplotlib/doc/_templates/indexsidebar.html =================================================================== --- trunk/matplotlib/doc/_templates/indexsidebar.html 2009年08月29日 17:48:37 UTC (rev 7584) +++ trunk/matplotlib/doc/_templates/indexsidebar.html 2009年08月29日 18:14:28 UTC (rev 7585) @@ -53,7 +53,7 @@ but it is a good idea to ping us on the mailing list too.</p> <p>For details on what's new, see the detailed <a href="{{ -pathto('_static/CHANGELOG', 1) }}">changelog</a>. Anything that could +pathto('_static/CHANGELOG', 1) }}">changelog</a> or browse the <a href="http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/matplotlib/">source code</a>. Anything that could require changes to your existing codes is logged in the <a href="{{ pathto('api/api_changes.html', 1) }}">api changes</a> file.</p> Modified: trunk/matplotlib/doc/_templates/layout.html =================================================================== --- trunk/matplotlib/doc/_templates/layout.html 2009年08月29日 17:48:37 UTC (rev 7584) +++ trunk/matplotlib/doc/_templates/layout.html 2009年08月29日 18:14:28 UTC (rev 7585) @@ -4,7 +4,7 @@ {% block rootrellink %} <li><a href="{{ pathto('index') }}">home</a>| </li> <li><a href="{{ pathto('search') }}">search</a>| </li> - <li><a href="examples/index.html">examples</a>| </li> + <li><a href="http://matplotlib.sf.net/examples/index.html">examples</a>| </li> <li><a href="{{ pathto('gallery') }}">gallery</a>| </li> <li><a href="{{ pathto('contents') }}">docs</a> »</li> {% endblock %} Modified: trunk/matplotlib/doc/devel/coding_guide.rst =================================================================== --- trunk/matplotlib/doc/devel/coding_guide.rst 2009年08月29日 17:48:37 UTC (rev 7584) +++ trunk/matplotlib/doc/devel/coding_guide.rst 2009年08月29日 18:14:28 UTC (rev 7585) @@ -1,4 +1,4 @@ -M.. _coding-guide: +.. _coding-guide: ************ Coding guide Property changes on: trunk/matplotlib/doc/pyplots/README ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_98_5_maint/doc/pyplots/README:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/doc/pyplots/README:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_98_5_maint/doc/pyplots/README:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/doc/pyplots/README:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Property changes on: trunk/matplotlib/doc/sphinxext/gen_gallery.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/doc/_templates/gen_gallery.py:5753-5771 /branches/v0_98_5_maint/doc/sphinxext/gen_gallery.py:6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/doc/sphinxext/gen_gallery.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/doc/_templates/gen_gallery.py:5753-5771 /branches/v0_98_5_maint/doc/sphinxext/gen_gallery.py:6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/doc/sphinxext/gen_gallery.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Property changes on: trunk/matplotlib/doc/sphinxext/gen_rst.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/doc/examples/gen_rst.py:5753-5771 /branches/v0_98_5_maint/doc/sphinxext/gen_rst.py:6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/doc/sphinxext/gen_rst.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/doc/examples/gen_rst.py:5753-5771 /branches/v0_98_5_maint/doc/sphinxext/gen_rst.py:6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/doc/sphinxext/gen_rst.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Copied: trunk/matplotlib/doc/users/image_tutorial.rst (from rev 7584, branches/v0_99_maint/doc/users/image_tutorial.rst) =================================================================== --- trunk/matplotlib/doc/users/image_tutorial.rst (rev 0) +++ trunk/matplotlib/doc/users/image_tutorial.rst 2009年08月29日 18:14:28 UTC (rev 7585) @@ -0,0 +1,324 @@ +.. _image_tutorial: + + +************** +Image tutorial +************** + +.. _imaging_startup: + +Startup commands +=================== + +At the very least, you'll need to have access to the :func:`~matplotlib.pyplot.imshow` function. There are a couple of ways to do it. The easy way for an interactive environment:: + + $ipython -pylab + +The imshow function is now directly accessible (it's in your +`namespace <http://bytebaker.com/2008/07/30/python-namespaces/>`_). +See also :ref:`pyplot-tutorial`. + +The more expressive, easier to understand later method (use this in +your scripts to make it easier for others (including your future self) +to read) is to use the matplotlib API (see :ref:`artist-tutorial`) where you use explicit namespaces and control object creation, etc... + +.. sourcecode:: ipython + + In [1]: import matplotlib.pyplot as plt + In [2]: import matplotlib.image as mpimg + In [3]: import numpy as np + +Examples below will use the latter method, for clarity. In these examples, if you use the -pylab method, you can skip the "mpimg." and "plt." prefixes. + +.. _importing_data: + +Importing image data into Numpy arrays +=============================================== + +Plotting image data is supported by the Python Image Library (`PIL <http://www.pythonware.com/products/pil/>`_), . Natively, matplotlib only supports PNG images. The commands shown below fall back on PIL if the native read fails. + +The image used in this example is a PNG file, but keep that PIL requirement in mind for your own data. + +Here's the image we're going to play with: + +.. image:: ../_static/stinkbug.png + +It's a 24-bit RGB PNG image (8 bits for each of R, G, B). Depending +on where you get your data, the other kinds of image that you'll most +likely encounter are RGBA images, which allow for transparency, or +single-channel grayscale (luminosity) images. You can right click on +it and choose "Save image as" to download it to your computer for the +rest of this tutorial. + +And here we go... + +.. sourcecode:: ipython + + In [4]: img=mpimg.imread('stinkbug.png') + Out[4]: + array([[[ 0.40784314, 0.40784314, 0.40784314], + [ 0.40784314, 0.40784314, 0.40784314], + [ 0.40784314, 0.40784314, 0.40784314], + ..., + [ 0.42745098, 0.42745098, 0.42745098], + [ 0.42745098, 0.42745098, 0.42745098], + [ 0.42745098, 0.42745098, 0.42745098]], + + [[ 0.41176471, 0.41176471, 0.41176471], + [ 0.41176471, 0.41176471, 0.41176471], + [ 0.41176471, 0.41176471, 0.41176471], + ..., + [ 0.42745098, 0.42745098, 0.42745098], + [ 0.42745098, 0.42745098, 0.42745098], + [ 0.42745098, 0.42745098, 0.42745098]], + + [[ 0.41960785, 0.41960785, 0.41960785], + [ 0.41568628, 0.41568628, 0.41568628], + [ 0.41568628, 0.41568628, 0.41568628], + ..., + [ 0.43137255, 0.43137255, 0.43137255], + [ 0.43137255, 0.43137255, 0.43137255], + [ 0.43137255, 0.43137255, 0.43137255]], + + ..., + [[ 0.43921569, 0.43921569, 0.43921569], + [ 0.43529412, 0.43529412, 0.43529412], + [ 0.43137255, 0.43137255, 0.43137255], + ..., + [ 0.45490196, 0.45490196, 0.45490196], + [ 0.4509804 , 0.4509804 , 0.4509804 ], + [ 0.4509804 , 0.4509804 , 0.4509804 ]], + + [[ 0.44313726, 0.44313726, 0.44313726], + [ 0.44313726, 0.44313726, 0.44313726], + [ 0.43921569, 0.43921569, 0.43921569], + ..., + [ 0.4509804 , 0.4509804 , 0.4509804 ], + [ 0.44705883, 0.44705883, 0.44705883], + [ 0.44705883, 0.44705883, 0.44705883]], + + [[ 0.44313726, 0.44313726, 0.44313726], + [ 0.4509804 , 0.4509804 , 0.4509804 ], + [ 0.4509804 , 0.4509804 , 0.4509804 ], + ..., + [ 0.44705883, 0.44705883, 0.44705883], + [ 0.44705883, 0.44705883, 0.44705883], + [ 0.44313726, 0.44313726, 0.44313726]]], dtype=float32) + +Note the dtype there - float32. Matplotlib has rescaled the 8 bit data from each channel to floating point data between 0.0 and 1.0. As a side note, the only datatype that PIL can work with is uint8. Matplotlib plotting can handle float32 and uint8, but image reading/writing for any format other than PNG is limited to uint8 data. Why 8 bits? Most displays can only render 8 bits per channel worth of color gradation. Why can they only render 8 bits/channel? Because that's about all the human eye can see. More here (from a photography standpoint): `Luminous Landscape bit depth tutorial <http://www.luminous-landscape.com/tutorials/bit-depth.shtml>`_ + +Each inner list represents a pixel. Here, with an RGB image, there are 3 values. Since it's a black and white image, R, G, and B are all similar. An RGBA (where A is alpha, or transparency), has 4 values per inner list, and a simple luminance image just has one value (and is thus only a 2-D array, not a 3-D array). For RGB and RGBA images, matplotlib supports float32 and uint8 data types. For grayscale, matplotlib supports only float32. If your array data does not meet one of these descriptions, you need to rescale it. + +.. _plotting_data: + +Plotting numpy arrays as images +=================================== + +So, you have your data in a numpy array (either by importing it, or by generating it). Let's render it. In Matplotlib, this is performed using the :func:`~matplotlib.pyplot.imshow` function. Here we'll grab the plot object. This object gives you an easy way to manipulate the plot from the prompt. + +.. sourcecode:: ipython + + In [5]: imgplot = plt.imshow(img) + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + imgplot = plt.imshow(img) + +You can also plot any numpy array - just remember that the datatype must be float32 (and range from 0.0 to 1.0) or uint8. + +.. _Pseudocolor: + +Applying pseudocolor schemes to image plots +------------------------------------------------- + +Pseudocolor can be a useful tool for enhancing contrast and visualizing your data more easily. This is especially useful when making presentations of your data using projectors - their contrast is typically quite poor. + +Pseudocolor is only relevant to single-channel, grayscale, luminosity images. We currently have an RGB image. Since R, G, and B are all similar (see for yourself above or in your data), we can just pick on channel of our data: + +.. sourcecode:: ipython + + In [6]: lum_img = img[:,:,0] + +This is array slicing. You can read more `here <http://www.scipy.org/Tentative_NumPy_Tutorial>`_ + +.. sourcecode:: ipython + + In [7]: imgplot = mpimg.imshow(lum_img) + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + plt.imshow(lum_img) + +Now, with a luminosity image, the default colormap (aka lookup table, LUT), is applied. The default is called jet. There are plenty of others to choose from. Let's set some others using the :meth:`~matplotlib.image.Image.set_cmap` method on our image plot object: + +.. sourcecode:: ipython + + In [8]: imgplot.set_cmap('hot') + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + imgplot = plt.imshow(lum_img) + imgplot.set_cmap('hot') + +.. sourcecode:: ipython + + In [9]: imgplot.set_cmap('spectral') + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + imgplot = plt.imshow(lum_img) + imgplot.set_cmap('spectral') + +There are many other colormap schemes available. See a list and images of the colormaps `here <http://matplotlib.sourceforge.net/examples/pylab_examples/show_colormaps.html>`_ + +.. _Color Bars + +Color scale reference +------------------------ + +It's helpful to have an idea of what value a color represents. We can do that by adding color bars. It's as easy as one line: + +.. sourcecode:: ipython + In [10]: plt.colorbar() + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + imgplot = plt.imshow(lum_img) + imgplot.set_cmap('spectral') + plt.colorbar() + +This adds a colorbar to your existing figure. This won't automatically change if you change you switch to a different colormap - you have to re-create your plot, and add in the colorbar again. + +.. _Data ranges + +Examining a specific data range +--------------------------------- + +Sometimes you want to enhance the contrast in your image, or expand the contrast in a particular region while sacrificing the detail in colors that don't vary much, or don't matter. A good tool to find interesting regions is the histogram. To create a histogram of our image data, we use the :func:`~matplotlib.pyplot.hist` function. + +.. sourcecode:: ipython + + In[10]: plt.hist(lum_img) + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + plt.hist(lum_img, range=(0.0,1.0)) + +Most often, the "interesting" part of the image is around the peak, and you can get extra contrast by clipping the regions above and/or below the peak. In our histogram, it looks like there's not much useful information in the high end (not many white things in the image). Let's adjust the upper limit, so that we effectively "zoom in on" part of the histogram. We do this by calling the :meth:`~matplotlib.image.Image.set_clim` method of the image plot object. + +.. sourcecode:: ipython + + In[11]: imgplot.set_clim=(0.0,0.7) + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + fig = plt.figure() + a=fig.add_subplot(1,2,1) + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + imgplot = plt.imshow(lum_img) + a.set_title('Before') + plt.colorbar(ticks=[0.1,0.3,0.5,0.7], orientation ='horizontal') + a=fig.add_subplot(1,2,2) + imgplot = plt.imshow(lum_img) + imgplot.set_clim(0.0,0.7) + a.set_title('After') + plt.colorbar(ticks=[0.1,0.3,0.5,0.7], orientation='horizontal') + +.. _Interpolation: + +Array Interpolation schemes +----------------------------------- +Interpolation calculates what the color or value of a pixel "should" be, according to different mathematical schemes. One common place that this happens is when you resize an image. The number of pixels change, but you want the same information. Since pixels are discrete, there's missing space. Interpolation is how you fill that space. This is why your images sometimes come out looking pixelated when you blow them up. The effect is more pronounced when the difference between the original image and the expanded image is greater. Let's take our image and shrink it. We're effectively discarding pixels, only keeping a select few. Now when we plot it, that data gets blown up to the size on your screen. The old pixels aren't there anymore, and the computer has to draw in pixels to fill that space. + +.. sourcecode:: ipython + + In [8]: import Image + In [9]: img = Image.open('stinkbug.png') # Open image as PIL image object + In [10]: rsize = img.resize((img.size[0]/10,img.size[1]/10)) # Use PIL to resize + In [11]: rsizeArr = np.asarray(rsize) # Get array back + In [12]: imgplot = mpimg.imshow(rsizeArr) + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + import Image + img = Image.open('_static/stinkbug.png') # opens the file using PIL - it's not an array yet + rsize = img.resize((img.size[0]/10,img.size[1]/10)) # resize the image + rsizeArr = np.asarray(rsize) + lum_img = rsizeArr[:,:,0] + imgplot = plt.imshow(rsizeArr) + +Here we have the default interpolation, bilinear, since we did not give :func:`~matplotlib.pyplot.imshow` any interpolation argument. + +Let's try some others: + +.. sourcecode:: ipython + + In [10]: imgplot.set_interpolation('nearest') + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + import Image + img = Image.open('_static/stinkbug.png') # opens the file using PIL - it's not an array yet + rsize = img.resize((img.size[0]/10,img.size[1]/10)) # resize the image + rsizeArr = np.asarray(rsize) + lum_img = rsizeArr[:,:,0] + imgplot = plt.imshow(rsizeArr) + imgplot.set_interpolation('nearest') + +.. sourcecode:: ipython + + In [10]: imgplot.set_interpolation('bicubic') + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + import Image + img = Image.open('_static/stinkbug.png') # opens the file using PIL - it's not an array yet + rsize = img.resize((img.size[0]/10,img.size[1]/10)) # resize the image + rsizeArr = np.asarray(rsize) + lum_img = rsizeArr[:,:,0] + imgplot = plt.imshow(rsizeArr) + imgplot.set_interpolation('bicubic') + +Bicubic interpolation is often used when blowing up photos - people tend to prefer blurry over pixelated. \ No newline at end of file Modified: trunk/matplotlib/doc/users/index.rst =================================================================== --- trunk/matplotlib/doc/users/index.rst 2009年08月29日 17:48:37 UTC (rev 7584) +++ trunk/matplotlib/doc/users/index.rst 2009年08月29日 18:14:28 UTC (rev 7585) @@ -19,6 +19,7 @@ customizing.rst shell.rst index_text.rst + image_tutorial.rst artists.rst legend_guide.rst event_handling.rst Modified: trunk/matplotlib/doc/users/transforms_tutorial.rst =================================================================== --- trunk/matplotlib/doc/users/transforms_tutorial.rst 2009年08月29日 17:48:37 UTC (rev 7584) +++ trunk/matplotlib/doc/users/transforms_tutorial.rst 2009年08月29日 18:14:28 UTC (rev 7585) @@ -1,4 +1,4 @@ -.. _transformstutorial: +.. _transforms_tutorial: ************************** Transformations Tutorial Modified: trunk/matplotlib/doc/users/whats_new.rst =================================================================== --- trunk/matplotlib/doc/users/whats_new.rst 2009年08月29日 17:48:37 UTC (rev 7584) +++ trunk/matplotlib/doc/users/whats_new.rst 2009年08月29日 18:14:28 UTC (rev 7585) @@ -12,6 +12,16 @@ .. _whats-new-mplot3d: +New documentation +----------------- + +Jae-Joon Lee has written two new guides :ref:`plotting-guide-legend` +and :ref:`plotting-guide-annotation`. Michael Sarahan has written +:ref:`image_tutorial`. John Hunter has written two new tutorials on +working with paths and transformations: :ref:`path_tutorial` and +:ref:`transforms_tutorial`. + + mplot3d -------- @@ -53,12 +63,6 @@ .. plot:: pyplots/whats_new_99_spines.py -New documentation ------------------ - -jae-Joon Lee has written two new guides :ref:`plotting-guide-legend` -and :ref:`plotting-guide-annotation`. - .. _whats-new-0-98-4: new in 0.98.4 Property changes on: trunk/matplotlib/examples/misc/multiprocess.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/examples/misc/log.py:5753-5771 /branches/v0_98_5_maint/examples/misc/log.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/misc/multiprocess.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/examples/misc/log.py:5753-5771 /branches/v0_98_5_maint/examples/misc/log.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/misc/multiprocess.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Property changes on: trunk/matplotlib/examples/mplot3d/contour3d_demo.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/examples/mplot3d/contour.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/contour.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/contour3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/examples/mplot3d/contour.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/contour.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/contour3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Property changes on: trunk/matplotlib/examples/mplot3d/contourf3d_demo.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/examples/mplot3d/contourf.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/contourf.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/contourf3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/examples/mplot3d/contourf.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/contourf.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/contourf3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Property changes on: trunk/matplotlib/examples/mplot3d/polys3d_demo.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/examples/mplot3d/polys.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/polys.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/polys3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/examples/mplot3d/polys.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/polys.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/polys3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Property changes on: trunk/matplotlib/examples/mplot3d/scatter3d_demo.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/examples/mplot3d/scatter.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/scatter.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/scatter3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/examples/mplot3d/scatter.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/scatter.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/scatter3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Property changes on: trunk/matplotlib/examples/mplot3d/surface3d_demo.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/examples/mplot3d/surface.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/surface.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/surface3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/examples/mplot3d/surface.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/surface.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/surface3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Property changes on: trunk/matplotlib/examples/mplot3d/wire3d_demo.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/examples/mplot3d/wire.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/wire.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/wire3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/examples/mplot3d/wire.py:5753-5771 /branches/v0_98_5_maint/examples/mplot3d/wire.py:6581,6585,6587,6589-6609,6614,6616,6625,6652,6660-6662,6672-6673,6714-6715,6717-6732,6752-6754,6761-6773,6781,6792,6800,6802,6805,6809,6811,6822,6827,6850,6854,6856,6859,6861-6873,6883-6884,6886,6890-6891,6906-6909,6911-6912,6915-6916,6918,6920-6925,6927-6928,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080 /branches/v0_99_maint/examples/mplot3d/wire3d_demo.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Modified: trunk/matplotlib/lib/matplotlib/axes.py =================================================================== --- trunk/matplotlib/lib/matplotlib/axes.py 2009年08月29日 17:48:37 UTC (rev 7584) +++ trunk/matplotlib/lib/matplotlib/axes.py 2009年08月29日 18:14:28 UTC (rev 7585) @@ -3615,6 +3615,7 @@ } self.set_xscale('log', **d) + self.set_yscale('linear') b = self._hold self._hold = True # we've already processed the hold l = self.plot(*args, **kwargs) @@ -3665,6 +3666,7 @@ 'nonposy': kwargs.pop('nonposy', 'mask'), } self.set_yscale('log', **d) + self.set_xscale('linear') b = self._hold self._hold = True # we've already processed the hold l = self.plot(*args, **kwargs) Property changes on: trunk/matplotlib/lib/matplotlib/sphinxext/mathmpl.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/doc/sphinxext/mathmpl.py:5753-5771 /branches/v0_98_5_maint/lib/matplotlib/sphinxext/mathmpl.py:6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/lib/matplotlib/sphinxext/mathmpl.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/doc/sphinxext/mathmpl.py:5753-5771 /branches/v0_98_5_maint/lib/matplotlib/sphinxext/mathmpl.py:6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/lib/matplotlib/sphinxext/mathmpl.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Property changes on: trunk/matplotlib/lib/matplotlib/sphinxext/only_directives.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/doc/sphinxext/only_directives.py:5753-5771 /branches/v0_98_5_maint/lib/matplotlib/sphinxext/only_directives.py:6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/lib/matplotlib/sphinxext/only_directives.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/doc/sphinxext/only_directives.py:5753-5771 /branches/v0_98_5_maint/lib/matplotlib/sphinxext/only_directives.py:6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/lib/matplotlib/sphinxext/only_directives.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 Property changes on: trunk/matplotlib/lib/matplotlib/sphinxext/plot_directive.py ___________________________________________________________________ Modified: svn:mergeinfo - /branches/v0_91_maint/doc/sphinxext/plot_directive.py:5753-5771 /branches/v0_98_5_maint/lib/matplotlib/sphinxext/plot_directive.py:6920-6925,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/lib/matplotlib/sphinxext/plot_directive.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569 + /branches/v0_91_maint/doc/sphinxext/plot_directive.py:5753-5771 /branches/v0_98_5_maint/lib/matplotlib/sphinxext/plot_directive.py:6920-6925,6934,6941,6946,6948,6950,6952,6960,6972,6984-6985,6990,6995,6997-7001,7014,7016,7018,7024-7025,7033,7035,7042,7072,7080,7176,7209-7211,7227,7245 /branches/v0_99_maint/lib/matplotlib/sphinxext/plot_directive.py:7338,7393,7395-7404,7407-7424,7428-7433,7442-7444,7446,7475-7482,7484,7486,7489-7523,7567,7569,7582-7584 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7584 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7584&view=rev Author: efiring Date: 2009年08月29日 17:48:37 +0000 (2009年8月29日) Log Message: ----------- Semilogx, semilogy ensure one axis is linear; patch by Tony Yu Modified Paths: -------------- branches/v0_99_maint/lib/matplotlib/axes.py Modified: branches/v0_99_maint/lib/matplotlib/axes.py =================================================================== --- branches/v0_99_maint/lib/matplotlib/axes.py 2009年08月29日 16:46:44 UTC (rev 7583) +++ branches/v0_99_maint/lib/matplotlib/axes.py 2009年08月29日 17:48:37 UTC (rev 7584) @@ -3601,6 +3601,7 @@ } self.set_xscale('log', **d) + self.set_yscale('linear') b = self._hold self._hold = True # we've already processed the hold l = self.plot(*args, **kwargs) @@ -3651,6 +3652,7 @@ 'nonposy': kwargs.pop('nonposy', 'mask'), } self.set_yscale('log', **d) + self.set_xscale('linear') b = self._hold self._hold = True # we've already processed the hold l = self.plot(*args, **kwargs) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7583 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7583&view=rev Author: jdh2358 Date: 2009年08月29日 16:46:44 +0000 (2009年8月29日) Log Message: ----------- minor tweaks to the image tut Modified Paths: -------------- branches/v0_99_maint/doc/users/image_tutorial.rst Modified: branches/v0_99_maint/doc/users/image_tutorial.rst =================================================================== --- branches/v0_99_maint/doc/users/image_tutorial.rst 2009年08月29日 16:35:35 UTC (rev 7582) +++ branches/v0_99_maint/doc/users/image_tutorial.rst 2009年08月29日 16:46:44 UTC (rev 7583) @@ -12,16 +12,16 @@ At the very least, you'll need to have access to the :func:`~matplotlib.pyplot.imshow` function. There are a couple of ways to do it. The easy way for an interactive environment:: - $ipython -pylab -wthread + $ipython -pylab The imshow function is now directly accessible (it's in your `namespace <http://bytebaker.com/2008/07/30/python-namespaces/>`_). See also :ref:`pyplot-tutorial`. -The more expressive, easier to understand later method (use this in your scripts to make it easier for others (including your future self) to read):: +The more expressive, easier to understand later method (use this in +your scripts to make it easier for others (including your future self) +to read) is to use the matplotlib API (see :ref:`artist-tutorial`) where you use explicit namespaces and control object creation, etc... - $ipython -wthread - .. sourcecode:: ipython In [1]: import matplotlib.pyplot as plt This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7582 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7582&view=rev Author: jdh2358 Date: 2009年08月29日 16:35:35 +0000 (2009年8月29日) Log Message: ----------- added Michael Sarahan's image tutorial from the scipy mpl sprint Modified Paths: -------------- branches/v0_99_maint/doc/_templates/indexsidebar.html branches/v0_99_maint/doc/_templates/layout.html branches/v0_99_maint/doc/devel/coding_guide.rst branches/v0_99_maint/doc/users/index.rst branches/v0_99_maint/doc/users/transforms_tutorial.rst branches/v0_99_maint/doc/users/whats_new.rst Added Paths: ----------- branches/v0_99_maint/doc/_static/stinkbug.png branches/v0_99_maint/doc/users/image_tutorial.rst Added: branches/v0_99_maint/doc/_static/stinkbug.png =================================================================== (Binary files differ) Property changes on: branches/v0_99_maint/doc/_static/stinkbug.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: branches/v0_99_maint/doc/_templates/indexsidebar.html =================================================================== --- branches/v0_99_maint/doc/_templates/indexsidebar.html 2009年08月28日 12:20:11 UTC (rev 7581) +++ branches/v0_99_maint/doc/_templates/indexsidebar.html 2009年08月29日 16:35:35 UTC (rev 7582) @@ -52,7 +52,7 @@ but it is a good idea to ping us on the mailing list too.</p> <p>For details on what's new, see the detailed <a href="{{ -pathto('_static/CHANGELOG', 1) }}">changelog</a>. Anything that could +pathto('_static/CHANGELOG', 1) }}">changelog</a> or browse the <a href="http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/matplotlib/">source code</a>. Anything that could require changes to your existing codes is logged in the <a href="{{ pathto('api/api_changes.html', 1) }}">api changes</a> file.</p> Modified: branches/v0_99_maint/doc/_templates/layout.html =================================================================== --- branches/v0_99_maint/doc/_templates/layout.html 2009年08月28日 12:20:11 UTC (rev 7581) +++ branches/v0_99_maint/doc/_templates/layout.html 2009年08月29日 16:35:35 UTC (rev 7582) @@ -4,7 +4,7 @@ {% block rootrellink %} <li><a href="{{ pathto('index') }}">home</a>| </li> <li><a href="{{ pathto('search') }}">search</a>| </li> - <li><a href="examples/index.html">examples</a>| </li> + <li><a href="http://matplotlib.sf.net/examples/index.html">examples</a>| </li> <li><a href="{{ pathto('gallery') }}">gallery</a>| </li> <li><a href="{{ pathto('contents') }}">docs</a> »</li> {% endblock %} Modified: branches/v0_99_maint/doc/devel/coding_guide.rst =================================================================== --- branches/v0_99_maint/doc/devel/coding_guide.rst 2009年08月28日 12:20:11 UTC (rev 7581) +++ branches/v0_99_maint/doc/devel/coding_guide.rst 2009年08月29日 16:35:35 UTC (rev 7582) @@ -1,4 +1,4 @@ -M.. _coding-guide: +.. _coding-guide: ************ Coding guide Added: branches/v0_99_maint/doc/users/image_tutorial.rst =================================================================== --- branches/v0_99_maint/doc/users/image_tutorial.rst (rev 0) +++ branches/v0_99_maint/doc/users/image_tutorial.rst 2009年08月29日 16:35:35 UTC (rev 7582) @@ -0,0 +1,324 @@ +.. _image_tutorial: + + +************** +Image tutorial +************** + +.. _imaging_startup: + +Startup commands +=================== + +At the very least, you'll need to have access to the :func:`~matplotlib.pyplot.imshow` function. There are a couple of ways to do it. The easy way for an interactive environment:: + + $ipython -pylab -wthread + +The imshow function is now directly accessible (it's in your +`namespace <http://bytebaker.com/2008/07/30/python-namespaces/>`_). +See also :ref:`pyplot-tutorial`. + +The more expressive, easier to understand later method (use this in your scripts to make it easier for others (including your future self) to read):: + + $ipython -wthread + +.. sourcecode:: ipython + + In [1]: import matplotlib.pyplot as plt + In [2]: import matplotlib.image as mpimg + In [3]: import numpy as np + +Examples below will use the latter method, for clarity. In these examples, if you use the -pylab method, you can skip the "mpimg." and "plt." prefixes. + +.. _importing_data: + +Importing image data into Numpy arrays +=============================================== + +Plotting image data is supported by the Python Image Library (`PIL <http://www.pythonware.com/products/pil/>`_), . Natively, matplotlib only supports PNG images. The commands shown below fall back on PIL if the native read fails. + +The image used in this example is a PNG file, but keep that PIL requirement in mind for your own data. + +Here's the image we're going to play with: + +.. image:: ../_static/stinkbug.png + +It's a 24-bit RGB PNG image (8 bits for each of R, G, B). Depending +on where you get your data, the other kinds of image that you'll most +likely encounter are RGBA images, which allow for transparency, or +single-channel grayscale (luminosity) images. You can right click on +it and choose "Save image as" to download it to your computer for the +rest of this tutorial. + +And here we go... + +.. sourcecode:: ipython + + In [4]: img=mpimg.imread('stinkbug.png') + Out[4]: + array([[[ 0.40784314, 0.40784314, 0.40784314], + [ 0.40784314, 0.40784314, 0.40784314], + [ 0.40784314, 0.40784314, 0.40784314], + ..., + [ 0.42745098, 0.42745098, 0.42745098], + [ 0.42745098, 0.42745098, 0.42745098], + [ 0.42745098, 0.42745098, 0.42745098]], + + [[ 0.41176471, 0.41176471, 0.41176471], + [ 0.41176471, 0.41176471, 0.41176471], + [ 0.41176471, 0.41176471, 0.41176471], + ..., + [ 0.42745098, 0.42745098, 0.42745098], + [ 0.42745098, 0.42745098, 0.42745098], + [ 0.42745098, 0.42745098, 0.42745098]], + + [[ 0.41960785, 0.41960785, 0.41960785], + [ 0.41568628, 0.41568628, 0.41568628], + [ 0.41568628, 0.41568628, 0.41568628], + ..., + [ 0.43137255, 0.43137255, 0.43137255], + [ 0.43137255, 0.43137255, 0.43137255], + [ 0.43137255, 0.43137255, 0.43137255]], + + ..., + [[ 0.43921569, 0.43921569, 0.43921569], + [ 0.43529412, 0.43529412, 0.43529412], + [ 0.43137255, 0.43137255, 0.43137255], + ..., + [ 0.45490196, 0.45490196, 0.45490196], + [ 0.4509804 , 0.4509804 , 0.4509804 ], + [ 0.4509804 , 0.4509804 , 0.4509804 ]], + + [[ 0.44313726, 0.44313726, 0.44313726], + [ 0.44313726, 0.44313726, 0.44313726], + [ 0.43921569, 0.43921569, 0.43921569], + ..., + [ 0.4509804 , 0.4509804 , 0.4509804 ], + [ 0.44705883, 0.44705883, 0.44705883], + [ 0.44705883, 0.44705883, 0.44705883]], + + [[ 0.44313726, 0.44313726, 0.44313726], + [ 0.4509804 , 0.4509804 , 0.4509804 ], + [ 0.4509804 , 0.4509804 , 0.4509804 ], + ..., + [ 0.44705883, 0.44705883, 0.44705883], + [ 0.44705883, 0.44705883, 0.44705883], + [ 0.44313726, 0.44313726, 0.44313726]]], dtype=float32) + +Note the dtype there - float32. Matplotlib has rescaled the 8 bit data from each channel to floating point data between 0.0 and 1.0. As a side note, the only datatype that PIL can work with is uint8. Matplotlib plotting can handle float32 and uint8, but image reading/writing for any format other than PNG is limited to uint8 data. Why 8 bits? Most displays can only render 8 bits per channel worth of color gradation. Why can they only render 8 bits/channel? Because that's about all the human eye can see. More here (from a photography standpoint): `Luminous Landscape bit depth tutorial <http://www.luminous-landscape.com/tutorials/bit-depth.shtml>`_ + +Each inner list represents a pixel. Here, with an RGB image, there are 3 values. Since it's a black and white image, R, G, and B are all similar. An RGBA (where A is alpha, or transparency), has 4 values per inner list, and a simple luminance image just has one value (and is thus only a 2-D array, not a 3-D array). For RGB and RGBA images, matplotlib supports float32 and uint8 data types. For grayscale, matplotlib supports only float32. If your array data does not meet one of these descriptions, you need to rescale it. + +.. _plotting_data: + +Plotting numpy arrays as images +=================================== + +So, you have your data in a numpy array (either by importing it, or by generating it). Let's render it. In Matplotlib, this is performed using the :func:`~matplotlib.pyplot.imshow` function. Here we'll grab the plot object. This object gives you an easy way to manipulate the plot from the prompt. + +.. sourcecode:: ipython + + In [5]: imgplot = plt.imshow(img) + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + imgplot = plt.imshow(img) + +You can also plot any numpy array - just remember that the datatype must be float32 (and range from 0.0 to 1.0) or uint8. + +.. _Pseudocolor: + +Applying pseudocolor schemes to image plots +------------------------------------------------- + +Pseudocolor can be a useful tool for enhancing contrast and visualizing your data more easily. This is especially useful when making presentations of your data using projectors - their contrast is typically quite poor. + +Pseudocolor is only relevant to single-channel, grayscale, luminosity images. We currently have an RGB image. Since R, G, and B are all similar (see for yourself above or in your data), we can just pick on channel of our data: + +.. sourcecode:: ipython + + In [6]: lum_img = img[:,:,0] + +This is array slicing. You can read more `here <http://www.scipy.org/Tentative_NumPy_Tutorial>`_ + +.. sourcecode:: ipython + + In [7]: imgplot = mpimg.imshow(lum_img) + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + plt.imshow(lum_img) + +Now, with a luminosity image, the default colormap (aka lookup table, LUT), is applied. The default is called jet. There are plenty of others to choose from. Let's set some others using the :meth:`~matplotlib.image.Image.set_cmap` method on our image plot object: + +.. sourcecode:: ipython + + In [8]: imgplot.set_cmap('hot') + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + imgplot = plt.imshow(lum_img) + imgplot.set_cmap('hot') + +.. sourcecode:: ipython + + In [9]: imgplot.set_cmap('spectral') + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + imgplot = plt.imshow(lum_img) + imgplot.set_cmap('spectral') + +There are many other colormap schemes available. See a list and images of the colormaps `here <http://matplotlib.sourceforge.net/examples/pylab_examples/show_colormaps.html>`_ + +.. _Color Bars + +Color scale reference +------------------------ + +It's helpful to have an idea of what value a color represents. We can do that by adding color bars. It's as easy as one line: + +.. sourcecode:: ipython + In [10]: plt.colorbar() + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + imgplot = plt.imshow(lum_img) + imgplot.set_cmap('spectral') + plt.colorbar() + +This adds a colorbar to your existing figure. This won't automatically change if you change you switch to a different colormap - you have to re-create your plot, and add in the colorbar again. + +.. _Data ranges + +Examining a specific data range +--------------------------------- + +Sometimes you want to enhance the contrast in your image, or expand the contrast in a particular region while sacrificing the detail in colors that don't vary much, or don't matter. A good tool to find interesting regions is the histogram. To create a histogram of our image data, we use the :func:`~matplotlib.pyplot.hist` function. + +.. sourcecode:: ipython + + In[10]: plt.hist(lum_img) + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + plt.hist(lum_img, range=(0.0,1.0)) + +Most often, the "interesting" part of the image is around the peak, and you can get extra contrast by clipping the regions above and/or below the peak. In our histogram, it looks like there's not much useful information in the high end (not many white things in the image). Let's adjust the upper limit, so that we effectively "zoom in on" part of the histogram. We do this by calling the :meth:`~matplotlib.image.Image.set_clim` method of the image plot object. + +.. sourcecode:: ipython + + In[11]: imgplot.set_clim=(0.0,0.7) + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + fig = plt.figure() + a=fig.add_subplot(1,2,1) + img = mpimg.imread('_static/stinkbug.png') + lum_img = img[:,:,0] + imgplot = plt.imshow(lum_img) + a.set_title('Before') + plt.colorbar(ticks=[0.1,0.3,0.5,0.7], orientation ='horizontal') + a=fig.add_subplot(1,2,2) + imgplot = plt.imshow(lum_img) + imgplot.set_clim(0.0,0.7) + a.set_title('After') + plt.colorbar(ticks=[0.1,0.3,0.5,0.7], orientation='horizontal') + +.. _Interpolation: + +Array Interpolation schemes +----------------------------------- +Interpolation calculates what the color or value of a pixel "should" be, according to different mathematical schemes. One common place that this happens is when you resize an image. The number of pixels change, but you want the same information. Since pixels are discrete, there's missing space. Interpolation is how you fill that space. This is why your images sometimes come out looking pixelated when you blow them up. The effect is more pronounced when the difference between the original image and the expanded image is greater. Let's take our image and shrink it. We're effectively discarding pixels, only keeping a select few. Now when we plot it, that data gets blown up to the size on your screen. The old pixels aren't there anymore, and the computer has to draw in pixels to fill that space. + +.. sourcecode:: ipython + + In [8]: import Image + In [9]: img = Image.open('stinkbug.png') # Open image as PIL image object + In [10]: rsize = img.resize((img.size[0]/10,img.size[1]/10)) # Use PIL to resize + In [11]: rsizeArr = np.asarray(rsize) # Get array back + In [12]: imgplot = mpimg.imshow(rsizeArr) + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + import Image + img = Image.open('_static/stinkbug.png') # opens the file using PIL - it's not an array yet + rsize = img.resize((img.size[0]/10,img.size[1]/10)) # resize the image + rsizeArr = np.asarray(rsize) + lum_img = rsizeArr[:,:,0] + imgplot = plt.imshow(rsizeArr) + +Here we have the default interpolation, bilinear, since we did not give :func:`~matplotlib.pyplot.imshow` any interpolation argument. + +Let's try some others: + +.. sourcecode:: ipython + + In [10]: imgplot.set_interpolation('nearest') + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + import Image + img = Image.open('_static/stinkbug.png') # opens the file using PIL - it's not an array yet + rsize = img.resize((img.size[0]/10,img.size[1]/10)) # resize the image + rsizeArr = np.asarray(rsize) + lum_img = rsizeArr[:,:,0] + imgplot = plt.imshow(rsizeArr) + imgplot.set_interpolation('nearest') + +.. sourcecode:: ipython + + In [10]: imgplot.set_interpolation('bicubic') + +.. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + import Image + img = Image.open('_static/stinkbug.png') # opens the file using PIL - it's not an array yet + rsize = img.resize((img.size[0]/10,img.size[1]/10)) # resize the image + rsizeArr = np.asarray(rsize) + lum_img = rsizeArr[:,:,0] + imgplot = plt.imshow(rsizeArr) + imgplot.set_interpolation('bicubic') + +Bicubic interpolation is often used when blowing up photos - people tend to prefer blurry over pixelated. \ No newline at end of file Modified: branches/v0_99_maint/doc/users/index.rst =================================================================== --- branches/v0_99_maint/doc/users/index.rst 2009年08月28日 12:20:11 UTC (rev 7581) +++ branches/v0_99_maint/doc/users/index.rst 2009年08月29日 16:35:35 UTC (rev 7582) @@ -19,6 +19,7 @@ customizing.rst shell.rst index_text.rst + image_tutorial.rst artists.rst legend_guide.rst event_handling.rst Modified: branches/v0_99_maint/doc/users/transforms_tutorial.rst =================================================================== --- branches/v0_99_maint/doc/users/transforms_tutorial.rst 2009年08月28日 12:20:11 UTC (rev 7581) +++ branches/v0_99_maint/doc/users/transforms_tutorial.rst 2009年08月29日 16:35:35 UTC (rev 7582) @@ -1,4 +1,4 @@ -.. _transformstutorial: +.. _transforms_tutorial: ************************** Transformations Tutorial Modified: branches/v0_99_maint/doc/users/whats_new.rst =================================================================== --- branches/v0_99_maint/doc/users/whats_new.rst 2009年08月28日 12:20:11 UTC (rev 7581) +++ branches/v0_99_maint/doc/users/whats_new.rst 2009年08月29日 16:35:35 UTC (rev 7582) @@ -12,6 +12,16 @@ .. _whats-new-mplot3d: +New documentation +----------------- + +Jae-Joon Lee has written two new guides :ref:`plotting-guide-legend` +and :ref:`plotting-guide-annotation`. Michael Sarahan has written +:ref:`image_tutorial`. John Hunter has written two new tutorials on +working with paths and transformations: :ref:`path_tutorial` and +:ref:`transforms_tutorial`. + + mplot3d -------- @@ -53,12 +63,6 @@ .. plot:: pyplots/whats_new_99_spines.py -New documentation ------------------ - -jae-Joon Lee has written two new guides :ref:`plotting-guide-legend` -and :ref:`plotting-guide-annotation`. - .. _whats-new-0-98-4: new in 0.98.4 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7581 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7581&view=rev Author: jswhit Date: 2009年08月28日 12:20:11 +0000 (2009年8月28日) Log Message: ----------- fix typo in comment Modified Paths: -------------- trunk/matplotlib/examples/pylab_examples/shading_example.py Modified: trunk/matplotlib/examples/pylab_examples/shading_example.py =================================================================== --- trunk/matplotlib/examples/pylab_examples/shading_example.py 2009年08月27日 20:35:07 UTC (rev 7580) +++ trunk/matplotlib/examples/pylab_examples/shading_example.py 2009年08月28日 12:20:11 UTC (rev 7581) @@ -4,14 +4,14 @@ # example showing how to make shaded relief plots # like mathematica -# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html ) +# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html) # or Generic Mapping Tools # (http://gmt.soest.hawaii.edu/gmt/doc/gmt/html/GMT_Docs/node145.html) # test data X,Y=np.mgrid[-5:5:0.05,-5:5:0.05] Z=np.sqrt(X**2+Y**2)+np.sin(X**2+Y**2) -# creat light source object. +# create light source object. ls = LightSource(azdeg=0,altdeg=65) # shade data, creating an rgb array. rgb = ls.shade(Z,plt.cm.copper) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7580 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7580&view=rev Author: astraw Date: 2009年08月27日 20:35:07 +0000 (2009年8月27日) Log Message: ----------- correct baseline image (very small tick/spine placement differences) Modified Paths: -------------- trunk/matplotlib/test/test_plots/baseline/TestPlot/shaped_data.png Modified: trunk/matplotlib/test/test_plots/baseline/TestPlot/shaped_data.png =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7579 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7579&view=rev Author: astraw Date: 2009年08月27日 20:32:28 +0000 (2009年8月27日) Log Message: ----------- correct baseline image with radial gridlines bug fixed Modified Paths: -------------- trunk/matplotlib/test/test_plots/baseline/TestPolar/polar_wrap_360.png Modified: trunk/matplotlib/test/test_plots/baseline/TestPolar/polar_wrap_360.png =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7578 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7578&view=rev Author: astraw Date: 2009年08月27日 20:30:51 +0000 (2009年8月27日) Log Message: ----------- correct baseline image with radial gridlines bug fixed Modified Paths: -------------- trunk/matplotlib/test/test_plots/baseline/TestPolar/polar_wrap_180.png Modified: trunk/matplotlib/test/test_plots/baseline/TestPolar/polar_wrap_180.png =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7577 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7577&view=rev Author: jswhit Date: 2009年08月26日 17:01:34 +0000 (2009年8月26日) Log Message: ----------- nightime regions were calculated incorrectly when solar declination < 0 (NH winter). Modified Paths: -------------- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/solar.py Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/solar.py =================================================================== --- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/solar.py 2009年08月26日 15:32:59 UTC (rev 7576) +++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/solar.py 2009年08月26日 17:01:34 UTC (rev 7577) @@ -48,19 +48,22 @@ # compute day/night terminator from hour angle, declination. longitude = lons + tau lats = np.arctan(-np.cos(longitude*dg2rad)/np.tan(dec*dg2rad))/dg2rad - return lons, lats + return lons, lats, tau, dec def daynight_grid(date, delta, lonmin, lonmax): """ date is datetime object (assumed UTC). delta is the grid interval (in degrees) used to compute terminator.""" - lons, lats = daynight_terminator(date, delta, lonmin, lonmax) + lons, lats, tau, dec = daynight_terminator(date, delta, lonmin, lonmax) # create day/night grid (1 for night, 0 for day) lats2 = np.arange(-90,90+0.5*delta,delta,dtype=np.float32) nlons = len(lons); nlats = len(lats2) lons2, lats2 = np.meshgrid(lons,lats2) lats = lats[np.newaxis,:]*np.ones((nlats,nlons),dtype=np.float32) daynight = np.ones(lons2.shape, np.int8) - daynight = np.where(lats2>lats,0,daynight) + if dec > 0: # NH summer + daynight = np.where(lats2>lats,0,daynight) + else: # NH winter + daynight = np.where(lats2<lats,0,daynight) daynight = ma.array(daynight,mask=1-daynight) # mask day areas. return lons2,lats2,daynight This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7576 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7576&view=rev Author: jswhit Date: 2009年08月26日 15:32:59 +0000 (2009年8月26日) Log Message: ----------- added mention of new example. Modified Paths: -------------- trunk/toolkits/basemap/Changelog Modified: trunk/toolkits/basemap/Changelog =================================================================== --- trunk/toolkits/basemap/Changelog 2009年08月26日 15:29:57 UTC (rev 7575) +++ trunk/toolkits/basemap/Changelog 2009年08月26日 15:32:59 UTC (rev 7576) @@ -1,5 +1,6 @@ version 0.99.5 (not yet released) * added 'nightshade' method to shade night regions on a map. + 'daynight.py' example added to illustrate usage. * added lonmin, lonmax instance variables. version 0.99.4 (svn revision 7332) * ax.frame replaced with ax.spines to maintain compatibility This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7575 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7575&view=rev Author: jswhit Date: 2009年08月26日 15:29:57 +0000 (2009年8月26日) Log Message: ----------- format date in title Modified Paths: -------------- trunk/toolkits/basemap/examples/daynight.py Modified: trunk/toolkits/basemap/examples/daynight.py =================================================================== --- trunk/toolkits/basemap/examples/daynight.py 2009年08月26日 11:52:06 UTC (rev 7574) +++ trunk/toolkits/basemap/examples/daynight.py 2009年08月26日 15:29:57 UTC (rev 7575) @@ -19,5 +19,5 @@ # map shows through. Use current time in UTC. date = datetime.utcnow() CS=map.nightshade(date) -plt.title('Day/Night Map for %s (UTC)' % date) +plt.title('Day/Night Map for %s (UTC)' % date.strftime("%d %b %Y %H:%M:%S")) plt.show() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7574 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7574&view=rev Author: jswhit Date: 2009年08月26日 11:52:06 +0000 (2009年8月26日) Log Message: ----------- check that date is utc in nightshade Modified Paths: -------------- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py =================================================================== --- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2009年08月26日 11:33:41 UTC (rev 7573) +++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2009年08月26日 11:52:06 UTC (rev 7574) @@ -3445,6 +3445,9 @@ returns a matplotlib.contour.ContourSet instance. """ from solar import daynight_grid + # make sure date is utc. + if date.utcoffset() is not None: + raise ValueError('datetime instance must be UTC') # create grid of day=0, night=1 lons,lats,daynight = daynight_grid(date,delta,self.lonmin,self.lonmax) x,y = self(lons,lats) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7573 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7573&view=rev Author: jswhit Date: 2009年08月26日 11:33:41 +0000 (2009年8月26日) Log Message: ----------- up version number Modified Paths: -------------- trunk/toolkits/basemap/doc/conf.py Modified: trunk/toolkits/basemap/doc/conf.py =================================================================== --- trunk/toolkits/basemap/doc/conf.py 2009年08月26日 11:32:41 UTC (rev 7572) +++ trunk/toolkits/basemap/doc/conf.py 2009年08月26日 11:33:41 UTC (rev 7573) @@ -46,9 +46,9 @@ # other places throughout the built documents. # # The short X.Y version. -version = '0.99.4' +version = '0.99.5' # The full version, including alpha/beta/rc tags. -release = '0.99.4' +release = '0.99.5' # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
Revision: 7572 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7572&view=rev Author: jswhit Date: 2009年08月26日 11:32:41 +0000 (2009年8月26日) Log Message: ----------- cosmetic cleanup. Modified Paths: -------------- trunk/toolkits/basemap/examples/daynight.py Modified: trunk/toolkits/basemap/examples/daynight.py =================================================================== --- trunk/toolkits/basemap/examples/daynight.py 2009年08月26日 01:12:32 UTC (rev 7571) +++ trunk/toolkits/basemap/examples/daynight.py 2009年08月26日 11:32:41 UTC (rev 7572) @@ -5,6 +5,7 @@ # example showing how to compute the day/night terminator and shade nightime # areas on a map. + # miller projection map = Basemap(projection='mill',lon_0=180) # plot coastlines, draw label meridians and parallels. @@ -14,9 +15,8 @@ # fill continents 'coral' (with zorder=0), color wet areas 'aqua' map.drawmapboundary(fill_color='aqua') map.fillcontinents(color='coral',lake_color='aqua') -# shade the night areas gray, with alpha transparency so the -# map shows through. -# use current time in UTC. +# shade the night areas, with alpha transparency so the +# map shows through. Use current time in UTC. date = datetime.utcnow() CS=map.nightshade(date) plt.title('Day/Night Map for %s (UTC)' % date) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.