Revision: 7753
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7753&view=rev
Author:   leejjoon
Date:     2009-09-13 05:44:21 +0000 (Sun, 13 Sep 2009)

Log Message:
-----------
AxesGrid: add modified version of colorbar

Modified Paths:
--------------
    trunk/matplotlib/CHANGELOG
    trunk/matplotlib/doc/mpl_toolkits/axes_grid/index.rst
    trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/axes_divider.rst
    trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/axislines.rst
    trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/overview.rst
    trunk/matplotlib/examples/axes_grid/demo_axes_grid.py
    trunk/matplotlib/lib/mpl_toolkits/axes_grid/axes_divider.py
    trunk/matplotlib/lib/mpl_toolkits/axes_grid/axes_grid.py

Added Paths:
-----------
    trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/
    
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py
    
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py
    
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py
    trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py
    trunk/matplotlib/examples/axes_grid/demo_axes_grid2.py
    trunk/matplotlib/examples/axes_grid/demo_colorbar_with_inset_locator.py
    trunk/matplotlib/lib/mpl_toolkits/axes_grid/colorbar.py

Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG  2009-09-13 05:42:01 UTC (rev 7752)
+++ trunk/matplotlib/CHANGELOG  2009-09-13 05:44:21 UTC (rev 7753)
@@ -1,3 +1,6 @@
+2009-09-13 AxesGrid : add modified version of colorbar. Add colorbar 
+           location howto. - JJL
+
 2009-09-07 AxesGrid : implemented axisline style. 
            Added a demo examples/axes_grid/demo_axisline_style.py- JJL
 

Added: 
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py
===================================================================
--- 
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py
                          (rev 0)
+++ 
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py
  2009-09-13 05:44:21 UTC (rev 7753)
@@ -0,0 +1,49 @@
+import matplotlib.pyplot as plt
+
+from mpl_toolkits.axes_grid.inset_locator import inset_axes, zoomed_inset_axes
+from mpl_toolkits.axes_grid.colorbar import colorbar
+
+def get_demo_image():
+    from matplotlib.cbook import get_sample_data
+    import numpy as np
+    f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False)
+    z = np.load(f)
+    # z is a numpy array of 15x15
+    return z, (-3,4,-4,3)
+
+
+fig = plt.figure(1, [5,4])
+ax = fig.add_subplot(111)
+
+Z, extent = get_demo_image()
+
+ax.set(aspect=1,
+       xlim=(-15, 15),
+       ylim=(-20, 5))
+
+
+axins = zoomed_inset_axes(ax, 2, loc=2) # zoom = 6
+im = axins.imshow(Z, extent=extent, interpolation="nearest",
+                  origin="lower")
+
+plt.xticks(visible=False)
+plt.yticks(visible=False)
+
+
+# colorbar
+cax = inset_axes(axins,
+                 width="5%", # width = 10% of parent_bbox width
+                 height="100%", # height : 50%
+                 loc=3,
+                 bbox_to_anchor=(1.05, 0., 1, 1),
+                 bbox_transform=axins.transAxes,
+                 borderpad=0,
+                 )
+
+
+colorbar(im, cax=cax) #, ticks=[1,2,3])
+
+
+plt.draw()
+plt.show()
+

Added: 
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py
===================================================================
--- 
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py
                              (rev 0)
+++ 
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py
      2009-09-13 05:44:21 UTC (rev 7753)
@@ -0,0 +1,25 @@
+import matplotlib.pyplot as plt
+from mpl_toolkits.axes_grid.axes_divider import make_axes_locatable
+
+from mpl_toolkits.axes_grid.colorbar import colorbar
+# from matplotlib.pyplot import colorbar
+
+fig = plt.figure(1, figsize=(6, 3))
+fig.subplots_adjust(wspace=0.5)
+
+ax1 = fig.add_subplot(121)
+im1 = ax1.imshow([[1,2],[3,4]])
+
+ax1_divider = make_axes_locatable(ax1)
+cax1 = ax1_divider.append_axes("right", size="7%", pad="2%")
+cb1 = colorbar(im1, cax=cax1)
+
+ax2 = fig.add_subplot(122)
+im2 = ax2.imshow([[1,2],[3,4]])
+
+ax2_divider = make_axes_locatable(ax2)
+cax2 = ax2_divider.append_axes("top", size="7%", pad="2%")
+cb2 = colorbar(im2, cax=cax2, orientation="horizontal")
+cax2.xaxis.set_ticks_position("top")
+plt.show()
+

Added: 
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py
===================================================================
--- 
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py
                             (rev 0)
+++ 
trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py
     2009-09-13 05:44:21 UTC (rev 7753)
@@ -0,0 +1,40 @@
+import matplotlib.pyplot as plt
+
+from mpl_toolkits.axes_grid.inset_locator import inset_axes
+from mpl_toolkits.axes_grid.colorbar import colorbar
+
+fig = plt.figure(1, [6, 3])
+
+# first subplot
+ax1 = fig.add_subplot(121)
+
+axins1 = inset_axes(ax1,
+                    width="50%", # width = 10% of parent_bbox width
+                    height="5%", # height : 50%
+                    loc=1)
+
+im1=ax1.imshow([[1,2],[2, 3]])
+colorbar(im1, cax=axins1, orientation="horizontal", ticks=[1,2,3])
+axins1.xaxis.set_ticks_position("bottom")
+
+# first subplot
+ax = fig.add_subplot(122)
+
+axins = inset_axes(ax,
+                   width="5%", # width = 10% of parent_bbox width
+                   height="50%", # height : 50%
+                   loc=3,
+                   bbox_to_anchor=(1.05, 0., 1, 1),
+                   bbox_transform=ax.transAxes,
+                   borderpad=0,
+                   )
+
+# Controlling the placement of the inset axes is basically same as that
+# of the legend.  you may want to play with the borderpad value and
+# the bbox_to_anchor coordinate.
+
+im=ax.imshow([[1,2],[2, 3]])
+colorbar(im, cax=axins, ticks=[1,2,3])
+
+plt.draw()
+plt.show()

Added: trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py
===================================================================
--- trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py    
                        (rev 0)
+++ trunk/matplotlib/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py    
2009-09-13 05:44:21 UTC (rev 7753)
@@ -0,0 +1,21 @@
+import matplotlib.pyplot as plt
+
+plt.rcParams["text.usetex"]=False
+
+fig = plt.figure(1, figsize=(6, 3))
+
+ax1 = fig.add_subplot(121)
+im1 = ax1.imshow([[1,2],[3,4]])
+cb1 = plt.colorbar(im1)
+cb1.ax.set_yticks([1, 3])
+ax1.set_title("Original MPL's colorbar w/\nset_yticks([1,3])", size=10)
+
+from mpl_toolkits.axes_grid.colorbar import colorbar
+ax2 = fig.add_subplot(122)
+im2 = ax2.imshow([[1,2],[3,4]])
+cb2 = colorbar(im2)
+cb2.ax.set_yticks([1, 3])
+ax2.set_title("AxesGrid's colorbar w/\nset_yticks([1,3])", size=10)
+
+plt.show()
+

