From 784680b196f4905021493327d8c68134b67776c1 Mon Sep 17 00:00:00 2001 From: David Stansby Date: Tue, 21 Jan 2020 19:38:47 +0000 Subject: [PATCH 01/10] Fix colorbar with SymLogNorm --- lib/matplotlib/colorbar.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index 72f30723ae64..e04c94610c1a 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -1119,11 +1119,11 @@ def _mesh(self): else: y = self._proportional_y() xmid = np.array([0.5]) - try: + if self._use_auto_colorbar_locator(): y = norm.inverse(y) x = norm.inverse(x) xmid = norm.inverse(xmid) - except ValueError: + else: # occurs for norms that don't have an inverse, in # which case manually scale: dv = self.vmax - self.vmin From 242cacd87c9887220c2a3bc7a685f67f6cdc6e10 Mon Sep 17 00:00:00 2001 From: David Stansby Date: Tue, 21 Jan 2020 19:40:13 +0000 Subject: [PATCH 02/10] Add test --- .../test_colorbar/colorbar_norms.png | Bin 0 -> 53291 bytes lib/matplotlib/tests/test_colorbar.py | 15 +++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_colorbar/colorbar_norms.png diff --git a/lib/matplotlib/tests/baseline_images/test_colorbar/colorbar_norms.png b/lib/matplotlib/tests/baseline_images/test_colorbar/colorbar_norms.png new file mode 100644 index 0000000000000000000000000000000000000000..922ecc0519f6302bb416cee5371822f9267deb68 GIT binary patch literal 53291 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

