From fb52e4fce7f6e453295512945a3d73a48aed43d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Fri, 27 Sep 2013 01:08:55 +0200 Subject: [PATCH 1/7] implemented separate horizontal/vertical axes padding --- lib/mpl_toolkits/axes_grid1/axes_grid.py | 34 +++++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid1/axes_grid.py b/lib/mpl_toolkits/axes_grid1/axes_grid.py index 4bfafd628682..5006f0f126b0 100644 --- a/lib/mpl_toolkits/axes_grid1/axes_grid.py +++ b/lib/mpl_toolkits/axes_grid1/axes_grid.py @@ -20,6 +20,13 @@ #import numpy as np +def extend_axes_pad(value): + # Check whether a list/tuple/array or scalar has been passed + ret = value + if not hasattr(ret, "__getitem__"): + ret = (value, value) + return ret + def _tick_only(ax, bottom_on, left_on): bottom_off = not bottom_on left_off = not left_on @@ -201,6 +208,8 @@ def __init__(self, fig, ================ ======== ========================================= direction "row" [ "row" | "column" ] axes_pad 0.02 float| pad between axes given in inches + or tuple-like of floats, + (horizontal padding, vertical padding) add_all True [ True | False ] share_all False [ True | False ] share_x True [ True | False ] @@ -314,10 +323,11 @@ def __init__(self, fig, def _init_axes_pad(self, axes_pad): + axes_pad = extend_axes_pad(axes_pad) self._axes_pad = axes_pad - self._horiz_pad_size = Size.Fixed(axes_pad) - self._vert_pad_size = Size.Fixed(axes_pad) + self._horiz_pad_size = Size.Fixed(axes_pad[0]) + self._vert_pad_size = Size.Fixed(axes_pad[1]) def _update_locators(self): @@ -382,14 +392,19 @@ def get_geometry(self): def set_axes_pad(self, axes_pad): "set axes_pad" + axes_pad = extend_axes_pad(axes_pad) self._axes_pad = axes_pad - self._horiz_pad_size.fixed_size = axes_pad - self._vert_pad_size.fixed_size = axes_pad + self._horiz_pad_size.fixed_size = axes_pad[0] + self._vert_pad_size.fixed_size = axes_pad[1] def get_axes_pad(self): - "get axes_pad" + """ + get axes_pad + + :returns: Returns always a tuple (horizontal pad, vertical pad) + """ return self._axes_pad def set_aspect(self, aspect): @@ -495,6 +510,8 @@ def __init__(self, fig, ================ ======== ========================================= direction "row" [ "row" | "column" ] axes_pad 0.02 float| pad between axes given in inches + or tuple-like of floats + (horizontal padding, vertical padding) add_all True [ True | False ] share_all False [ True | False ] aspect True [ True | False ] @@ -521,12 +538,15 @@ def __init__(self, fig, self.ngrids = ngrids + axes_pad = extend_axes_pad(axes_pad) self._axes_pad = axes_pad self._colorbar_mode = cbar_mode self._colorbar_location = cbar_location if cbar_pad is None: - self._colorbar_pad = axes_pad + # horizontal or vertical arrangement? + self._colorbar_pad = axes_pad[0] \ + if cbar_location in ("left", "right") else axes_pad[1] else: self._colorbar_pad = cbar_pad @@ -688,7 +708,7 @@ def _update_locators(self): v_ax_pos = [] v_cb_pos = [] for row,ax in enumerate(self._row_refax[::-1]): - if v: v.append(self._horiz_pad_size) #Size.Fixed(self._axes_pad)) + if v: v.append(self._vert_pad_size) #Size.Fixed(self._axes_pad)) if ax: sz = Size.AxesY(ax) From 3f988d4496dd5565d1749aa26b8cf5e491e41834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Fri, 27 Sep 2013 01:10:08 +0200 Subject: [PATCH 2/7] added demonstration of separate horizontal/vertical axes padding --- examples/axes_grid/demo_axes_grid.py | 43 ++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/examples/axes_grid/demo_axes_grid.py b/examples/axes_grid/demo_axes_grid.py index d28f50efbd40..d182575c74f6 100644 --- a/examples/axes_grid/demo_axes_grid.py +++ b/examples/axes_grid/demo_axes_grid.py @@ -14,7 +14,7 @@ def demo_simple_grid(fig): A grid of 2x2 images with 0.05 inch pad between images and only the lower-left axes is labeled. """ - grid = AxesGrid(fig, 131, # similar to subplot(131) + grid = AxesGrid(fig, 141, # similar to subplot(131) nrows_ncols = (2, 2), axes_pad = 0.05, label_mode = "1", @@ -33,7 +33,7 @@ def demo_grid_with_single_cbar(fig): """ A grid of 2x2 images with a single colorbar """ - grid = AxesGrid(fig, 132, # similar to subplot(132) + grid = AxesGrid(fig, 142, # similar to subplot(132) nrows_ncols = (2, 2), axes_pad = 0.0, share_all=True, @@ -61,7 +61,7 @@ def demo_grid_with_each_cbar(fig): A grid of 2x2 images. Each image has its own colorbar. """ - grid = AxesGrid(F, 133, # similar to subplot(122) + grid = AxesGrid(F, 143, # similar to subplot(122) nrows_ncols = (2, 2), axes_pad = 0.1, label_mode = "1", @@ -83,16 +83,49 @@ def demo_grid_with_each_cbar(fig): grid.axes_llc.set_xticks([-2, 0, 2]) grid.axes_llc.set_yticks([-2, 0, 2]) +def demo_grid_with_each_cbar_labelled(fig): + """ + A grid of 2x2 images. Each image has its own colorbar. + """ + + grid = AxesGrid(F, 144, # similar to subplot(122) + nrows_ncols = (2, 2), + axes_pad = ( 0.45, 0.15), + label_mode = "1", + share_all = True, + cbar_location="right", + cbar_mode="each", + cbar_size="7%", + cbar_pad="2%", + ) + Z, extent = get_demo_image() + + # Use a different colorbar range every time + limits = ((0, 1), (-2, 2), (-1.7, 1.4), (-1.5, 1)) + for i in range(4): + im = grid[i].imshow(Z, extent=extent, interpolation="nearest", + vmin = limits[i][0], vmax = limits[i][1]) + grid.cbar_axes[i].colorbar(im) + + for i, cax in enumerate(grid.cbar_axes): + cax.set_yticks((limits[i][0], limits[i][1])) + + # This affects all axes because we set share_all = True. + grid.axes_llc.set_xticks([-2, 0, 2]) + grid.axes_llc.set_yticks([-2, 0, 2]) + + if 1: - F = plt.figure(1, (5.5, 2.5)) + F = plt.figure(1, (10.5, 2.5)) - F.subplots_adjust(left=0.05, right=0.98) + F.subplots_adjust(left=0.05, right=0.95) demo_simple_grid(F) demo_grid_with_single_cbar(F) demo_grid_with_each_cbar(F) + demo_grid_with_each_cbar_labelled(F) plt.draw() plt.show() From 856a82f1bdf48f7030863922e00c781f33213e81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Fri, 27 Sep 2013 01:15:43 +0200 Subject: [PATCH 3/7] docstring format fix --- lib/mpl_toolkits/axes_grid1/axes_grid.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/mpl_toolkits/axes_grid1/axes_grid.py b/lib/mpl_toolkits/axes_grid1/axes_grid.py index 5006f0f126b0..dcc68ab6c255 100644 --- a/lib/mpl_toolkits/axes_grid1/axes_grid.py +++ b/lib/mpl_toolkits/axes_grid1/axes_grid.py @@ -403,7 +403,10 @@ def get_axes_pad(self): """ get axes_pad - :returns: Returns always a tuple (horizontal pad, vertical pad) + Returns + ------- + tuple + Padding in inches, (horizontal pad, vertical pad) """ return self._axes_pad From d089d34ee8e0610d69474e51c7b99dd16f7d79a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Fri, 27 Sep 2013 01:17:44 +0200 Subject: [PATCH 4/7] fixed example typos --- examples/axes_grid/demo_axes_grid.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/axes_grid/demo_axes_grid.py b/examples/axes_grid/demo_axes_grid.py index d182575c74f6..3f9106747ebd 100644 --- a/examples/axes_grid/demo_axes_grid.py +++ b/examples/axes_grid/demo_axes_grid.py @@ -14,7 +14,7 @@ def demo_simple_grid(fig): A grid of 2x2 images with 0.05 inch pad between images and only the lower-left axes is labeled. """ - grid = AxesGrid(fig, 141, # similar to subplot(131) + grid = AxesGrid(fig, 141, # similar to subplot(141) nrows_ncols = (2, 2), axes_pad = 0.05, label_mode = "1", @@ -33,7 +33,7 @@ def demo_grid_with_single_cbar(fig): """ A grid of 2x2 images with a single colorbar """ - grid = AxesGrid(fig, 142, # similar to subplot(132) + grid = AxesGrid(fig, 142, # similar to subplot(142) nrows_ncols = (2, 2), axes_pad = 0.0, share_all=True, @@ -61,7 +61,7 @@ def demo_grid_with_each_cbar(fig): A grid of 2x2 images. Each image has its own colorbar. """ - grid = AxesGrid(F, 143, # similar to subplot(122) + grid = AxesGrid(F, 143, # similar to subplot(143) nrows_ncols = (2, 2), axes_pad = 0.1, label_mode = "1", @@ -88,7 +88,7 @@ def demo_grid_with_each_cbar_labelled(fig): A grid of 2x2 images. Each image has its own colorbar. """ - grid = AxesGrid(F, 144, # similar to subplot(122) + grid = AxesGrid(F, 144, # similar to subplot(144) nrows_ncols = (2, 2), axes_pad = ( 0.45, 0.15), label_mode = "1", From 318dd265c11b3c437f77850260682c2bba9a02af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Fri, 27 Sep 2013 13:14:37 +0200 Subject: [PATCH 5/7] improved PEP8 compliance --- lib/mpl_toolkits/axes_grid1/axes_grid.py | 55 +++++++++++++----------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid1/axes_grid.py b/lib/mpl_toolkits/axes_grid1/axes_grid.py index dcc68ab6c255..3647ad7b8529 100644 --- a/lib/mpl_toolkits/axes_grid1/axes_grid.py +++ b/lib/mpl_toolkits/axes_grid1/axes_grid.py @@ -1,8 +1,6 @@ from __future__ import (absolute_import, division, print_function, unicode_literals) -import six - import matplotlib.cbook as cbook import matplotlib.pyplot as plt @@ -14,7 +12,7 @@ import matplotlib.lines as mlines import matplotlib.ticker as ticker -from matplotlib.gridspec import SubplotSpec, GridSpec +from matplotlib.gridspec import SubplotSpec from .axes_divider import Size, SubplotDivider, LocatableAxes, Divider @@ -77,7 +75,7 @@ def _config_axes_deprecated(self, X, Y): class CbarAxesBase(object): def colorbar(self, mappable, **kwargs): - locator=kwargs.pop("locator", None) + locator = kwargs.pop("locator", None) if locator is None: if "ticks" not in kwargs: @@ -90,9 +88,9 @@ def colorbar(self, mappable, **kwargs): self.hold(True) if self.orientation in ["top", "bottom"]: - orientation="horizontal" + orientation = "horizontal" else: - orientation="vertical" + orientation = "vertical" cb = Colorbar(self, mappable, orientation=orientation, **kwargs) self._config_axes() @@ -153,7 +151,7 @@ def toggle_label(self, b): class CbarAxes(CbarAxesBase, LocatableAxes): def __init__(self, *kl, **kwargs): - orientation=kwargs.pop("orientation", None) + orientation = kwargs.pop("orientation", None) if orientation is None: raise ValueError("orientation must be specified") self.orientation = orientation @@ -248,8 +246,8 @@ def __init__(self, fig, axes_class, axes_class_args = axes_class self.axes_all = [] - self.axes_column = [[] for i in range(self._ncols)] - self.axes_row = [[] for i in range(self._nrows)] + self.axes_column = [[] for _ in range(self._ncols)] + self.axes_row = [[] for _ in range(self._nrows)] h = [] @@ -273,8 +271,8 @@ def __init__(self, fig, rect = self._divider.get_position() # reference axes - self._column_refax = [None for i in range(self._ncols)] - self._row_refax = [None for i in range(self._nrows)] + self._column_refax = [None for _ in range(self._ncols)] + self._row_refax = [None for _ in range(self._nrows)] self._refax = None for i in range(self.ngrids): @@ -335,11 +333,12 @@ def _update_locators(self): h = [] h_ax_pos = [] - h_cb_pos = [] + #h_cb_pos = [] - for ax in self._column_refax: + for _ in self._column_refax: #if h: h.append(Size.Fixed(self._axes_pad)) - if h: h.append(self._horiz_pad_size) + if h: + h.append(self._horiz_pad_size) h_ax_pos.append(len(h)) @@ -349,10 +348,11 @@ def _update_locators(self): v = [] v_ax_pos = [] - v_cb_pos = [] - for ax in self._row_refax[::-1]: + #v_cb_pos = [] + for _ in self._row_refax[::-1]: #if v: v.append(Size.Fixed(self._axes_pad)) - if v: v.append(self._vert_pad_size) + if v: + v.append(self._vert_pad_size) v_ax_pos.append(len(v)) sz = Size.Scaled(1) @@ -382,6 +382,8 @@ def _get_col_row(self, n): def __getitem__(self, i): return self.axes_all[i] + def __len__(self): + return len(self.axes_all) def get_geometry(self): """ @@ -403,7 +405,7 @@ def get_axes_pad(self): """ get axes_pad - Returns + Returns ------- tuple Padding in inches, (horizontal pad, vertical pad) @@ -513,7 +515,7 @@ def __init__(self, fig, ================ ======== ========================================= direction "row" [ "row" | "column" ] axes_pad 0.02 float| pad between axes given in inches - or tuple-like of floats + or tuple-like of floats (horizontal padding, vertical padding) add_all True [ True | False ] share_all False [ True | False ] @@ -575,8 +577,8 @@ def __init__(self, fig, self.axes_all = [] - self.axes_column = [[] for i in range(self._ncols)] - self.axes_row = [[] for i in range(self._nrows)] + self.axes_column = [[] for _ in range(self._ncols)] + self.axes_row = [[] for _ in range(self._nrows)] self.cbar_axes = [] @@ -601,8 +603,8 @@ def __init__(self, fig, rect = self._divider.get_position() # reference axes - self._column_refax = [None for i in range(self._ncols)] - self._row_refax = [None for i in range(self._nrows)] + self._column_refax = [None for _ in range(self._ncols)] + self._row_refax = [None for _ in range(self._nrows)] self._refax = None for i in range(self.ngrids): @@ -681,8 +683,9 @@ def _update_locators(self): self.cbar_axes[0].set_axes_locator(locator) self.cbar_axes[0].set_visible(True) - for col,ax in enumerate(self._column_refax): - if h: h.append(self._horiz_pad_size) #Size.Fixed(self._axes_pad)) + for col, ax in enumerate(self._column_refax): + if h: + h.append(self._horiz_pad_size) #Size.Fixed(self._axes_pad)) if ax: sz = Size.AxesX(ax) @@ -710,7 +713,7 @@ def _update_locators(self): v_ax_pos = [] v_cb_pos = [] - for row,ax in enumerate(self._row_refax[::-1]): + for row, ax in enumerate(self._row_refax[::-1]): if v: v.append(self._vert_pad_size) #Size.Fixed(self._axes_pad)) if ax: From f02d21408d6526bd605e85c437bf70aa13280534 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Fri, 27 Sep 2013 13:54:39 +0200 Subject: [PATCH 6/7] slight refactoring --- lib/mpl_toolkits/axes_grid1/axes_grid.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid1/axes_grid.py b/lib/mpl_toolkits/axes_grid1/axes_grid.py index 3647ad7b8529..ce3c63432990 100644 --- a/lib/mpl_toolkits/axes_grid1/axes_grid.py +++ b/lib/mpl_toolkits/axes_grid1/axes_grid.py @@ -18,7 +18,7 @@ #import numpy as np -def extend_axes_pad(value): +def _extend_axes_pad(value): # Check whether a list/tuple/array or scalar has been passed ret = value if not hasattr(ret, "__getitem__"): @@ -321,7 +321,7 @@ def __init__(self, fig, def _init_axes_pad(self, axes_pad): - axes_pad = extend_axes_pad(axes_pad) + axes_pad = _extend_axes_pad(axes_pad) self._axes_pad = axes_pad self._horiz_pad_size = Size.Fixed(axes_pad[0]) @@ -394,12 +394,7 @@ def get_geometry(self): def set_axes_pad(self, axes_pad): "set axes_pad" - axes_pad = extend_axes_pad(axes_pad) - self._axes_pad = axes_pad - - self._horiz_pad_size.fixed_size = axes_pad[0] - self._vert_pad_size.fixed_size = axes_pad[1] - + self._init_axes_pad(axes_pad) def get_axes_pad(self): """ @@ -543,7 +538,7 @@ def __init__(self, fig, self.ngrids = ngrids - axes_pad = extend_axes_pad(axes_pad) + axes_pad = _extend_axes_pad(axes_pad) self._axes_pad = axes_pad self._colorbar_mode = cbar_mode @@ -714,7 +709,8 @@ def _update_locators(self): v_ax_pos = [] v_cb_pos = [] for row, ax in enumerate(self._row_refax[::-1]): - if v: v.append(self._vert_pad_size) #Size.Fixed(self._axes_pad)) + if v: + v.append(self._vert_pad_size) #Size.Fixed(self._axes_pad)) if ax: sz = Size.AxesY(ax) From 6fb86073b8832379a517ceb509fe6f11659459e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Tue, 26 Nov 2013 23:29:04 +0100 Subject: [PATCH 7/7] just small pep8 refactoring --- lib/mpl_toolkits/axes_grid1/axes_grid.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid1/axes_grid.py b/lib/mpl_toolkits/axes_grid1/axes_grid.py index 3647ad7b8529..3327201703fa 100644 --- a/lib/mpl_toolkits/axes_grid1/axes_grid.py +++ b/lib/mpl_toolkits/axes_grid1/axes_grid.py @@ -18,7 +18,7 @@ #import numpy as np -def extend_axes_pad(value): +def _extend_axes_pad(value): # Check whether a list/tuple/array or scalar has been passed ret = value if not hasattr(ret, "__getitem__"): @@ -321,7 +321,7 @@ def __init__(self, fig, def _init_axes_pad(self, axes_pad): - axes_pad = extend_axes_pad(axes_pad) + axes_pad = _extend_axes_pad(axes_pad) self._axes_pad = axes_pad self._horiz_pad_size = Size.Fixed(axes_pad[0]) @@ -394,13 +394,13 @@ def get_geometry(self): def set_axes_pad(self, axes_pad): "set axes_pad" - axes_pad = extend_axes_pad(axes_pad) + axes_pad = _extend_axes_pad(axes_pad) self._axes_pad = axes_pad + # These two lines actually differ from ones in _init_axes_pad self._horiz_pad_size.fixed_size = axes_pad[0] self._vert_pad_size.fixed_size = axes_pad[1] - def get_axes_pad(self): """ get axes_pad @@ -543,7 +543,7 @@ def __init__(self, fig, self.ngrids = ngrids - axes_pad = extend_axes_pad(axes_pad) + axes_pad = _extend_axes_pad(axes_pad) self._axes_pad = axes_pad self._colorbar_mode = cbar_mode @@ -714,7 +714,8 @@ def _update_locators(self): v_ax_pos = [] v_cb_pos = [] for row, ax in enumerate(self._row_refax[::-1]): - if v: v.append(self._vert_pad_size) #Size.Fixed(self._axes_pad)) + if v: + v.append(self._vert_pad_size) #Size.Fixed(self._axes_pad)) if ax: sz = Size.AxesY(ax)