Modified: trunk/matplotlib/doc/mpl_toolkits/axes_grid/index.rst
===================================================================
--- trunk/matplotlib/doc/mpl_toolkits/axes_grid/index.rst       2009-09-13 
05:42:01 UTC (rev 7752)
+++ trunk/matplotlib/doc/mpl_toolkits/axes_grid/index.rst       2009-09-13 
05:44:21 UTC (rev 7753)
@@ -8,10 +8,12 @@
 ease displaying multiple images in matplotlib.  While the aspect
 parameter in matplotlib adjust the position of the single axes,
 AxesGrid toolkit provides a framework to adjust the position of
-multiple axes according to their aspects. 
+multiple axes according to their aspects.
 
 
+.. image:: ../../_static/demo_axes_grid.png
 
+
 Documentation
 =============
 
@@ -19,4 +21,5 @@
    :maxdepth: 2
 
    users/index.rst
+   howtos/index.rst
    api/index.rst

Modified: trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/axes_divider.rst
===================================================================
--- trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/axes_divider.rst  
2009-09-13 05:42:01 UTC (rev 7752)
+++ trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/axes_divider.rst  
2009-09-13 05:44:21 UTC (rev 7753)
@@ -81,12 +81,12 @@
 
 See the example,
 
-.. plot:: mpl_toolkits/axes_grid/figures/simple_axes_divider2.py
+.. plot:: mpl_toolkits/axes_grid/examples/simple_axes_divider2.py
    :include-source:
 
 You can adjust the size of the each axes accroding to their x or y
 data limits (AxesX and AxesY), similar to the axes aspect parameter.
 
-.. plot:: mpl_toolkits/axes_grid/figures/simple_axes_divider3.py
+.. plot:: mpl_toolkits/axes_grid/examples/simple_axes_divider3.py
    :include-source:
 

Modified: trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/axislines.rst
===================================================================
--- trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/axislines.rst     
2009-09-13 05:42:01 UTC (rev 7752)
+++ trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/axislines.rst     
2009-09-13 05:44:21 UTC (rev 7753)
@@ -29,7 +29,7 @@
 * a curvelinear grid.
 * a floating axis
 
-.. plot:: mpl_toolkits/axes_grid/figures/demo_floating_axis.py
+.. plot:: mpl_toolkits/axes_grid/examples/demo_floating_axis.py
 
 
 *axes_grid.axislines.Axes* defines a *axis* attribute, which is a
@@ -211,7 +211,7 @@
     ax1.parasites.append(ax2)
 
 
-.. plot:: mpl_toolkits/axes_grid/figures/demo_curvelinear_grid.py
+.. plot:: mpl_toolkits/axes_grid/examples/demo_curvelinear_grid.py
 
 
 

Modified: trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/overview.rst
===================================================================
--- trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/overview.rst      
2009-09-13 05:42:01 UTC (rev 7752)
+++ trunk/matplotlib/doc/mpl_toolkits/axes_grid/users/overview.rst      
2009-09-13 05:44:21 UTC (rev 7753)
@@ -35,7 +35,7 @@
 padding between them cannot be easily done in matplotlib. AxesGrid is
 used in such case.
 
-.. plot:: mpl_toolkits/axes_grid/figures/simple_axesgrid.py
+.. plot:: mpl_examples/axes_grid/simple_axesgrid.py
    :include-source:
 
 * The postion of each axes is determined at the drawing time (see
@@ -49,7 +49,7 @@
   height. The widths (height) of the axes in the same row (column) are
   scaled according to their view limits (xlim or ylim).
 
-  .. plot:: mpl_toolkits/axes_grid/figures/simple_axesgrid2.py
+  .. plot:: mpl_toolkits/axes_grid/examples/simple_axesgrid2.py
      :include-source:
 
 * xaxis are shared among axes in a same column. Similarly, yaxis are
@@ -137,7 +137,7 @@
 
 The examples below show what you can do with AxesGrid.
 
-.. plot:: mpl_toolkits/axes_grid/figures/demo_axes_grid.py
+.. plot:: mpl_toolkits/axes_grid/examples/demo_axes_grid.py
 
 
 RGB Axes
@@ -158,7 +158,7 @@
                   origin="lower", interpolation="nearest")
 
 
-.. plot:: mpl_toolkits/axes_grid/figures/simple_rgb.py
+.. plot:: mpl_toolkits/axes_grid/examples/simple_rgb.py
 
 
 
@@ -219,7 +219,7 @@
 See the full source code below.
 
 
-.. plot:: mpl_toolkits/axes_grid/figures/scatter_hist.py
+.. plot:: mpl_toolkits/axes_grid/examples/scatter_hist.py
 
 
 The scatter_hist using the AxesDivider has some advantage over the
@@ -246,7 +246,7 @@
 Example 1. twinx
 ----------------
 
-.. plot:: mpl_toolkits/axes_grid/figures/parasite_simple.py
+.. plot:: mpl_toolkits/axes_grid/examples/parasite_simple.py
    :include-source:
 
 Example 2. twin
@@ -257,7 +257,7 @@
 accordingly.
 
 
-.. plot:: mpl_toolkits/axes_grid/figures/parasite_simple2.py
+.. plot:: mpl_toolkits/axes_grid/examples/parasite_simple2.py
 
 
 
@@ -290,13 +290,13 @@
   ax.axis["top"].set_visible(False)
 
 
-.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline3.py
+.. plot:: mpl_toolkits/axes_grid/examples/simple_axisline3.py
 
 
 SubplotZero gives you two more additional (floating?) axis of x=0 and
 y=0 (in data coordinate)
 
-.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline2.py
+.. plot:: mpl_toolkits/axes_grid/examples/simple_axisline2.py
    :include-source:
 
 
@@ -315,7 +315,7 @@
                        r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"])
 
 
-.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline4.py
+.. plot:: mpl_toolkits/axes_grid/examples/simple_axisline4.py
 
 
 AxisLine Axes lets you create a custom axis, ::
@@ -330,7 +330,7 @@
 And, you can use it with parasiteAxes.
 
 
-.. plot:: mpl_toolkits/axes_grid/figures/demo_parasite_axes2.py
+.. plot:: mpl_toolkits/axes_grid/examples/demo_parasite_axes2.py
 
 
 AnchoredArtists
@@ -343,7 +343,7 @@
 in the example below will have width and height in the data
 coordinate.
 
-.. plot:: mpl_toolkits/axes_grid/figures/simple_anchored_artists.py
+.. plot:: mpl_toolkits/axes_grid/examples/simple_anchored_artists.py
    :include-source:
 
 