UTetQ1e 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 P0Y55=nhGU1A3ysK$n%~w literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_colorbar.py b/lib/matplotlib/tests/test_colorbar.py index 3932177565c5..a2b8abf9c112 100644 --- a/lib/matplotlib/tests/test_colorbar.py +++ b/lib/matplotlib/tests/test_colorbar.py @@ -581,3 +581,18 @@ def test_colorbar_int(clim): im = ax.imshow([[*map(np.int16, clim)]]) fig.colorbar(im) assert (im.norm.vmin, im.norm.vmax) == clim + + +@image_comparison( + baseline_images=['colorbar_norms'], extensions=['png']) +def test_cbar_norms(): + # Test colormaps with different norms + norms = [mcolors.Normalize(vmin=-1, vmax=2), + mcolors.BoundaryNorm(boundaries=[-1, 0, 1], ncolors=4), + mcolors.LogNorm(vmin=1, vmax=1e4), + mcolors.PowerNorm(gamma=0.2, vmin=0.1, vmax=0.6), + mcolors.SymLogNorm(1, vmin=-10, vmax=10), + mcolors.TwoSlopeNorm(1, vmin=0, vmax=2)] + fig, axs = plt.subplots(ncols=len(norms), constrained_layout=True) + for ax, norm in zip(axs, norms): + fig.colorbar(cm.ScalarMappable(norm=norm, cmap='viridis'), cax=ax, extend='both') From 11e3464e11c67428b5458126bf41f5126f9c4a24 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Wed, 29 Jan 2020 19:54:24 -0800 Subject: [PATCH 03/10] FIX: contouring --- lib/matplotlib/colorbar.py | 3 +-- lib/matplotlib/tests/test_colorbar.py | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index e04c94610c1a..68d5c507479f 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -585,8 +585,7 @@ def _use_auto_colorbar_locator(self): one. (check is used twice so factored out here...) """ contouring = self.boundaries is not None and self.spacing == 'uniform' - return (type(self.norm) in [colors.Normalize, colors.LogNorm] - and not contouring) + return (type(self.norm) in [colors.Normalize, colors.LogNorm]) def _reset_locator_formatter_scale(self): """ diff --git a/lib/matplotlib/tests/test_colorbar.py b/lib/matplotlib/tests/test_colorbar.py index a2b8abf9c112..7c6a9100843f 100644 --- a/lib/matplotlib/tests/test_colorbar.py +++ b/lib/matplotlib/tests/test_colorbar.py @@ -373,7 +373,6 @@ def test_colorbar_get_ticks(): data = np.arange(1200).reshape(30, 40) levels = [0, 200, 400, 600, 800, 1000, 1200] - plt.subplot() plt.contourf(data, levels=levels) # testing getter for user set ticks From 3b32e1693622d197f3b51e0ccc72965e0f760c5e Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Wed, 29 Jan 2020 21:09:16 -0800 Subject: [PATCH 04/10] FIX: contouring --- lib/matplotlib/colorbar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index 68d5c507479f..ec37014a74be 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -584,7 +584,7 @@ def _use_auto_colorbar_locator(self): Return if we should use an adjustable tick locator or a fixed one. (check is used twice so factored out here...) """ - contouring = self.boundaries is not None and self.spacing == 'uniform' + # contouring = self.boundaries is not None and self.spacing == 'uniform' return (type(self.norm) in [colors.Normalize, colors.LogNorm]) def _reset_locator_formatter_scale(self): From cf19f75beca75c8ef21435d3f1d987dd81aafc86 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Thu, 30 Jan 2020 08:03:00 -0800 Subject: [PATCH 05/10] FIX: check for weird norms --- lib/matplotlib/colorbar.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index ec37014a74be..dfc397823b28 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -584,8 +584,9 @@ def _use_auto_colorbar_locator(self): Return if we should use an adjustable tick locator or a fixed one. (check is used twice so factored out here...) """ - # contouring = self.boundaries is not None and self.spacing == 'uniform' - return (type(self.norm) in [colors.Normalize, colors.LogNorm]) + contouring = self.boundaries is not None and self.spacing == 'uniform' + return (type(self.norm) in [colors.Normalize, colors.LogNorm] and + not contouring) def _reset_locator_formatter_scale(self): """ @@ -1118,13 +1119,12 @@ def _mesh(self): else: y = self._proportional_y() xmid = np.array([0.5]) - if self._use_auto_colorbar_locator(): + if type(self.norm) in [colors.Normalize, colors.LogNorm]: y = norm.inverse(y) x = norm.inverse(x) xmid = norm.inverse(xmid) else: - # occurs for norms that don't have an inverse, in - # which case manually scale: + # manually scale... dv = self.vmax - self.vmin x = x * dv + self.vmin y = y * dv + self.vmin From 1cf088e13b9384e264911b2540d93be34e065d2e Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Thu, 30 Jan 2020 21:38:33 -0500 Subject: [PATCH 06/10] FIX: catch on message content, not module Not all of the warnings from pandas report that they are from pandas. Closes #16295 (again) --- lib/matplotlib/cbook/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/cbook/__init__.py b/lib/matplotlib/cbook/__init__.py index 7ea6fec67920..e04ef4b3aa7a 100644 --- a/lib/matplotlib/cbook/__init__.py +++ b/lib/matplotlib/cbook/__init__.py @@ -1382,9 +1382,10 @@ def _check_1d(x): # This code should correctly identify and coerce to a # numpy array all pandas versions. with warnings.catch_warnings(record=True) as w: - warnings.filterwarnings("always", - category=DeprecationWarning, - module='pandas[.*]') + warnings.filterwarnings( + "always", + category=DeprecationWarning, + message='Support for multi-dimensional indexing') ndim = x[:, None].ndim # we have definitely hit a pandas index or series object From a0c45afe5fd8e44b35de06c3c49f8280d2f46427 Mon Sep 17 00:00:00 2001 From: Max Humber Date: Thu, 30 Jan 2020 21:47:50 -0500 Subject: [PATCH 07/10] gif added to thirdparty page --- doc/_static/gif_attachment_example.png | Bin 0 -> 11474 bytes doc/thirdpartypackages/index.rst | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 doc/_static/gif_attachment_example.png diff --git a/doc/_static/gif_attachment_example.png b/doc/_static/gif_attachment_example.png new file mode 100644 index 0000000000000000000000000000000000000000..93bcf44e91f995a1d120660586a6d8c188993f94 GIT binary patch literal 11474 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 b7l-9$j`lX&6hwD{JY}=icFin}1OER5j!QGp literal 0 HcmV?d00001 diff --git a/doc/thirdpartypackages/index.rst b/doc/thirdpartypackages/index.rst index 68c8685ec7a2..4c2954e5f524 100644 --- a/doc/thirdpartypackages/index.rst +++ b/doc/thirdpartypackages/index.rst @@ -198,6 +198,12 @@ Yellowbrick Interactivity ************* +gif +=== +`gif `_ is an ultra lightweight API to make animated gifs. + +.. image:: /_static/gif_attachment_example.png + mplcursors ========== `mplcursors `_ provides interactive data From 2c1b61f96fb903304db8d02b12419f7e222b0f51 Mon Sep 17 00:00:00 2001 From: Max Humber Date: Fri, 31 Jan 2020 09:00:37 -0500 Subject: [PATCH 08/10] add animations section --- doc/thirdpartypackages/index.rst | 52 +++++++++++++++++--------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/doc/thirdpartypackages/index.rst b/doc/thirdpartypackages/index.rst index 4c2954e5f524..a8208059e40b 100644 --- a/doc/thirdpartypackages/index.rst +++ b/doc/thirdpartypackages/index.rst @@ -194,16 +194,40 @@ Yellowbrick .. image:: /_static/yellowbrick.png :height: 400px +Animations +********** -Interactivity -************* +animatplot +========== +`animatplot `_ is a library for +producing interactive animated plots with the goal of making production of +animated plots almost as easy as static ones. + +.. image:: /_static/animatplot.png + +For an animated version of the above picture and more examples, see the +`animatplot gallery. `_ gif === -`gif `_ is an ultra lightweight API to make animated gifs. +`gif `_ is an ultra lightweight animated gif API. .. image:: /_static/gif_attachment_example.png +numpngw +======= + +`numpngw `_ provides functions for writing +NumPy arrays to PNG and animated PNG files. It also includes the class +``AnimatedPNGWriter`` that can be used to save a Matplotlib animation as an +animated PNG file. See the example on the PyPI page or at the ``numpngw`` +`github repository `_. + +.. image:: /_static/numpngw_animated_example.png + +Interactivity +************* + mplcursors ========== `mplcursors `_ provides interactive data @@ -215,17 +239,6 @@ MplDataCursor written by Joe Kington to provide interactive "data cursors" (clickable annotation boxes) for Matplotlib. -animatplot -========== -`animatplot `_ is a library for -producing interactive animated plots with the goal of making production of -animated plots almost as easy as static ones. - -.. image:: /_static/animatplot.png - -For an animated version of the above picture and more examples, see the -`animatplot gallery. `_ - Rendering backends ****************** @@ -269,17 +282,6 @@ border, and logo. .. image:: /_static/mpl_template_example.png :height: 330px -numpngw -======= - -`numpngw `_ provides functions for writing -NumPy arrays to PNG and animated PNG files. It also includes the class -``AnimatedPNGWriter`` that can be used to save a Matplotlib animation as an -animated PNG file. See the example on the PyPI page or at the ``numpngw`` -`github repository `_. - -.. image:: /_static/numpngw_animated_example.png - blume ===== From 24ad4a4089320c11fefb89c09957576a24af33c2 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Thu, 30 Jan 2020 11:19:19 +0100 Subject: [PATCH 09/10] Dedupe ImageGrid doc from tutorial and docstring. ImageGrid is so little-maintained that I don't think we should have duplicate argument lists in the tutorial and the docstring, given that they *will* go out of sync (for more commonly used APIs, sure, we can maintain the duplication, but here it's not worth it). Add to the docstring the relevant parts of the tutorial, and make the tutorial point to the API docs. --- doc/missing-references.json | 16 +++-- lib/mpl_toolkits/axes_grid1/axes_grid.py | 56 +++++++++++----- tutorials/toolkits/axes_grid.py | 84 +++--------------------- 3 files changed, 58 insertions(+), 98 deletions(-) diff --git a/doc/missing-references.json b/doc/missing-references.json index 29dd9a62affe..a2f3e2738f5e 100644 --- a/doc/missing-references.json +++ b/doc/missing-references.json @@ -23,6 +23,10 @@ "button": [ "doc/users/prev_whats_new/whats_new_3.1.0.rst:338" ], + "cbar_axes": [ + "lib/mpl_toolkits/axes_grid1/axes_grid.py:docstring of mpl_toolkits.axes_grid1.axes_grid.ImageGrid:48", + "lib/mpl_toolkits/axisartist/axes_grid.py:docstring of mpl_toolkits.axisartist.axes_grid.ImageGrid:48" + ], "dividers": [ "lib/mpl_toolkits/axes_grid1/colorbar.py:docstring of mpl_toolkits.axes_grid1.colorbar.ColorbarBase:29" ], @@ -792,8 +796,8 @@ "doc/api/prev_api_changes/api_changes_1.5.0.rst:44" ], "Size.from_any": [ - "lib/mpl_toolkits/axes_grid1/axes_grid.py:docstring of mpl_toolkits.axes_grid1.axes_grid.ImageGrid:73", - "lib/mpl_toolkits/axisartist/axes_grid.py:docstring of mpl_toolkits.axisartist.axes_grid.ImageGrid:48" + "lib/mpl_toolkits/axes_grid1/axes_grid.py:docstring of mpl_toolkits.axes_grid1.axes_grid.ImageGrid:60", + "lib/mpl_toolkits/axisartist/axes_grid.py:docstring of mpl_toolkits.axisartist.axes_grid.ImageGrid:60" ], "Style": [ "doc/devel/MEP/MEP26.rst:68" @@ -892,13 +896,13 @@ "doc/api/prev_api_changes/api_changes_3.1.0.rst:933" ], "axes_grid1": [ - "doc/index.rst:184" + "doc/index.rst:154" ], "axis.Axis.get_ticks_position": [ "doc/api/prev_api_changes/api_changes_3.1.0.rst:821" ], "axisartist": [ - "doc/index.rst:184" + "doc/index.rst:154" ], "backend_bases.RendererBase": [ "lib/matplotlib/backends/backend_template.py:docstring of matplotlib.backends.backend_template.RendererTemplate:4" @@ -1506,7 +1510,7 @@ "lib/mpl_toolkits/axisartist/axis_artist.py:docstring of mpl_toolkits.axisartist.axis_artist:26" ], "mplot3d": [ - "doc/index.rst:184" + "doc/index.rst:154" ], "new_figure_manager": [ "doc/devel/MEP/MEP23.rst:75" @@ -1689,4 +1693,4 @@ "lib/mpl_toolkits/mplot3d/axes3d.py:docstring of mpl_toolkits.mplot3d.axes3d.Axes3D.get_ylim3d:24" ] } -} +} \ No newline at end of file diff --git a/lib/mpl_toolkits/axes_grid1/axes_grid.py b/lib/mpl_toolkits/axes_grid1/axes_grid.py index 44fe15f1f4d3..2f22d39ba3f8 100644 --- a/lib/mpl_toolkits/axes_grid1/axes_grid.py +++ b/lib/mpl_toolkits/axes_grid1/axes_grid.py @@ -82,12 +82,13 @@ def cla(self): class Grid: """ - A class that creates a grid of Axes. In matplotlib, the axes - location (and size) is specified in the normalized figure - coordinates. This may not be ideal for images that needs to be - displayed with a given aspect ratio. For example, displaying - images of a same size with some fixed padding between them cannot - be easily done in matplotlib. AxesGrid is used in such case. + A grid of Axes. + + In Matplotlib, the axes location (and size) is specified in normalized + figure coordinates. This may not be ideal for images that needs to be + displayed with a given aspect ratio; for example, it is difficult to + display multiple images of a same size with some fixed padding between + them. AxesGrid can be used in such case. """ _defaultAxesClass = Axes @@ -115,14 +116,25 @@ def __init__(self, fig, rect : (float, float, float, float) or int The axes position, as a ``(left, bottom, width, height)`` tuple or as a three-digit subplot position code (e.g., "121"). + nrows_ncols : (int, int) + Number of rows and columns in the grid. + ngrids : int or None, default: None + If not None, only the first *ngrids* axes in the grid are created. direction : {"row", "column"}, default: "row" + Whether axes are created in row-major ("row by row") or + column-major order ("column by column"). axes_pad : float or (float, float), default: 0.02 Padding or (horizontal padding, vertical padding) between axes, in inches. add_all : bool, default: True + Whether to add the axes to the figure using `.Figure.add_axes`. share_all : bool, default: False + Whether all axes share their x- and y-axis. Overrides *share_x* + and *share_y*. share_x : bool, default: True + Whether all axes of a column share their x-axis. share_y : bool, default: True + Whether all axes of a row share their y-axis. label_mode : {"L", "1", "all"}, default: "L" Determines which axes will get tick labels: @@ -133,6 +145,8 @@ def __init__(self, fig, axes_class : subclass of `matplotlib.axes.Axes`, default: None aspect : bool, default: False + Whether the axes aspect ratio follows the aspect ratio of the data + limits. """ self._nrows, self._ncols = nrows_ncols @@ -332,14 +346,7 @@ def get_vsize_hsize(self): class ImageGrid(Grid): - """ - A class that creates a grid of Axes. In matplotlib, the axes - location (and size) is specified in the normalized figure - coordinates. This may not be ideal for images that needs to be - displayed with a given aspect ratio. For example, displaying - images of a same size with some fixed padding between them cannot - be easily done in matplotlib. ImageGrid is used in such case. - """ + # docstring inherited _defaultCbarAxesClass = CbarAxes @@ -368,13 +375,24 @@ def __init__(self, fig, rect : (float, float, float, float) or int The axes position, as a ``(left, bottom, width, height)`` tuple or as a three-digit subplot position code (e.g., "121"). + nrows_ncols : (int, int) + Number of rows and columns in the grid. + ngrids : int or None, default: None + If not None, only the first *ngrids* axes in the grid are created. direction : {"row", "column"}, default: "row" - axes_pad : float or (float, float), default: 0.02 + Whether axes are created in row-major ("row by row") or + column-major order ("column by column"). This also affects the + order in which axes are accessed using indexing (``grid[index]``). + axes_pad : float or (float, float), default: 0.02in Padding or (horizontal padding, vertical padding) between axes, in inches. add_all : bool, default: True + Whether to add the axes to the figure using `.Figure.add_axes`. share_all : bool, default: False + Whether all axes share their x- and y-axis. aspect : bool, default: True + Whether the axes aspect ratio follows the aspect ratio of the data + limits. label_mode : {"L", "1", "all"}, default: "L" Determines which axes will get tick labels: @@ -383,10 +401,16 @@ def __init__(self, fig, - "1": Only the bottom left axes is labelled. - "all": all axes are labelled. - cbar_mode : {"each", "single", "edge", None }, default: None + cbar_mode : {"each", "single", "edge", None}, default: None + Whether to create a colorbar for "each" axes, a "single" colorbar + for the entire grid, colorbars only for axes on the "edge" + determined by *cbar_location*, or no colorbars. The colorbars are + stored in the :attr:`cbar_axes` attribute. cbar_location : {"left", "right", "bottom", "top"}, default: "right" cbar_pad : float, default: None + Padding between the image axes and the colorbar axes. cbar_size : size specification (see `.Size.from_any`), default: "5%" + Colorbar size. cbar_set_cax : bool, default: True If True, each axes in the grid has a *cax* attribute that is bound to associated *cbar_axes*. diff --git a/tutorials/toolkits/axes_grid.py b/tutorials/toolkits/axes_grid.py index 75e7766f0303..41cccc0f1829 100644 --- a/tutorials/toolkits/axes_grid.py +++ b/tutorials/toolkits/axes_grid.py @@ -40,12 +40,14 @@ ImageGrid --------- -A class that creates a grid of Axes. In matplotlib, the axes location -(and size) is specified in the normalized figure coordinates. This may -not be ideal for images that needs to be displayed with a given aspect -ratio. For example, displaying images of a same size with some fixed -padding between them cannot be easily done in matplotlib. ImageGrid is -used in such case. +A grid of Axes. + +In Matplotlib, the axes location (and size) is specified in normalized +figure coordinates. This may not be ideal for images that needs to be +displayed with a given aspect ratio; for example, it is difficult to +display multiple images of a same size with some fixed padding between +them. `~.axes_grid1.axes_grid.ImageGrid` can be used in such a case; see its +docs for a detailed list of the parameters it accepts. .. figure:: ../../gallery/axes_grid1/images/sphx_glr_simple_axesgrid_001.png :target: ../../gallery/axes_grid1/simple_axesgrid.html @@ -78,76 +80,6 @@ your mouse in interactive backends) of one axes will affect all other shared axes. -When initialized, ImageGrid creates given number (*ngrids* or *ncols* * -*nrows* if *ngrids* is None) of Axes instances. A sequence-like -interface is provided to access the individual Axes instances (e.g., -grid[0] is the first Axes in the grid. See below for the order of -axes). - -ImageGrid takes following arguments, - - ============= ======== ================================================ - Name Default Description - ============= ======== ================================================ - fig - rect - nrows_ncols number of rows and cols. e.g., (2, 2) - ngrids None number of grids. nrows x ncols if None - direction "row" increasing direction of axes number. [row|column] - axes_pad 0.02 pad between axes in inches - add_all True Add axes to figures if True - share_all False xaxis & yaxis of all axes are shared if True - aspect True aspect of axes - label_mode "L" location of tick labels thaw will be displayed. - "1" (only the lower left axes), - "L" (left most and bottom most axes), - or "all". - cbar_mode None [None|single|each] - cbar_location "right" [right|top] - cbar_pad None pad between image axes and colorbar axes - cbar_size "5%" size of the colorbar - axes_class None - ============= ======== ================================================ - - *rect* - specifies the location of the grid. You can either specify - coordinates of the rectangle to be used (e.g., (0.1, 0.1, 0.8, 0.8) - as in the Axes), or the subplot-like position (e.g., "121"). - - *direction* - means the increasing direction of the axes number. - - *aspect* - By default (False), widths and heights of axes in the grid are - scaled independently. If True, they are scaled according to their - data limits (similar to aspect parameter in Matplotlib). - - *share_all* - if True, xaxis and yaxis of all axes are shared. - - *direction* - direction of increasing axes number. For "row", - - +---------+---------+ - | grid[0] | grid[1] | - +---------+---------+ - | grid[2] | grid[3] | - +---------+---------+ - - For "column", - - +---------+---------+ - | grid[0] | grid[2] | - +---------+---------+ - | grid[1] | grid[3] | - +---------+---------+ - -You can also create a colorbar (or colorbars). You can have colorbar -for each axes (cbar_mode="each"), or you can have a single colorbar -for the grid (cbar_mode="single"). The colorbar can be placed on your -right, or top. The axes for each colorbar is stored as a *cbar_axes* -attribute. - The examples below show what you can do with ImageGrid. .. figure:: ../../gallery/axes_grid1/images/sphx_glr_demo_axes_grid_001.png From de5a11ed2cd9fb58dffc5f0d32cbf3ae8dab2bcf Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Sun, 2 Feb 2020 19:09:52 -0800 Subject: [PATCH 10/10] FIX: properly fallback bad scale --- lib/matplotlib/colorbar.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index dfc397823b28..1e2fc9c201a6 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -452,6 +452,7 @@ def __init__(self, ax, cmap=None, self.locator = None self.formatter = None self._manual_tick_data_values = None + self._scale = None # linear, log10 for now. Hopefully more? if ticklocation == 'auto': ticklocation = 'bottom' if orientation == 'horizontal' else 'right' @@ -602,9 +603,16 @@ def _reset_locator_formatter_scale(self): self.ax.set_xscale('log') self.ax.set_yscale('log') self.minorticks_on() + self._scale = 'log' else: self.ax.set_xscale('linear') self.ax.set_yscale('linear') + if (isintance(self.norm, colors.Normalize) and + not issubclass(type(self.norm), colors.Normalize): + self._scale = 'linear' + else: + self._scale = 'manual' + def update_ticks(self): """ @@ -1119,12 +1127,13 @@ def _mesh(self): else: y = self._proportional_y() xmid = np.array([0.5]) - if type(self.norm) in [colors.Normalize, colors.LogNorm]: + if not self._scale == 'manual' y = norm.inverse(y) x = norm.inverse(x) xmid = norm.inverse(xmid) else: - # manually scale... + # if a norm doesn't have a named scale, or + # we are not using a norm dv = self.vmax - self.vmin x = x * dv + self.vmin y = y * dv + self.vmin