@@ -377,7 +377,7 @@
 creates an inset axes whose data scale is half of the parent axes.
 Here is complete examples.
 
-.. plot:: mpl_toolkits/axes_grid/figures/inset_locator_demo.py
+.. plot:: mpl_toolkits/axes_grid/examples/inset_locator_demo.py
 
 For example, :func:`zoomed_inset_axes` can be used when you want the
 inset represents the zoom-up of the small portion in the parent axes.
@@ -385,7 +385,7 @@
 function :func:`mark_inset` to mark the location of the area
 represented by the inset axes.
 
-.. plot:: mpl_toolkits/axes_grid/figures/inset_locator_demo2.py
+.. plot:: mpl_toolkits/axes_grid/examples/inset_locator_demo2.py
    :include-source:
 
 
@@ -395,6 +395,6 @@
 You can draw a cuvelinear grid and ticks. Also a floating axis can be
 created. See :ref:`axislines-manual` for more details.
 
-.. plot:: mpl_toolkits/axes_grid/figures/demo_floating_axis.py
+.. plot:: mpl_toolkits/axes_grid/examples/demo_floating_axis.py
 
 

Modified: trunk/matplotlib/examples/axes_grid/demo_axes_grid.py
===================================================================
--- trunk/matplotlib/examples/axes_grid/demo_axes_grid.py       2009-09-13 
05:42:01 UTC (rev 7752)
+++ trunk/matplotlib/examples/axes_grid/demo_axes_grid.py       2009-09-13 
05:44:21 UTC (rev 7753)
@@ -44,7 +44,7 @@
     Z, extent = get_demo_image()
     for i in range(4):
         im = grid[i].imshow(Z, extent=extent, interpolation="nearest")
-    plt.colorbar(im, cax = grid.cbar_axes[0])
+    #plt.colorbar(im, cax = grid.cbar_axes[0])
     grid.cbar_axes[0].colorbar(im)
 
     # This affects all axes as share_all = True.

Added: trunk/matplotlib/examples/axes_grid/demo_axes_grid2.py
===================================================================
--- trunk/matplotlib/examples/axes_grid/demo_axes_grid2.py                      
        (rev 0)
+++ trunk/matplotlib/examples/axes_grid/demo_axes_grid2.py      2009-09-13 
05:44:21 UTC (rev 7753)
@@ -0,0 +1,124 @@
+import matplotlib.pyplot as plt
+from mpl_toolkits.axes_grid import ImageGrid
+import numpy as np
+
+def get_demo_image():
+    from matplotlib.cbook import get_sample_data
+    f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False)
+    z = np.load(f)
+    # z is a numpy array of 15x15
+    return z, (-3,4,-4,3)
+
+
+def add_inner_title(ax, title, loc, size=None, **kwargs):
+    from matplotlib.offsetbox import AuxTransformBox, AnchoredOffsetbox
+    from matplotlib.font_manager import FontProperties
+    from matplotlib.patches import PathPatch
+    from matplotlib.textpath import TextPath
+    from matplotlib.transforms import IdentityTransform
+    if size is None:
+        size = FontProperties(size=plt.rcParams['legend.fontsize'])
+    text_path = TextPath((0, 0), title, size=10)
+    p1 = PathPatch(text_path, ec="w", lw=3, transform=IdentityTransform())
+    p2 = PathPatch(text_path, ec="none", fc="k", transform=IdentityTransform())
+
+    offsetbox = AuxTransformBox(IdentityTransform())
+    offsetbox.add_artist(p1)
+    offsetbox.add_artist(p2)
+
+    ao = AnchoredOffsetbox(loc=loc, child=offsetbox,
+                           pad=0., borderpad=0.5,
+                           frameon=False, **kwargs)
+    ax.add_artist(ao)
+
+    return ao
+
+if __name__ == "__main__":
+    F = plt.figure(1, (6, 6))
+    F.clf()
+
+    # prepare images
+    Z, extent = get_demo_image()
+    ZS = [Z[i::3,:] for i in range(3)]
+    extent = extent[0], extent[1]/3., extent[2], extent[3]
+
+    # demo 1 : colorbar at each axes
+
+    grid = ImageGrid(F, 211, # similar to subplot(111)
+                    nrows_ncols = (1, 3),
+                    direction="row",
+                    axes_pad = 0.05,
+                    add_all=True,
+                    label_mode = "1",
+                    share_all = True,
+                    cbar_location="top",
+                    cbar_mode="each",
+                    cbar_size="7%",
+                    cbar_pad="1%",
+                    )
+
+
+    for ax, z in zip(grid, ZS):
+        im = ax.imshow(z, origin="lower", extent=extent, 
interpolation="nearest")
+        ax.cax.colorbar(im)
+
+    for ax, im_title in zip(grid, ["Image 1", "Image 2", "Image 3"]):
+        t = add_inner_title(ax, im_title, loc=3)
+        t.patch.set_alpha(0.5)
+
+    for ax, z in zip(grid, ZS):
+        ax.cax.toggle_label(True)
+        axis = ax.cax.axis[ax.cax.orientation]
+        axis.label.set_text("counts s$^{-1}$")
+        axis.label.set_size(10)
+        axis.major_ticklabels.set_size(6)
+
+    # changing the colorbar ticks
+    grid[1].cax.set_xticks([-1, 0, 1])
+    grid[2].cax.set_xticks([-1, 0, 1])
+
+    grid[0].set_xticks([-2, 0])
+    grid[0].set_yticks([-2, 0, 2])
+
+
+    # demo 2 : shared colorbar
+
+    grid2 = ImageGrid(F, 212,
+                      nrows_ncols = (1, 3),
+                      direction="row",
+                      axes_pad = 0.05,
+                      add_all=True,
+                      label_mode = "1",
+                      share_all = True,
+                      cbar_location="right",
+                      cbar_mode="single",
+                      cbar_size="10%",
+                      cbar_pad=0.05,
+                      )
+
+    grid2[0].set_xlabel("X")
+    grid2[0].set_ylabel("Y")
+
+    vmax, vmin = np.max(ZS), np.min(ZS)
+    import matplotlib.colors
+    norm = matplotlib.colors.normalize(vmax=vmax, vmin=vmin)
+
+    for ax, z in zip(grid2, ZS):
+        im = ax.imshow(z, norm=norm,
+                       origin="lower", extent=extent,
+                       interpolation="nearest")
+
+    # With cbar_mode="single", cax attribute of all axes are identical.
+    ax.cax.colorbar(im)
+    ax.cax.toggle_label(True)
+
+    for ax, im_title in zip(grid2, ["(a)", "(b)", "(c)"]):
+        t = add_inner_title(ax, im_title, loc=2)
+        t.patch.set_ec("none")
+        t.patch.set_alpha(0.5)
+
+    grid2[0].set_xticks([-2, 0])
+    grid2[0].set_yticks([-2, 0, 2])
+
+    plt.draw()
+    plt.show()

Added: trunk/matplotlib/examples/axes_grid/demo_colorbar_with_inset_locator.py
===================================================================
--- trunk/matplotlib/examples/axes_grid/demo_colorbar_with_inset_locator.py     
                        (rev 0)
+++ trunk/matplotlib/examples/axes_grid/demo_colorbar_with_inset_locator.py     
2009-09-13 05:44:21 UTC (rev 7753)
@@ -0,0 +1,44 @@
+import matplotlib.pyplot as plt
+
+from mpl_toolkits.axes_grid.inset_locator import inset_axes
+#from mpl_toolkits.axes_grid.colorbar import colorbar
+
+fig = plt.figure(1, [6, 3])
+
+# first subplot
+ax1 = fig.add_subplot(121)
+
+axins1 = inset_axes(ax1,
+                    width="50%", # width = 10% of parent_bbox width
+                    height="5%", # height : 50%
+                    loc=1)
+
+locator1=axins1.get_axes_locator()
+
+im1=ax1.imshow([[1,2],[2, 3]])
+colorbar(im1, cax=axins1, orientation="horizontal", ticks=[1,2,3])
+axins1.xaxis.set_ticks_position("bottom")
+
+# first subplot
+ax = fig.add_subplot(122)
+
+axins = inset_axes(ax,
+                   width="5%", # width = 10% of parent_bbox width
+                   height="50%", # height : 50%
+                   loc=3,
+                   bbox_to_anchor=(1.05, 0., 1, 1),
+                   bbox_transform=ax.transAxes,
+                   borderpad=0,
+                   )
+
+
+locator=axins.get_axes_locator()
+# Controlling the placement of the inset axes is basically same as that
+# of the legend.  you may want to play with the borderpad value and
+# the bbox_to_anchor coordinate.
+
+im=ax.imshow([[1,2],[2, 3]])
+colorbar(im, cax=axins)
+
+plt.draw()
+plt.show()

Modified: trunk/matplotlib/lib/mpl_toolkits/axes_grid/axes_divider.py
===================================================================
--- trunk/matplotlib/lib/mpl_toolkits/axes_grid/axes_divider.py 2009-09-13 
05:42:01 UTC (rev 7752)
+++ trunk/matplotlib/lib/mpl_toolkits/axes_grid/axes_divider.py 2009-09-13 
05:44:21 UTC (rev 7753)
@@ -502,6 +502,31 @@
         return ax
 
 
+    def append_axes(self, position, size, pad=None, **kwargs):
+        """
+        create an axes at the given *position* with the same height
+        (or width) of the main axes.
+
+         *position*
+           ["left"|"right"|"bottom"|"top"]
+           
+         *size* and *pad* should be axes_grid.axes_size compatible.
+        """
+
+        if position == "left":
+            ax = self.new_horizontal(size, pad, pack_start=True, **kwargs)
+        elif position == "right":
+            ax = self.new_horizontal(size, pad, pack_start=False, **kwargs)
+        elif position == "bottom":
+            ax = self.new_vertical(size, pad, pack_start=True, **kwargs)
+        elif position == "top":
+            ax = self.new_vertical(size, pad, pack_start=False, **kwargs)
+        else:
+            raise ValueError("the position must be one of left, right, bottom, 
or top")
+
+        self._fig.add_axes(ax)
+        return ax
+
     def get_aspect(self):
         if self._aspect is None:
             aspect = self._axes.get_aspect()

Modified: trunk/matplotlib/lib/mpl_toolkits/axes_grid/axes_grid.py
===================================================================
--- trunk/matplotlib/lib/mpl_toolkits/axes_grid/axes_grid.py    2009-09-13 
05:42:01 UTC (rev 7752)
+++ trunk/matplotlib/lib/mpl_toolkits/axes_grid/axes_grid.py    2009-09-13 
05:44:21 UTC (rev 7753)
@@ -2,7 +2,8 @@
 
 import matplotlib.pyplot as plt
 import matplotlib.axes as maxes
-import matplotlib.colorbar as mcolorbar
+#import matplotlib.colorbar as mcolorbar
+import colorbar as mcolorbar
 import matplotlib as mpl
 import matplotlib.patches as mpatches
 import matplotlib.lines as mlines
@@ -10,8 +11,8 @@
 
 from axes_divider import Size, SubplotDivider, LocatableAxes, Divider
 
+import numpy as np
 
-
 def _tick_only(ax, bottom_on, left_on):
     bottom_off = not bottom_on
     left_off = not left_on
@@ -28,7 +29,7 @@
         ax.axis["left"].label.set_visible(left_off)
 
 class Colorbar(mcolorbar.Colorbar):
-    def _config_axes(self, X, Y):
+    def _config_axes_deprecated(self, X, Y):
         '''
         Make an axes patch and outline.
         '''
@@ -431,6 +432,7 @@
                  cbar_location="right",
                  cbar_pad=None,
                  cbar_size="5%",
+                 cbar_set_cax=True,
                  axes_class=None,
                  ):
         """
@@ -456,9 +458,13 @@
           cbar_location     "right"   [ "right" | "top" ]
           cbar_pad          None
           cbar_size         "5%"
+          cbar_set_cax      True      [ True | False ]
           axes_class        None      a type object which must be a subclass
                                       of :class:`~matplotlib.axes.Axes`
           ================  ========  =========================================
+
+        *cbar_set_cax* : if True, each axes in the grid has a cax
+          attribute that is bind to associated cbar_axes.
         """
         self._nrows, self._ncols = nrows_ncols
 
@@ -568,6 +574,14 @@
             for ax in self.axes_all+self.cbar_axes:
                 fig.add_axes(ax)
 
+        if cbar_set_cax:
+            if self._colorbar_mode == "single":
+                for ax in self.axes_all:
+                    ax.cax = self.cbar_axes[0]
+            else:
+                for ax, cax in zip(self.axes_all, self.cbar_axes):
+                    ax.cax = cax
+
         self.set_label_mode(label_mode)
 
 
@@ -683,8 +697,8 @@
 
 
 
-if __name__ == "__main__":
-#if 0:
+#if __name__ == "__main__":
+if 0:
     from axes_divider import get_demo_image
     F = plt.figure(1, (9, 3.5))
     F.clf()
@@ -761,3 +775,5 @@
 
     plt.ion()
     plt.draw()
+
+

Added: trunk/matplotlib/lib/mpl_toolkits/axes_grid/colorbar.py
===================================================================
--- trunk/matplotlib/lib/mpl_toolkits/axes_grid/colorbar.py                     
        (rev 0)
+++ trunk/matplotlib/lib/mpl_toolkits/axes_grid/colorbar.py     2009-09-13 
05:44:21 UTC (rev 7753)
@@ -0,0 +1,816 @@
+'''
+Colorbar toolkit with two classes and a function:
+
+    :class:`ColorbarBase`
+        the base class with full colorbar drawing functionality.
+        It can be used as-is to make a colorbar for a given colormap;
+        a mappable object (e.g., image) is not needed.
+
+    :class:`Colorbar`
+        the derived class for use with images or contour plots.
+
+    :func:`make_axes`
+        a function for resizing an axes and adding a second axes
+        suitable for a colorbar
+
+The :meth:`~matplotlib.figure.Figure.colorbar` method uses :func:`make_axes`
+and :class:`Colorbar`; the :func:`~matplotlib.pyplot.colorbar` function
+is a thin wrapper over :meth:`~matplotlib.figure.Figure.colorbar`.
+
+'''
+
+import numpy as np
+import matplotlib as mpl
+import matplotlib.colors as colors
+import matplotlib.cm as cm
+from matplotlib import docstring
+import matplotlib.ticker as ticker
+import matplotlib.cbook as cbook
+import matplotlib.collections as collections
+import matplotlib.contour as contour
+from matplotlib.path import Path
+from matplotlib.patches import PathPatch
+from matplotlib.transforms import Bbox
+
+
+make_axes_kw_doc = '''
+
+    ============= ====================================================
+    Property      Description
+    ============= ====================================================
+    *orientation* vertical or horizontal
+    *fraction*    0.15; fraction of original axes to use for colorbar
+    *pad*         0.05 if vertical, 0.15 if horizontal; fraction
+                  of original axes between colorbar and new image axes
+    *shrink*      1.0; fraction by which to shrink the colorbar
+    *aspect*      20; ratio of long to short dimensions
+    ============= ====================================================
+
+'''
+
+colormap_kw_doc = '''
+
+    ===========   ====================================================
+    Property      Description
+    ===========   ====================================================
+    *extend*      [ 'neither' | 'both' | 'min' | 'max' ]
+                  If not 'neither', make pointed end(s) for out-of-
+                  range values.  These are set for a given colormap
+                  using the colormap set_under and set_over methods.
+    *spacing*     [ 'uniform' | 'proportional' ]
+                  Uniform spacing gives each discrete color the same
+                  space; proportional makes the space proportional to
+                  the data interval.
+    *ticks*       [ None | list of ticks | Locator object ]
+                  If None, ticks are determined automatically from the
+                  input.
+    *format*      [ None | format string | Formatter object ]
+                  If None, the
+                  :class:`~matplotlib.ticker.ScalarFormatter` is used.
+                  If a format string is given, e.g. '%.3f', that is
+                  used. An alternative
+                  :class:`~matplotlib.ticker.Formatter` object may be
+                  given instead.
+    *drawedges*   [ False | True ] If true, draw lines at color
+                  boundaries.
+    ===========   ====================================================
+
+    The following will probably be useful only in the context of
+    indexed colors (that is, when the mappable has norm=NoNorm()),
+    or other unusual circumstances.
+
+    ============   ===================================================
+    Property       Description
+    ============   ===================================================
+    *boundaries*   None or a sequence
+    *values*       None or a sequence which must be of length 1 less
+                   than the sequence of *boundaries*. For each region
+                   delimited by adjacent entries in *boundaries*, the
+                   color mapped to the corresponding value in values
+                   will be used.
+    ============   ===================================================
+
+'''
+
+colorbar_doc = '''
+
+Add a colorbar to a plot.
+
+Function signatures for the :mod:`~matplotlib.pyplot` interface; all
+but the first are also method signatures for the
+:meth:`~matplotlib.figure.Figure.colorbar` method::
+
+  colorbar(**kwargs)
+  colorbar(mappable, **kwargs)
+  colorbar(mappable, cax=cax, **kwargs)
+  colorbar(mappable, ax=ax, **kwargs)
+
+arguments:
+
+  *mappable*
+    the :class:`~matplotlib.image.Image`,
+    :class:`~matplotlib.contour.ContourSet`, etc. to
+    which the colorbar applies; this argument is mandatory for the
+    :meth:`~matplotlib.figure.Figure.colorbar` method but optional for the
+    :func:`~matplotlib.pyplot.colorbar` function, which sets the
+    default to the current image.
+
+keyword arguments:
+
+  *cax*
+    None | axes object into which the colorbar will be drawn
+  *ax*
+    None | parent axes object from which space for a new
+    colorbar axes will be stolen
+
+
+Additional keyword arguments are of two kinds:
+
+  axes properties:
+%s
+  colorbar properties:
+%s
+
+If *mappable* is a :class:`~matplotlib.contours.ContourSet`, its *extend*
+kwarg is included automatically.
+
+Note that the *shrink* kwarg provides a simple way to keep a vertical
+colorbar, for example, from being taller than the axes of the mappable
+to which the colorbar is attached; but it is a manual method requiring
+some trial and error. If the colorbar is too tall (or a horizontal
+colorbar is too wide) use a smaller value of *shrink*.
+
+For more precise control, you can manually specify the positions of
+the axes objects in which the mappable and the colorbar are drawn.  In
+this case, do not use any of the axes properties kwargs.
+
+returns:
+    :class:`~matplotlib.colorbar.Colorbar` instance; see also its base class,
+    :class:`~matplotlib.colorbar.ColorbarBase`.  Call the
+    :meth:`~matplotlib.colorbar.ColorbarBase.set_label` method
+    to label the colorbar.
+
+
+The transData of the *cax* is adjusted so that the limits in the
+longest axis actually corresponds to the limits in colorbar range. On
+the other hand, the shortest axis has a data limits of [1,2], whose
+unconventional value is to prevent underflow when log scale is used.
+''' % (make_axes_kw_doc, colormap_kw_doc)
+
+docstring.interpd.update(colorbar_doc=colorbar_doc)
+
+
+class CbarAxesLocator(object):
+    """
+    CbarAxesLocator is a axes_locator for colobar axes. It adjust the
+    position of the axes to make a room for extended ends, i.e., the
+    extended ends are located outside the axes area.
+    """
+
+    def __init__(self, locator=None, extend="neither", orientation="vertical"):
+        """
+        *locator* : the bbox returned from the locator is used as a
+            initial axes location. If None, axes.bbox is used.
+
+        *extend* : same as in ColorbarBase
+        *orientation* : same as in ColorbarBase
+
+        """
+        self._locator = locator
+        self.extesion_fraction = 0.05
+        self.extend = extend
+        self.orientation = orientation
+
+    def get_original_position(self, axes, renderer):
+        """
+        get the original position of the axes.
+        """
+        if self._locator is None:
+            bbox = axes.get_position(original=True)
+        else:
+            bbox = self._locator(axes, renderer)
+        return bbox
+
+    def get_end_vertices(self):
+        """
+        return a tuple of two vertices for the colorbar extended ends.
+        The first vertives is for min. end, and the second is for
+        max. end.
+        """
+        # Note that concatenating two vertices needs to make a
+        # vertices for the frame.
+        extesion_fraction = self.extesion_fraction
+
+        corx = extesion_fraction*2.
+        cory = 1./(1. - corx)
+        x1, y1, w, h = 0, 0, 1, 1
+        x2, y2 = x1 + w, y1 + h
+        dw, dh = w*extesion_fraction, h*extesion_fraction*cory
+
+        if self.extend in ["min", "both"]:
+            bottom = [(x1, y1),
+                      (x1+w/2., y1-dh),
+                      (x2, y1)]
+        else:
+            bottom = [(x1, y1),
+                      (x2, y1)]
+
+        if self.extend in ["max", "both"]:
+            top = [(x2, y2),
+                   (x1+w/2., y2+dh),
+                   (x1, y2)]
+        else:
+            top = [(x2, y2),
+                   (x1, y2)]
+
+        if self.orientation == "horizontal":
+            bottom = [(y,x) for (x,y) in bottom]
+            top = [(y,x) for (x,y) in top]
+
+        return bottom, top
+
+
+    def get_path_patch(self):
+        """
+        get the path for axes patch
+        """
+        end1, end2 = self.get_end_vertices()
+
+        verts = [] + end1 + end2 + end1[:1]
+
+        return Path(verts)
+
+
+    def get_path_ends(self):
+        """
+        get the paths for extended ends
+        """
+
+        end1, end2 = self.get_end_vertices()
+
+        return Path(end1), Path(end2)
+
+
+    def __call__(self, axes, renderer):
+        """
+        Return the adjusted position of the axes
+        """
+        bbox0 = self.get_original_position(axes, renderer)
+        bbox = bbox0
+
+        x1, y1, w, h = bbox.bounds
+        extesion_fraction = self.extesion_fraction
+        dw, dh = w*extesion_fraction, h*extesion_fraction
+
+        if self.extend in ["min", "both"]:
+            if self.orientation == "horizontal":
+                x1 = x1 + dw
+            else:
+                y1 = y1+dh
+
+        if self.extend in ["max", "both"]:
+            if self.orientation == "horizontal":
+                w = w-2*dw
+            else:
+                h = h-2*dh
+
+        return Bbox.from_bounds(x1, y1, w, h)
+
+
+
+class ColorbarBase(cm.ScalarMappable):
+    '''
+    Draw a colorbar in an existing axes.
+
+    This is a base class for the :class:`Colorbar` class, which is the
+    basis for the :func:`~matplotlib.pyplot.colorbar` method and pylab
+    function.
+
+    It is also useful by itself for showing a colormap.  If the *cmap*
+    kwarg is given but *boundaries* and *values* are left as None,
+    then the colormap will be displayed on a 0-1 scale. To show the
+    under- and over-value colors, specify the *norm* as::
+
+        colors.Normalize(clip=False)
+
+    To show the colors versus index instead of on the 0-1 scale,
+    use::
+
+        norm=colors.NoNorm.
+
+    Useful attributes:
+
+        :attr:`ax`
+            the Axes instance in which the colorbar is drawn
+
+        :attr:`lines`
+            a LineCollection if lines were drawn, otherwise None
+
+        :attr:`dividers`
+            a LineCollection if *drawedges* is True, otherwise None
+
+    Useful public methods are :meth:`set_label` and :meth:`add_lines`.
+
+    '''
+
+    def __init__(self, ax, cmap=None,
+                           norm=None,
+                           alpha=1.0,
+                           values=None,
+                           boundaries=None,
+                           orientation='vertical',
+                           extend='neither',
+                           spacing='uniform',  # uniform or proportional
+                           ticks=None,
+                           format=None,
+                           drawedges=False,
+                           filled=True,
+                           ):
+        self.ax = ax
+
+        if cmap is None: cmap = cm.get_cmap()
+        if norm is None: norm = colors.Normalize()
+        self.alpha = alpha
+        cm.ScalarMappable.__init__(self, cmap=cmap, norm=norm)
+        self.values = values
+        self.boundaries = boundaries
+        self.extend = extend
+        self.spacing = spacing
+        self.orientation = orientation
+        self.drawedges = drawedges
+        self.filled = filled
+
+        # artists
+        self.solids = None
+        self.lines = None
+        self.dividers = None
+        self.extension_patch1 = None
+        self.extension_patch2 = None
+
+        if orientation == "vertical":
+            self.cbar_axis = self.ax.yaxis
+        else:
+            self.cbar_axis = self.ax.xaxis
+
+
+        if format is None:
+            if isinstance(self.norm, colors.LogNorm):
+                # change both axis for proper aspect
+                self.ax.xaxis.set_scale("log")
+                self.ax.yaxis.set_scale("log")
+                self.ax._update_transScale()
+                self.cbar_axis.set_minor_locator(ticker.NullLocator())
+                formatter = ticker.LogFormatter()
+            else:
+                formatter = None
+        elif cbook.is_string_like(format):
+            formatter = ticker.FormatStrFormatter(format)
+        else:
+            formatter = format  # Assume it is a Formatter
+
+        if formatter is None:
+            formatter = self.cbar_axis.get_major_formatter()
+        else:
+            self.cbar_axis.set_major_formatter(formatter)
+
+        if cbook.iterable(ticks):
+            self.cbar_axis.set_ticks(ticks)
+        elif ticks is not None:
+            self.cbar_axis.set_major_locator(ticks)
+        else:
+            self._select_locator(formatter)
+
+
+        self._config_axes()
+
+        self.update_artists()
+
+        self.set_label_text('')
+
+
+    def _get_colorbar_limits(self):
+        """
+        initial limits for colorbar range. The returne min, max values
+        will be used to create colorbar solid(?) and etc.
+        """
+        if self.boundaries is not None:
+            C = self.boundaries
+            if self.extend in ["min", "both"]:
+                C = C[1:]
+
+            if self.extend in ["max", "both"]:
+                C = C[:-1]
+            return min(C), max(C)
+        else:
+            return self.get_clim()
+
+
+    def _config_axes(self):
+        '''
+        Adjust the properties of the axes to be adquate for colorbar display.
+        '''
+        ax = self.ax
+
+        axes_locator = CbarAxesLocator(ax.get_axes_locator(),
+                                       extend=self.extend,
+                                       orientation=self.orientation)
+        ax.set_axes_locator(axes_locator)
+
+        # overide the get_data_ratio for the aspect works.
+        def _f():
+            return 1.
+        ax.get_data_ratio = _f
+        ax.get_data_ratio_log = _f
+
+        ax.set_frame_on(True)
+        ax.set_navigate(False)
+
+        self.ax.set_autoscalex_on(False)
+        self.ax.set_autoscaley_on(False)
+
+        if self.orientation == 'horizontal':
+            ax.xaxis.set_label_position('bottom')
+            ax.set_yticks([])
+        else:
+            ax.set_xticks([])
+            ax.yaxis.set_label_position('right')
+            ax.yaxis.set_ticks_position('right')
+
+
+
+    def update_artists(self):
+        """
+        Update the colorbar associated artists, *filled* and
+        *ends*. Note that *lines* are not updated.  This needs to be
+        called whenever clim of associated image changes.
+        """
+        self._process_values()
+        self._add_ends()
+
+        X, Y = self._mesh()
+        if self.filled:
+            C = self._values[:,np.newaxis]
+            self._add_solids(X, Y, C)
+
+        ax = self.ax
+        vmin, vmax = self._get_colorbar_limits()
+        if self.orientation == 'horizontal':
+            ax.set_ylim(1, 2)
+            ax.set_xlim(vmin, vmax)
+        else:
+            ax.set_xlim(1, 2)
+            ax.set_ylim(vmin, vmax)
+
+
+    def _add_ends(self):
+        """
+        Create patches from extended ends and add them to the axes.
+        """
+
+        del self.extension_patch1
+        del self.extension_patch2
+
+        path1, path2 = self.ax.get_axes_locator().get_path_ends()
+        fc=mpl.rcParams['axes.facecolor']
+        ec=mpl.rcParams['axes.edgecolor']
+        linewidths=0.5*mpl.rcParams['axes.linewidth']
+        self.extension_patch1 = PathPatch(path1,
+                                          fc=fc, ec=ec, lw=linewidths,
+                                          zorder=2.,
+                                          transform=self.ax.transAxes,
+                                          clip_on=False)
+        self.extension_patch2 = PathPatch(path2,
+                                          fc=fc, ec=ec, lw=linewidths,
+                                          zorder=2.,
+                                          transform=self.ax.transAxes,
+                                          clip_on=False)
+        self.ax.add_artist(self.extension_patch1)
+        self.ax.add_artist(self.extension_patch2)
+
+
+
+    def _set_label_text(self):
+        """
+        set label.
+        """
+        self.cbar_axis.set_label_text(self._label, **self._labelkw)
+
+    def set_label_text(self, label, **kw):
+        '''
+        Label the long axis of the colorbar
+        '''
+        self._label = label
+        self._labelkw = kw
+        self._set_label_text()
+
+
+    def _edges(self, X, Y):
+        '''
+        Return the separator line segments; helper for _add_solids.
+        '''
+        N = X.shape[0]
+        # Using the non-array form of these line segments is much
+        # simpler than making them into arrays.
+        if self.orientation == 'vertical':
+            return [zip(X[i], Y[i]) for i in range(1, N-1)]
+        else:
+            return [zip(Y[i], X[i]) for i in range(1, N-1)]
+
+    def _add_solids(self, X, Y, C):
+        '''
+        Draw the colors using :meth:`~matplotlib.axes.Axes.pcolor`;
+        optionally add separators.
+        '''
+        ## Change to pcolorfast after fixing bugs in some backends...
+
+        if self.extend in ["min", "both"]:
+            cc = self.to_rgba([C[0][0]])
+            self.extension_patch1.set_fc(cc[0])
+            X, Y, C = X[1:], Y[1:], C[1:]
+
+        if self.extend in ["max", "both"]:
+            cc = self.to_rgba([C[-1][0]])
+            self.extension_patch2.set_fc(cc[0])
+            X, Y, C = X[:-1], Y[:-1], C[:-1]
+
+        if self.orientation == 'vertical':
+            args = (X, Y, C)
+        else:
+            args = (np.transpose(Y), np.transpose(X), np.transpose(C))
+        kw = {'cmap':self.cmap, 'norm':self.norm,
+              'shading':'flat', 'alpha':self.alpha,
+              }
+
+        del self.solids
+        del self.dividers
+
+        col = self.ax.pcolor(*args, **kw)
+        self.solids = col
+        if self.drawedges:
+            self.dividers = collections.LineCollection(self._edges(X,Y),
+                              colors=(mpl.rcParams['axes.edgecolor'],),
+                              linewidths=(0.5*mpl.rcParams['axes.linewidth'],),
+                              )
+            self.ax.add_collection(self.dividers)
+        else:
+            self.dividers = None
+
+    def add_lines(self, levels, colors, linewidths):
+        '''
+        Draw lines on the colorbar. It deletes preexting lines.
+        '''
+        del self.lines
+
+        N = len(levels)
+        x = np.array([1.0, 2.0])
+        X, Y = np.meshgrid(x,levels)
+        if self.orientation == 'vertical':
+            xy = [zip(X[i], Y[i]) for i in range(N)]
+        else:
+            xy = [zip(Y[i], X[i]) for i in range(N)]
+        col = collections.LineCollection(xy, linewidths=linewidths,
+                                         )
+        self.lines = col
+        col.set_color(colors)
+        self.ax.add_collection(col)
+
+
+    def _select_locator(self, formatter):
+        '''
+        select a suitable locator
+        '''
+        if self.boundaries is None:
+            if isinstance(self.norm, colors.NoNorm):
+                nv = len(self._values)
+                base = 1 + int(nv/10)
+                locator = ticker.IndexLocator(base=base, offset=0)
+            elif isinstance(self.norm, colors.BoundaryNorm):
+                b = self.norm.boundaries
+                locator = ticker.FixedLocator(b, nbins=10)
+            elif isinstance(self.norm, colors.LogNorm):
+                locator = ticker.LogLocator()
+            else:
+                locator = ticker.MaxNLocator(nbins=5)
+        else:
+            b = self._boundaries[self._inside]
+            locator = ticker.FixedLocator(b) #, nbins=10)
+
+        self.cbar_axis.set_major_locator(locator)
+
+
+    def _process_values(self, b=None):
+        '''
+        Set the :attr:`_boundaries` and :attr:`_values` attributes
+        based on the input boundaries and values.  Input boundaries
+        can be *self.boundaries* or the argument *b*.
+        '''
+        if b is None:
+            b = self.boundaries
+        if b is not None:
+            self._boundaries = np.asarray(b, dtype=float)
+            if self.values is None:
+                self._values = 0.5*(self._boundaries[:-1]
+                                        + self._boundaries[1:])
+                if isinstance(self.norm, colors.NoNorm):
+                    self._values = (self._values + 0.00001).astype(np.int16)
+                return
+            self._values = np.array(self.values)
+            return
+        if self.values is not None:
+            self._values = np.array(self.values)
+            if self.boundaries is None:
+                b = np.zeros(len(self.values)+1, 'd')
+                b[1:-1] = 0.5*(self._values[:-1] - self._values[1:])
+                b[0] = 2.0*b[1] - b[2]
+                b[-1] = 2.0*b[-2] - b[-3]
+                self._boundaries = b
+                return
+            self._boundaries = np.array(self.boundaries)
+            return
+        # Neither boundaries nor values are specified;
+        # make reasonable ones based on cmap and norm.
+        if isinstance(self.norm, colors.NoNorm):
+            b = self._uniform_y(self.cmap.N+1) * self.cmap.N - 0.5
+            v = np.zeros((len(b)-1,), dtype=np.int16)
+            v = np.arange(self.cmap.N, dtype=np.int16)
+            self._boundaries = b
+            self._values = v
+            return
+        elif isinstance(self.norm, colors.BoundaryNorm):
+            b = np.array(self.norm.boundaries)
+            v = np.zeros((len(b)-1,), dtype=float)
+            bi = self.norm.boundaries
+            v = 0.5*(bi[:-1] + bi[1:])
+            self._boundaries = b
+            self._values = v
+            return
+        else:
+            b = self._uniform_y(self.cmap.N+1)
+
+        self._process_values(b)
+
+
+    def _uniform_y(self, N):
+        '''
+        Return colorbar data coordinates for *N* uniformly
+        spaced boundaries.
+        '''
+        vmin, vmax = self._get_colorbar_limits()
+        if isinstance(self.norm, colors.LogNorm):
+            y = np.logspace(np.log10(vmin), np.log10(vmax), N)
+        else:
+            y = np.linspace(vmin, vmax, N)
+        return y
+
+    def _mesh(self):
+        '''
+        Return X,Y, the coordinate arrays for the colorbar pcolormesh.
+        These are suitable for a vertical colorbar; swapping and
+        transposition for a horizontal colorbar are done outside
+        this function.
+        '''
+        x = np.array([1.0, 2.0])
+        if self.spacing == 'uniform':
+            y = self._uniform_y(len(self._boundaries))
+        else:
+            y = self._boundaries
+        self._y = y
+
+        X, Y = np.meshgrid(x,y)
+        return X, Y
+
+
+    def set_alpha(self, alpha):
+        """
+        set alpha value.
+        """
+        self.alpha = alpha
+
+
+class Colorbar(ColorbarBase):
+    def __init__(self, ax, mappable, **kw):
+        mappable.autoscale_None() # Ensure mappable.norm.vmin, vmax
+                             # are set when colorbar is called,
+                             # even if mappable.draw has not yet
+                             # been called.  This will not change
+                             # vmin, vmax if they are already set.
+        self.mappable = mappable
+        kw['cmap'] = mappable.cmap
+        kw['norm'] = mappable.norm
+        kw['alpha'] = mappable.get_alpha()
+        if isinstance(mappable, contour.ContourSet):
+            CS = mappable
+            kw['boundaries'] = CS._levels
+            kw['values'] = CS.cvalues
+            kw['extend'] = CS.extend
+            #kw['ticks'] = CS._levels
+            kw.setdefault('ticks', ticker.FixedLocator(CS.levels, nbins=10))
+            kw['filled'] = CS.filled
+            ColorbarBase.__init__(self, ax, **kw)
+            if not CS.filled:
+                self.add_lines(CS)
+        else:
+            ColorbarBase.__init__(self, ax, **kw)
+
+
+    def add_lines(self, CS):
+        '''
+        Add the lines from a non-filled
+        :class:`~matplotlib.contour.ContourSet` to the colorbar.
+        '''
+        if not isinstance(CS, contour.ContourSet) or CS.filled:
+            raise ValueError('add_lines is only for a ContourSet of lines')
+        tcolors = [c[0] for c in CS.tcolors]
+        tlinewidths = [t[0] for t in CS.tlinewidths]
+        # The following was an attempt to get the colorbar lines
+        # to follow subsequent changes in the contour lines,
+        # but more work is needed: specifically, a careful
+        # look at event sequences, and at how
+        # to make one object track another automatically.
+        #tcolors = [col.get_colors()[0] for col in CS.collections]
+        #tlinewidths = [col.get_linewidth()[0] for lw in CS.collections]
+        #print 'tlinewidths:', tlinewidths
+        ColorbarBase.add_lines(self, CS.levels, tcolors, tlinewidths)
+
+    def update_bruteforce(self, mappable):
+        """
+        Update the colorbar artists to reflect the change of the
+        assocaited mappable.
+        """
+        self.update_artists()
+
+        if isinstance(mappable, contour.ContourSet):
+            if not mappable.filled:
+                self.add_lines(mappable)
+
[email protected](make_axes_kw_doc)
+def make_axes(parent, **kw):
+    '''
+    Resize and reposition a parent axes, and return a child
+    axes suitable for a colorbar::
+
+        cax, kw = make_axes(parent, **kw)
+
+    Keyword arguments may include the following (with defaults):
+
+        *orientation*
+            'vertical'  or 'horizontal'
+
+    %s
+
+    All but the first of these are stripped from the input kw set.
+
+    Returns (cax, kw), the child axes and the reduced kw dictionary.
+    '''
+    orientation = kw.setdefault('orientation', 'vertical')
+    fraction = kw.pop('fraction', 0.15)
+    shrink = kw.pop('shrink', 1.0)
+    aspect = kw.pop('aspect', 20)
+    #pb = transforms.PBox(parent.get_position())
+    pb = parent.get_position(original=True).frozen()
+    if orientation == 'vertical':
+        pad = kw.pop('pad', 0.05)
+        x1 = 1.0-fraction
+        pb1, pbx, pbcb = pb.splitx(x1-pad, x1)
+        pbcb = pbcb.shrunk(1.0, shrink).anchored('C', pbcb)
+        anchor = (0.0, 0.5)
+        panchor = (1.0, 0.5)
+    else:
+        pad = kw.pop('pad', 0.15)
+        pbcb, pbx, pb1 = pb.splity(fraction, fraction+pad)
+        pbcb = pbcb.shrunk(shrink, 1.0).anchored('C', pbcb)
+        aspect = 1.0/aspect
+        anchor = (0.5, 1.0)
+        panchor = (0.5, 0.0)
+    parent.set_position(pb1)
+    parent.set_anchor(panchor)
+    fig = parent.get_figure()
+    cax = fig.add_axes(pbcb)
+    cax.set_aspect(aspect, anchor=anchor, adjustable='box')
+    return cax, kw
+
+
+def colorbar(mappable, cax=None, ax=None, **kw):
+    """
+    Create a colorbar for a ScalarMappable instance.
+
+    Documentation for the pylab thin wrapper:
+    %(colorbar_doc)s
+    """
+    import matplotlib.pyplot as plt
+    if ax is None:
+        ax = plt.gca()
+    if cax is None:
+        cax, kw = make_axes(ax, **kw)
+    cax.hold(True)
+    cb = Colorbar(cax, mappable, **kw)
+
+    def on_changed(m):
+        cb.set_cmap(m.get_cmap())
+        cb.set_clim(m.get_clim())
+        cb.update_bruteforce(m)
+
+    cbid = mappable.callbacksSM.connect('changed', on_changed)
+    mappable.set_colorbar(cb, cax)
+    ax.figure.sca(ax)
+    return cb


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

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to