From 201dc2aa9e981490811490a2fb30f7c4fae0b502 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Sat, 10 Jun 2017 02:27:06 +0530 Subject: [PATCH 01/35] Initailize class 2D norm --- lib/matplotlib/colors.py | 54 +++++++++++++++++++++++++++++ lib/matplotlib/tests/test_colors.py | 43 +++++++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 45fc27a0b353..31b9d1113c06 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1349,6 +1349,60 @@ def __call__(self, value, clip=None): def inverse(self, value): return value +class Norm2d: + """ + Normalize a list of two values corresponding to two 1D normalizers + """ + def __init__(self, norm_instances=None): + """ + Parameters + ---------- + norm_instances : + A list of length two having instances of 1D normalizers + """ + if norm_instances is None: + self.norm_instances = [Normalize(), Normalize()] + else: + self.norm_instances = norm_instances + + def __call__(self, values, clip=None): + """ + Parameters + ---------- + values : array-like + A list of two values to be normalized + clip : list of bools, None, optional + A list of two bools corresponding to value in values. + If clip is None then clip is set according to corresponding + normalizers. + + Returns + ------- + A list of two normalized values according to corresponding 1D + normalizers. + """ + norm_one, norm_two = self.norm_instances + + if clip is None: + clip = [norm_one.clip, norm_two.clip] + + return [norm_one(values[0], clip=clip[0]), + norm_two(values[1], clip=clip[1])] + + def inverse(self, values): + """ + Parameters + ---------- + values : array-like + A list of two values to be inverted + + Returns + ------- + A list of two unnormalized values + """ + norm_one, norm_two = self.norm_instances + + return [norm_one.inverse(values[0]), norm_two.inverse(values[1])] def rgb_to_hsv(arr): """ diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index 721813e62f8f..d18bb64ff950 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -272,6 +272,49 @@ def _mask_tester(norm_instance, vals): masked_array[0] = np.ma.masked assert_array_equal(masked_array.mask, norm_instance(masked_array).mask) +@pytest.mark.parametrize( + 'norm_instances, values, expected, clip', [ + ( + None, + [[0.2, 0.4, 0.5], [5, 7, 9, 10]], + [[0, 0.666667, 1], [0, 0.4, 0.8, 1]], + None + ), + ( + [mcolors.LogNorm(clip=True, vmax=5), mcolors.Normalize()], + [[1, 6], [5, 7, 9, 10]], + [[0, 1.0], [0, 0.4, 0.8, 1]], + None + ), + ( + [mcolors.PowerNorm(2, vmin=0, vmax=8, clip=None), + mcolors.PowerNorm(2, vmin=2, vmax=8, clip=True)], + [np.array([-0.5, 0, 2, 4, 8], dtype=float), + np.array([-0.5, 0, 1, 8, 16], dtype=float)], + [[0, 0, 1/16, 1/4, 1], [0, 0, 0, 1, 1]], + None + ), + ( + [mcolors.SymLogNorm(3, vmin=-30, vmax=5, linscale=1.2), + mcolors.PowerNorm(2, vmin=2, vmax=8, clip=False)], + [np.array([-30, -1, 2, 6], dtype=float), + np.array([-0.5, 0, 1, 8, 16], dtype=float)], + [[0., 0.53980074, 0.826991, 1.02758204], [0, 0, 0, 1, 1]], + [False, True] + ) + ], ids=[ + 'norm_is_None', + 'LogNorm_and_LinearNorm', + 'PowerNorm_clip_None_and_True', + 'SymLogNorm_and_PowerNorm_clip_in_call' + ] +) +def test_norm2d(norm_instances, values, expected, clip): + norm = mcolors.Norm2d(norm_instances=norm_instances) + ans1, ans2 = norm(values=values, clip=clip) + assert_array_almost_equal(ans1, expected[0]) + assert_array_almost_equal(ans2, expected[1]) + @image_comparison(baseline_images=['levels_and_colors'], extensions=['png']) From 72175362833539a029cbc398f0d145f6695f8a9b Mon Sep 17 00:00:00 2001 From: patniharshit Date: Sat, 10 Jun 2017 04:20:13 +0530 Subject: [PATCH 02/35] Change name of class to BivariateNorm, take normalizer instances separately --- lib/matplotlib/colors.py | 32 +++++++++++++++-------------- lib/matplotlib/tests/test_colors.py | 18 ++++++++-------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 31b9d1113c06..da536abeef4b 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1349,21 +1349,27 @@ def __call__(self, value, clip=None): def inverse(self, value): return value -class Norm2d: +class BivariateNorm: """ Normalize a list of two values corresponding to two 1D normalizers """ - def __init__(self, norm_instances=None): + def __init__(self, norm1=None, norm2=None): """ Parameters ---------- - norm_instances : - A list of length two having instances of 1D normalizers + norm1 : + An instance of 1D normalizers + norm2 : + An instance of 1D normalizers """ - if norm_instances is None: - self.norm_instances = [Normalize(), Normalize()] + if norm1 is None: + self.norm1 = Normalize() else: - self.norm_instances = norm_instances + self.norm1 = norm1 + if norm2 is None: + self.norm2 = Normalize() + else: + self.norm2 = norm2 def __call__(self, values, clip=None): """ @@ -1381,13 +1387,11 @@ def __call__(self, values, clip=None): A list of two normalized values according to corresponding 1D normalizers. """ - norm_one, norm_two = self.norm_instances - if clip is None: - clip = [norm_one.clip, norm_two.clip] + clip = [self.norm1.clip, self.norm2.clip] - return [norm_one(values[0], clip=clip[0]), - norm_two(values[1], clip=clip[1])] + return [self.norm1(values[0], clip=clip[0]), + self.norm2(values[1], clip=clip[1])] def inverse(self, values): """ @@ -1400,9 +1404,7 @@ def inverse(self, values): ------- A list of two unnormalized values """ - norm_one, norm_two = self.norm_instances - - return [norm_one.inverse(values[0]), norm_two.inverse(values[1])] + return [self.norm1.inverse(values[0]), self.norm.inverse(values[1])] def rgb_to_hsv(arr): """ diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index d18bb64ff950..e93f7257c619 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -273,30 +273,32 @@ def _mask_tester(norm_instance, vals): assert_array_equal(masked_array.mask, norm_instance(masked_array).mask) @pytest.mark.parametrize( - 'norm_instances, values, expected, clip', [ + 'norm1, norm2, values, expected, clip', [ ( + None, None, [[0.2, 0.4, 0.5], [5, 7, 9, 10]], [[0, 0.666667, 1], [0, 0.4, 0.8, 1]], None ), ( - [mcolors.LogNorm(clip=True, vmax=5), mcolors.Normalize()], + mcolors.LogNorm(clip=True, vmax=5), + None, [[1, 6], [5, 7, 9, 10]], [[0, 1.0], [0, 0.4, 0.8, 1]], None ), ( - [mcolors.PowerNorm(2, vmin=0, vmax=8, clip=None), - mcolors.PowerNorm(2, vmin=2, vmax=8, clip=True)], + mcolors.PowerNorm(2, vmin=0, vmax=8, clip=None), + mcolors.PowerNorm(2, vmin=2, vmax=8, clip=True), [np.array([-0.5, 0, 2, 4, 8], dtype=float), np.array([-0.5, 0, 1, 8, 16], dtype=float)], [[0, 0, 1/16, 1/4, 1], [0, 0, 0, 1, 1]], None ), ( - [mcolors.SymLogNorm(3, vmin=-30, vmax=5, linscale=1.2), - mcolors.PowerNorm(2, vmin=2, vmax=8, clip=False)], + mcolors.SymLogNorm(3, vmin=-30, vmax=5, linscale=1.2), + mcolors.PowerNorm(2, vmin=2, vmax=8, clip=False), [np.array([-30, -1, 2, 6], dtype=float), np.array([-0.5, 0, 1, 8, 16], dtype=float)], [[0., 0.53980074, 0.826991, 1.02758204], [0, 0, 0, 1, 1]], @@ -309,8 +311,8 @@ def _mask_tester(norm_instance, vals): 'SymLogNorm_and_PowerNorm_clip_in_call' ] ) -def test_norm2d(norm_instances, values, expected, clip): - norm = mcolors.Norm2d(norm_instances=norm_instances) +def test_BivariateNorm(norm1, norm2, values, expected, clip): + norm = mcolors.BivariateNorm(norm1=norm1, norm2=norm2) ans1, ans2 = norm(values=values, clip=clip) assert_array_almost_equal(ans1, expected[0]) assert_array_almost_equal(ans2, expected[1]) From 01787306fe5fcfc9dd986c3186d55d066bb3b820 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 3 Jul 2017 15:45:27 +0530 Subject: [PATCH 03/35] Bivariate works with imshow, pcolor, pcolormesh, pcolorfast --- lib/matplotlib/axes/_axes.py | 96 ++++++++++++++++++++++++++++++++---- lib/matplotlib/colors.py | 31 +++++++++++- 2 files changed, 115 insertions(+), 12 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index e2610703489d..19ad5a112b1c 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5141,12 +5141,30 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, if not self._hold: self.cla() - if norm is not None and not isinstance(norm, mcolors.Normalize): - msg = "'norm' must be an instance of 'mcolors.Normalize'" + isNorm = isinstance(norm, (mcolors.Normalize, mcolors.BivariateNorm)) + if norm is not None and not isNorm: + msg = "'norm' must be an instance of 'mcolors.Normalize' " \ + "or 'mcolors.BivariateNorm'" raise ValueError(msg) + if aspect is None: aspect = rcParams['image.aspect'] self.set_aspect(aspect) + + temp = np.asarray(X) + if (temp.ndim == 3 and isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)): + if cmap is None: + cmap = mcolors.BivariateColormap() + if norm is None: + norm = mcolors.BivariateNorm() + temp = norm(temp) + temp[0] = temp[0] * (cmap.N-1) + temp[1] = temp[1] * (cmap.N-1) + temp = temp.astype(int) + X = temp[0] + cmap.N * temp[1] + norm = mcolors.NoNorm() + im = mimage.AxesImage(self, cmap, norm, interpolation, origin, extent, filternorm=filternorm, filterrad=filterrad, resample=resample, **kwargs) @@ -5173,7 +5191,6 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, @staticmethod def _pcolorargs(funcname, *args, **kw): - # This takes one kwarg, allmatch. # If allmatch is True, then the incoming X, Y, C must # have matching dimensions, taking into account that # X and Y can be 1-D rather than 2-D. This perfect @@ -5186,9 +5203,25 @@ def _pcolorargs(funcname, *args, **kw): # is False. allmatch = kw.pop("allmatch", False) + norm = kw.pop("norm", None) + cmap = kw.pop("cmap", None) if len(args) == 1: C = np.asanyarray(args[0]) + + if (C.ndim == 3 and isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)): + if cmap is None: + cmap = mcolors.BivariateColormap() + if norm is None: + norm = mcolors.BivariateNorm() + C = norm(C) + C[0] = C[0] * (cmap.N-1) + C[1] = C[1] * (cmap.N-1) + C = C.astype(int) + C = C[0] + cmap.N * C[1] + C = np.array(C) + numRows, numCols = C.shape if allmatch: X, Y = np.meshgrid(np.arange(numCols), np.arange(numRows)) @@ -5200,6 +5233,18 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 3: X, Y, C = [np.asanyarray(a) for a in args] + if (C.ndim == 3 and isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)): + if cmap is None: + cmap = mcolors.BivariateColormap() + if norm is None: + norm = mcolors.BivariateNorm() + C = norm(C) + C[0] = C[0] * (cmap.N-1) + C[1] = C[1] * (cmap.N-1) + C = C.astype(int) + C = C[0] + cmap.N * C[1] + C = np.array(C) numRows, numCols = C.shape else: raise TypeError( @@ -5382,9 +5427,14 @@ def pcolor(self, *args, **kwargs): vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) - X, Y, C = self._pcolorargs('pcolor', *args, allmatch=False) + kw = {'norm': norm, 'cmap': cmap, 'allmatch': False} + X, Y, C = self._pcolorargs('pcolor', *args, **kw) Ny, Nx = X.shape + if (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)): + norm = mcolors.NoNorm() + # unit conversion allows e.g. datetime objects as axis values self._process_unit_info(xdata=X, ydata=Y, kwargs=kwargs) X = self.convert_xunits(X) @@ -5450,9 +5500,13 @@ def pcolor(self, *args, **kwargs): collection.set_alpha(alpha) collection.set_array(C) - if norm is not None and not isinstance(norm, mcolors.Normalize): - msg = "'norm' must be an instance of 'mcolors.Normalize'" + + isNorm = isinstance(norm, (mcolors.Normalize, mcolors.BivariateNorm)) + if norm is not None and not isNorm: + msg = "'norm' must be an instance of 'mcolors.Normalize' " \ + "or 'mcolors.BivariateNorm'" raise ValueError(msg) + collection.set_cmap(cmap) collection.set_norm(norm) collection.set_clim(vmin, vmax) @@ -5582,9 +5636,14 @@ def pcolormesh(self, *args, **kwargs): allmatch = (shading == 'gouraud') - X, Y, C = self._pcolorargs('pcolormesh', *args, allmatch=allmatch) + kw = {'norm': norm, 'cmap': cmap, 'allmatch': allmatch} + X, Y, C = self._pcolorargs('pcolormesh', *args, **kw) Ny, Nx = X.shape + if (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)): + norm = mcolors.NoNorm() + # unit conversion allows e.g. datetime objects as axis values self._process_unit_info(xdata=X, ydata=Y, kwargs=kwargs) X = self.convert_xunits(X) @@ -5723,11 +5782,28 @@ def pcolorfast(self, *args, **kwargs): cmap = kwargs.pop('cmap', None) vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) - if norm is not None and not isinstance(norm, mcolors.Normalize): - msg = "'norm' must be an instance of 'mcolors.Normalize'" + isNorm = isinstance(norm, (mcolors.Normalize, mcolors.BivariateNorm)) + if norm is not None and not isNorm: + msg = "'norm' must be an instance of 'mcolors.Normalize' " \ + "or 'mcolors.BivariateNorm'" raise ValueError(msg) - C = args[-1] + C = np.asarray(args[-1]) + + if (C.ndim == 3 and isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)): + if cmap is None: + cmap = mcolors.BivariateColormap() + if norm is None: + norm = mcolors.BivariateNorm() + C = norm(C) + C[0] = C[0] * (cmap.N-1) + C[1] = C[1] * (cmap.N-1) + C = C.astype(int) + C = C[0] + cmap.N * C[1] + C = np.array(C) + norm = mcolors.NoNorm() + nr, nc = C.shape if len(args) == 1: style = "image" diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index da536abeef4b..5259c24a7bfc 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -858,6 +858,32 @@ def reversed(self, name=None): return ListedColormap(colors_r, name=name, N=self.N) +class BivariateColormap(Colormap): + def __init__(self, name, N=256): + Colormap.__init__(self, name, N) + + def _init(self): + red = np.linspace(0, 1, self.N) + green = np.linspace(0, 1, self.N) + red_mesh, green_mesh = np.meshgrid(red, green) + blue_mesh = np.zeros_like(red_mesh) + alpha_mesh = np.ones_like(red_mesh) + bivariate_cmap = np.dstack((red_mesh, green_mesh, blue_mesh, alpha_mesh)) + self._lut = np.vstack(bivariate_cmap) + self._isinit = True + self.N = self.N * self.N + self._set_extremes() + + def _resample(self, lutsize): + """ + Return a new color map with *lutsize x lutsize* entries. + """ + return BivariateColormap(self.name, lutsize) + + def reversed(self, name=None): + raise NotImplementedError() + + class Normalize(object): """ A class which, when called, can normalize data into @@ -1390,8 +1416,8 @@ def __call__(self, values, clip=None): if clip is None: clip = [self.norm1.clip, self.norm2.clip] - return [self.norm1(values[0], clip=clip[0]), - self.norm2(values[1], clip=clip[1])] + return np.array([self.norm1(values[0], clip=clip[0]), + self.norm2(values[1], clip=clip[1])]) def inverse(self, values): """ @@ -1406,6 +1432,7 @@ def inverse(self, values): """ return [self.norm1.inverse(values[0]), self.norm.inverse(values[1])] + def rgb_to_hsv(arr): """ convert float rgb values (in the range [0, 1]), in a numpy array to hsv From 575a244eca6fbffb67049c78ad09e69d8b2459e8 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 10 Jul 2017 01:55:10 +0530 Subject: [PATCH 04/35] add blank line between bivariate classes --- lib/matplotlib/colors.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 5259c24a7bfc..ee1f906af280 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1375,6 +1375,7 @@ def __call__(self, value, clip=None): def inverse(self, value): return value + class BivariateNorm: """ Normalize a list of two values corresponding to two 1D normalizers From 8425637d93d07603fd036dcb2d2409d17e49a83e Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 10 Jul 2017 03:51:33 +0530 Subject: [PATCH 05/35] Add support for bivariate in scatter --- lib/matplotlib/axes/_axes.py | 17 +++++++++++++++-- lib/matplotlib/colors.py | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 19ad5a112b1c..51e580007795 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -3979,6 +3979,17 @@ def scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, else: try: c_array = np.asanyarray(c, dtype=float) + if c_array.ndim > 1: + if cmap is None: + cmap = mcolors.BivariateColormap() + if norm is None: + norm = mcolors.BivariateNorm() + c_array = norm(c_array) + c_array[0] = c_array[0] * (cmap.N-1) + c_array[1] = c_array[1] * (cmap.N-1) + c_array = c_array.astype(int) + c_array = c_array[0] + cmap.N * c_array[1] + norm = mcolors.NoNorm() if c_array.shape in xy_shape: c = np.ma.ravel(c_array) else: @@ -4043,8 +4054,10 @@ def scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, collection.update(kwargs) if colors is None: - if norm is not None and not isinstance(norm, mcolors.Normalize): - msg = "'norm' must be an instance of 'mcolors.Normalize'" + isNorm = isinstance(norm, (mcolors.Normalize, mcolors.BivariateNorm)) + if norm is not None and not isNorm: + msg = "'norm' must be an instance of 'mcolors.Normalize' " \ + "or 'mcolors.BivariateNorm'" raise ValueError(msg) collection.set_array(np.asarray(c)) collection.set_cmap(cmap) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index ee1f906af280..f132abb6cb6c 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -859,7 +859,7 @@ def reversed(self, name=None): class BivariateColormap(Colormap): - def __init__(self, name, N=256): + def __init__(self, name='bivariate', N=256): Colormap.__init__(self, name, N) def _init(self): From 4a5831dece20057d4264898915e5d6c8b7466543 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Tue, 11 Jul 2017 23:37:04 +0530 Subject: [PATCH 06/35] Fix missing norm2 in BivaraiteNorm --- lib/matplotlib/colors.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index f132abb6cb6c..f3c5a0f682bd 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1431,7 +1431,8 @@ def inverse(self, values): ------- A list of two unnormalized values """ - return [self.norm1.inverse(values[0]), self.norm.inverse(values[1])] + return np.asarray([self.norm1.inverse(values[0]), + self.norm2.inverse(values[1])]) def rgb_to_hsv(arr): From 85df736206c6849a969a29a4f7848618cdcd5120 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Thu, 13 Jul 2017 00:06:59 +0530 Subject: [PATCH 07/35] Fixed bug in if condition bivariate mapping --- lib/matplotlib/axes/_axes.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 51e580007795..34fc461b924a 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5165,8 +5165,9 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, self.set_aspect(aspect) temp = np.asarray(X) - if (temp.ndim == 3 and isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)): + isBivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) + if (temp.ndim == 3 and isBivari): if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: @@ -5222,8 +5223,9 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 1: C = np.asanyarray(args[0]) - if (C.ndim == 3 and isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)): + isBivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) + if (C.ndim == 3 and isBivari): if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: @@ -5246,8 +5248,9 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 3: X, Y, C = [np.asanyarray(a) for a in args] - if (C.ndim == 3 and isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)): + isBivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) + if (C.ndim == 3 and isBivari): if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: @@ -5803,8 +5806,9 @@ def pcolorfast(self, *args, **kwargs): C = np.asarray(args[-1]) - if (C.ndim == 3 and isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)): + isBivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) + if (C.ndim == 3 and isBivari): if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: From 8e1bc63720ad7fd856993a95f277256cd60fe6f4 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Thu, 13 Jul 2017 12:26:21 +0530 Subject: [PATCH 08/35] Add autoscale, autoscale_None, scaled methods for BivariateNorm --- lib/matplotlib/colors.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index f3c5a0f682bd..98b0ff87d180 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1417,7 +1417,7 @@ def __call__(self, values, clip=None): if clip is None: clip = [self.norm1.clip, self.norm2.clip] - return np.array([self.norm1(values[0], clip=clip[0]), + return np.asarray([self.norm1(values[0], clip=clip[0]), self.norm2(values[1], clip=clip[1])]) def inverse(self, values): @@ -1434,6 +1434,22 @@ def inverse(self, values): return np.asarray([self.norm1.inverse(values[0]), self.norm2.inverse(values[1])]) + def autoscale(self, A): + """ + Set *vmin*, *vmax* to min, max of *A*. + """ + self.norm1.autoscale(A[0]) + self.norm2.autoscale(A[1]) + + def autoscale_None(self, A): + 'autoscale only None-valued vmin or vmax' + self.norm1.autoscale_None(A[0]) + self.norm2.autoscale_None(A[1]) + + def scaled(self): + 'return true if vmin and vmax set for both normalizers' + return self.norm1.scaled() and self.norm2.scaled() + def rgb_to_hsv(arr): """ From a9aace387a70d3986024fac172c27a7c7a596149 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 17 Jul 2017 01:38:00 +0530 Subject: [PATCH 09/35] trying to show ticks and labels on both x and y axis --- lib/matplotlib/cm.py | 3 +- lib/matplotlib/colorbar.py | 560 ++++++++++++++++++++++++++++++++++++- 2 files changed, 560 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py index bdf3e1575653..b9b59bbbdd1f 100644 --- a/lib/matplotlib/cm.py +++ b/lib/matplotlib/cm.py @@ -201,7 +201,8 @@ def __init__(self, norm=None, cmap=None): #: The Normalization instance of this ScalarMappable. self.norm = norm #: The Colormap instance of this ScalarMappable. - self.cmap = get_cmap(cmap) + # self.cmap = get_cmap(cmap) + self.cmap = cmap #: The last colorbar associated with this ScalarMappable. May be None. self.colorbar = None self.update_dict = {'array': False} diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index 0fb4e3b47c17..a0d2b18c2191 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -900,7 +900,562 @@ def remove(self): fig.delaxes(self.ax) -class Colorbar(ColorbarBase): +class Colorsquare(ColorbarBase): + def __init__(self, ax, cmap=None, + norm=None, + alpha=None, + values=None, + boundaries=None, + ticklocation='auto', + extend='neither', + spacing='uniform', # uniform or proportional + ticks=None, + format=None, + drawedges=False, + filled=True, + extendfrac=None, + extendrect=False, + xlabel='', + ylabel='', + ): + #: The axes that this colorbar lives in. + self.ax = ax + self._patch_ax() + if cmap is None: + cmap = colors.BivariateColormap() + if norm is None: + norm = colors.BivariateNorm() + self.alpha = alpha + cm.ScalarMappable.__init__(self, cmap=cmap, norm=norm) + self.values = values + self.boundaries = boundaries + self.extend = extend + self._inside = self._slice_dict[extend] + self.spacing = spacing + self.drawedges = drawedges + self.filled = filled + self.extendfrac = extendfrac + self.extendrect = extendrect + self.solids = None + self.lines = list() + self.outline = None + self.patch = None + self.dividers = None + + self.set_label(xlabel, ylabel) + if cbook.iterable(ticks): + self.locator = ticker.FixedLocator(ticks, nbins=len(ticks)) + else: + self.locator = ticks # Handle default in _ticker() + if format is None: + if isinstance(self.norm, colors.LogNorm): + self.formatter = ticker.LogFormatterSciNotation() + elif isinstance(self.norm, colors.SymLogNorm): + self.formatter = ticker.LogFormatterSciNotation( + linthresh=self.norm.linthresh) + else: + self.formatter = ticker.ScalarFormatter() + elif isinstance(format, six.string_types): + self.formatter = ticker.FormatStrFormatter(format) + else: + self.formatter = format # Assume it is a Formatter + # The rest is in a method so we can recalculate when clim changes. + self.config_axis() + self.draw_all() + + def draw_all(self): + ''' + Calculate any free parameters based on the current cmap and norm, + and do all the drawing. + ''' + + self._process_values() + self._find_range() + X, Y = self._mesh() + C = self._values[:, np.newaxis] + self._config_axes(X, Y) + if self.filled: + self._add_solids(X, Y, C) + + def config_axis(self): + ax = self.ax + + ax.yaxis.set_label_position('right') + ax.yaxis.set_ticks_position('right') + + ax.xaxis.set_label_position('bottom') + ax.xaxis.set_ticks_position('bottom') + + self._set_label() + + def update_ticks(self): + """ + Force the update of the ticks and ticklabels. This must be + called whenever the tick locator and/or tick formatter changes. + """ + ax = self.ax + # xticks, yticks, xticklabels, yticklabels, offset_string = self._ticker() + yticks, yticklabels, offset_string = self._ticker() + xticks = [] + xticklabels = '' + ax.yaxis.set_ticks(yticks) + ax.set_yticklabels(yticklabels) + ax.yaxis.get_major_formatter().set_offset_string(offset_string) + ax.xaxis.set_ticks(xticks) + ax.set_xticklabels(xticklabels) + ax.xaxis.get_major_formatter().set_offset_string(offset_string) + + def set_ticks(self, xticks, yticks, update_ticks=True): + """ + Set tick locations. + + Parameters + ---------- + ticks : {None, sequence, :class:`~matplotlib.ticker.Locator` instance} + If None, a default Locator will be used. + + update_ticks : {True, False}, optional + If True, tick locations are updated immediately. If False, + use :meth:`update_ticks` to manually update the ticks. + + """ + if cbook.iterable(xticks): + self.xlocator = ticker.FixedLocator(xticks, nbins=len(ticks)) + else: + self.xlocator = xticks + + if cbook.iterable(yticks): + self.ylocator = ticker.FixedLocator(yticks, nbins=len(ticks)) + else: + self.ylocator = yticks + + if update_ticks: + self.update_ticks() + self.stale = True + + def get_ticks(self, minor=False): + """Return the x ticks as a list of locations""" + return self._tick_data_values + + def set_ticklabels(self, ticklabels, update_ticks=True): + """ + set tick labels. Tick labels are updated immediately unless + update_ticks is *False*. To manually update the ticks, call + *update_ticks* method explicitly. + """ + if isinstance(self.locator, ticker.FixedLocator): + self.formatter = ticker.FixedFormatter(ticklabels) + if update_ticks: + self.update_ticks() + else: + warnings.warn("set_ticks() must have been called.") + self.stale = True + + def _config_axes(self, X, Y): + ''' + Make an axes patch and outline. + ''' + ax = self.ax + ax.set_frame_on(False) + ax.set_navigate(False) + xy = self._outline(X, Y) + ax.update_datalim(xy) + ax.set_xlim(*ax.dataLim.intervalx) + ax.set_ylim(*ax.dataLim.intervaly) + if self.outline is not None: + self.outline.remove() + self.outline = mpatches.Polygon( + xy, edgecolor=mpl.rcParams['axes.edgecolor'], + facecolor='none', + linewidth=mpl.rcParams['axes.linewidth'], + closed=True, + zorder=2) + ax.add_artist(self.outline) + self.outline.set_clip_box(None) + self.outline.set_clip_path(None) + c = mpl.rcParams['axes.facecolor'] + if self.patch is not None: + self.patch.remove() + self.patch = mpatches.Polygon(xy, edgecolor=c, + facecolor=c, + linewidth=0.01, + zorder=-1) + ax.add_artist(self.patch) + + self.update_ticks() + + def _set_label(self): + self.ax.set_ylabel(self._ylabel, **self._labelkw) + self.ax.set_xlabel(self._xlabel, **self._labelkw) + self.stale = True + + def set_label(self, xlabel, ylabel, **kw): + ''' + Label the long axis of the colorbar + ''' + self._xlabel = '%s' % (xlabel, ) + self._ylabel = '%s' % (ylabel, ) + self._labelkw = kw + self._set_label() + + def _outline(self, X, Y): + ''' + Return *x*, *y* arrays of colorbar bounding polygon, + taking orientation into account. + ''' + N = X.shape[0] + ii = [0, 1, N - 2, N - 1, 2 * N - 1, 2 * N - 2, N + 1, N, 0] + x = np.take(np.ravel(np.transpose(X)), ii) + y = np.take(np.ravel(np.transpose(Y)), ii) + x = x.reshape((len(x), 1)) + y = y.reshape((len(y), 1)) + # if self.orientation == 'horizontal': + # return np.hstack((y, x)) + return np.hstack((x, y)) + + def _edges(self, X, Y): + ''' + Return the separator line segments; helper for _add_solids. + ''' + pass + + def _add_solids(self, X, Y, C): + ''' + Draw the colors using :meth:`~matplotlib.axes.Axes.pcolormesh`; + optionally add separators. + ''' + # if self.orientation == 'vertical': + args = (X, Y, C) + # else: + # args = (np.transpose(Y), np.transpose(X), np.transpose(C)) + kw = dict(cmap=self.cmap, + norm=self.norm, + alpha=self.alpha, + edgecolors='None') + # Save, set, and restore hold state to keep pcolor from + # clearing the axes. Ordinarily this will not be needed, + # since the axes object should already have hold set. + _hold = self.ax._hold + self.ax._hold = True + col = self.ax.pcolormesh(*args, **kw) + self.ax._hold = _hold + #self.add_observer(col) # We should observe, not be observed... + + if self.solids is not None: + self.solids.remove() + self.solids = col + if self.dividers is not None: + self.dividers.remove() + self.dividers = None + if self.drawedges: + linewidths = (0.5 * mpl.rcParams['axes.linewidth'],) + """ + self.dividers = collections.LineCollection(self._edges(X, Y), + colors=(mpl.rcParams['axes.edgecolor'],), + linewidths=linewidths) + self.ax.add_collection(self.dividers) + """ + elif len(self._y) >= self.n_rasterize: + self.solids.set_rasterized(True) + + def add_lines(self, levels, colors, linewidths, erase=True): + ''' + Draw lines on the colorbar. + + *colors* and *linewidths* must be scalars or + sequences the same length as *levels*. + + Set *erase* to False to add lines without first + removing any previously added lines. + ''' + y = self._locate(levels) + igood = (y < 1.001) & (y > -0.001) + y = y[igood] + if cbook.iterable(colors): + colors = np.asarray(colors)[igood] + if cbook.iterable(linewidths): + linewidths = np.asarray(linewidths)[igood] + N = len(y) + x = np.array([0.0, 1.0]) + X, Y = np.meshgrid(x, y) + if self.orientation == 'vertical': + xy = [list(zip(X[i], Y[i])) for i in xrange(N)] + else: + xy = [list(zip(Y[i], X[i])) for i in xrange(N)] + col = collections.LineCollection(xy, linewidths=linewidths) + + if erase and self.lines: + for lc in self.lines: + lc.remove() + self.lines = [] + self.lines.append(col) + col.set_color(colors) + self.ax.add_collection(col) + self.stale = True + + def _ticker(self): + ''' + Return the sequence of ticks (colorbar data locations), + ticklabels (strings), and the corresponding offset string. + ''' + locator = self.locator + formatter = self.formatter + if locator is None: + 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(subs='all') + elif isinstance(self.norm, colors.SymLogNorm): + # The subs setting here should be replaced + # by logic in the locator. + locator = ticker.SymmetricalLogLocator( + subs=np.arange(1, 10), + linthresh=self.norm.linthresh, + base=10) + else: + if mpl.rcParams['_internal.classic_mode']: + locator = ticker.MaxNLocator() + else: + locator = ticker.AutoLocator() + else: + b = self._boundaries[self._inside] + locator = ticker.FixedLocator(b, nbins=10) + if isinstance(self.norm, colors.NoNorm) and self.boundaries is None: + intv = self._values[0], self._values[-1] + else: + intv = self.vmin, self.vmax + locator.create_dummy_axis(minpos=intv[0]) + formatter.create_dummy_axis(minpos=intv[0]) + locator.set_view_interval(*intv) + locator.set_data_interval(*intv) + formatter.set_view_interval(*intv) + formatter.set_data_interval(*intv) + + b = np.array(locator()) + if isinstance(locator, ticker.LogLocator): + eps = 1e-10 + b = b[(b <= intv[1] * (1 + eps)) & (b >= intv[0] * (1 - eps))] + else: + eps = (intv[1] - intv[0]) * 1e-10 + b = b[(b <= intv[1] + eps) & (b >= intv[0] - eps)] + self._tick_data_values = b + ticks = self._locate(b) + formatter.set_locs(b) + ticklabels = [formatter(t, i) for i, t in enumerate(b)] + offset_string = formatter.get_offset() + return ticks, ticklabels, offset_string + + 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[self._inside] = np.arange(self.cmap.N, dtype=np.int16) + if self._extend_lower(): + v[0] = -1 + if self._extend_upper(): + v[-1] = self.cmap.N + self._boundaries = b + self._values = v + return + elif isinstance(self.norm, colors.BoundaryNorm): + b = list(self.norm.boundaries) + if self._extend_lower(): + b = [b[0] - 1] + b + if self._extend_upper(): + b = b + [b[-1] + 1] + b = np.array(b) + v = np.zeros((len(b) - 1,), dtype=float) + bi = self.norm.boundaries + v[self._inside] = 0.5 * (bi[:-1] + bi[1:]) + if self._extend_lower(): + v[0] = b[0] - 1 + if self._extend_upper(): + v[-1] = b[-1] + 1 + self._boundaries = b + self._values = v + return + else: + if not self.norm.scaled(): + self.norm.vmin = 0 + self.norm.vmax = 1 + + self.norm.vmin, self.norm.vmax = mtransforms.nonsingular( + self.norm.vmin, + self.norm.vmax, + expander=0.1) + + b = self.norm.inverse(self._uniform_y(self.cmap.N + 1)) + + if isinstance(self.norm, colors.LogNorm): + # If using a lognorm, ensure extensions don't go negative + if self._extend_lower(): + b[0] = 0.9 * b[0] + if self._extend_upper(): + b[-1] = 1.1 * b[-1] + else: + if self._extend_lower(): + b[0] = b[0] - 1 + if self._extend_upper(): + b[-1] = b[-1] + 1 + self._process_values(b) + + def _find_range(self): + ''' + Set :attr:`vmin` and :attr:`vmax` attributes to the first and + last boundary excluding extended end boundaries. + ''' + b = self._boundaries[self._inside] + self.vmin = b[0] + self.vmax = b[-1] + + def _central_N(self): + '''number of boundaries **before** extension of ends''' + nb = len(self._boundaries) + if self.extend == 'both': + nb -= 2 + elif self.extend in ('min', 'max'): + nb -= 1 + return nb + + def _extended_N(self): + ''' + Based on the colormap and extend variable, return the + number of boundaries. + ''' + N = self.cmap.N + 1 + if self.extend == 'both': + N += 2 + elif self.extend in ('min', 'max'): + N += 1 + return N + + def _proportional_y(self): + ''' + Return colorbar data coordinates for the boundaries of + a proportional colorbar. + ''' + if isinstance(self.norm, colors.BoundaryNorm): + y = (self._boundaries - self._boundaries[0]) + y = y / (self._boundaries[-1] - self._boundaries[0]) + else: + y = self.norm(self._boundaries.copy()) + y = np.ma.filled(y, np.nan) + if self.extend == 'min': + # Exclude leftmost interval of y. + clen = y[-1] - y[1] + automin = (y[2] - y[1]) / clen + automax = (y[-1] - y[-2]) / clen + elif self.extend == 'max': + # Exclude rightmost interval in y. + clen = y[-2] - y[0] + automin = (y[1] - y[0]) / clen + automax = (y[-2] - y[-3]) / clen + elif self.extend == 'both': + # Exclude leftmost and rightmost intervals in y. + clen = y[-2] - y[1] + automin = (y[2] - y[1]) / clen + automax = (y[-2] - y[-3]) / clen + if self.extend in ('both', 'min', 'max'): + extendlength = self._get_extension_lengths(self.extendfrac, + automin, automax, + default=0.05) + if self.extend in ('both', 'min'): + y[0] = 0. - extendlength[0] + if self.extend in ('both', 'max'): + y[-1] = 1. + extendlength[1] + yi = y[self._inside] + norm = colors.Normalize(yi[0], yi[-1]) + y[self._inside] = np.ma.filled(norm(yi), np.nan) + 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([0.0, 1.0]) + if self.spacing == 'uniform': + y = self._uniform_y(self._central_N()) + else: + y = self._proportional_y() + self._y = y + X, Y = np.meshgrid(x, y) + if self._extend_lower() and not self.extendrect: + X[0, :] = 0.5 + if self._extend_upper() and not self.extendrect: + X[-1, :] = 0.5 + return X, Y + + def _locate(self, x): + ''' + Given a set of color data values, return their + corresponding colorbar data coordinates. + ''' + if isinstance(self.norm, (colors.NoNorm, colors.BoundaryNorm)): + b = self._boundaries + xn = x + else: + # Do calculations using normalized coordinates so + # as to make the interpolation more accurate. + b = self.norm(self._boundaries, clip=False).filled() + xn = self.norm(x, clip=False).filled() + + # The rest is linear interpolation with extrapolation at ends. + ii = np.searchsorted(b, xn) + i0 = ii - 1 + itop = (ii == len(b)) + ibot = (ii == 0) + i0[itop] -= 1 + ii[itop] -= 1 + i0[ibot] += 1 + ii[ibot] += 1 + + db = np.take(b, ii) - np.take(b, i0) + y = self._y + dy = np.take(y, ii) - np.take(y, i0) + z = np.take(y, i0) + (xn - np.take(b, i0)) * dy / db + return z + + +class Colorbar(Colorsquare): """ This class connects a :class:`ColorbarBase` to a :class:`~matplotlib.cm.ScalarMappable` such as a @@ -940,7 +1495,7 @@ def __init__(self, ax, mappable, **kw): if isinstance(mappable, martist.Artist): kw['alpha'] = mappable.get_alpha() - ColorbarBase.__init__(self, ax, **kw) + Colorsquare.__init__(self, ax, **kw) def on_mappable_changed(self, mappable): """ @@ -1362,6 +1917,7 @@ def colorbar_factory(cax, mappable, **kwargs): and any([hatch is not None for hatch in mappable.hatches])): cb = ColorbarPatch(cax, mappable, **kwargs) else: + temp = kwargs.pop('orientation', 'vert') cb = Colorbar(cax, mappable, **kwargs) cid = mappable.callbacksSM.connect('changed', cb.on_mappable_changed) From 55a7a689f5b10a64ea8d7ff0e6db15e19e37c3a5 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 17 Jul 2017 12:47:55 +0530 Subject: [PATCH 10/35] commented outline code, changed gridspace to show sqaure colorbar --- lib/matplotlib/colorbar.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index a0d2b18c2191..62445db3363f 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -1020,12 +1020,12 @@ def set_ticks(self, xticks, yticks, update_ticks=True): """ if cbook.iterable(xticks): - self.xlocator = ticker.FixedLocator(xticks, nbins=len(ticks)) + self.xlocator = ticker.FixedLocator(xticks, nbins=len(xticks)) else: self.xlocator = xticks if cbook.iterable(yticks): - self.ylocator = ticker.FixedLocator(yticks, nbins=len(ticks)) + self.ylocator = ticker.FixedLocator(yticks, nbins=len(yticks)) else: self.ylocator = yticks @@ -1037,14 +1037,15 @@ def get_ticks(self, minor=False): """Return the x ticks as a list of locations""" return self._tick_data_values - def set_ticklabels(self, ticklabels, update_ticks=True): + def set_ticklabels(self, xticklabels, yticklabels, update_ticks=True): """ set tick labels. Tick labels are updated immediately unless update_ticks is *False*. To manually update the ticks, call *update_ticks* method explicitly. """ if isinstance(self.locator, ticker.FixedLocator): - self.formatter = ticker.FixedFormatter(ticklabels) + self.xformatter = ticker.FixedFormatter(xticklabels) + self.yformatter = ticker.FixedFormatter(yticklabels) if update_ticks: self.update_ticks() else: @@ -1056,14 +1057,15 @@ def _config_axes(self, X, Y): Make an axes patch and outline. ''' ax = self.ax - ax.set_frame_on(False) + # ax.set_frame_on(False) ax.set_navigate(False) - xy = self._outline(X, Y) - ax.update_datalim(xy) - ax.set_xlim(*ax.dataLim.intervalx) - ax.set_ylim(*ax.dataLim.intervaly) - if self.outline is not None: - self.outline.remove() + # xy = self._outline(X, Y) + # ax.update_datalim(xy) + # ax.set_xlim(*ax.dataLim.intervalx) + # ax.set_ylim(*ax.dataLim.intervaly) + # if self.outline is not None: + # self.outline.remove() + """ self.outline = mpatches.Polygon( xy, edgecolor=mpl.rcParams['axes.edgecolor'], facecolor='none', @@ -1073,6 +1075,7 @@ def _config_axes(self, X, Y): ax.add_artist(self.outline) self.outline.set_clip_box(None) self.outline.set_clip_path(None) + c = mpl.rcParams['axes.facecolor'] if self.patch is not None: self.patch.remove() @@ -1081,7 +1084,7 @@ def _config_axes(self, X, Y): linewidth=0.01, zorder=-1) ax.add_artist(self.patch) - + """ self.update_ticks() def _set_label(self): @@ -1768,9 +1771,9 @@ def make_axes_gridspec(parent, **kw): orientation = kw.setdefault('orientation', 'vertical') kw['ticklocation'] = 'auto' - fraction = kw.pop('fraction', 0.15) + fraction = kw.pop('fraction', 0.35) shrink = kw.pop('shrink', 1.0) - aspect = kw.pop('aspect', 20) + aspect = kw.pop('aspect', 1) x1 = 1.0 - fraction From c2eb617702bca52cc15875ab640628a3eb5b2417 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 17 Jul 2017 15:06:46 +0530 Subject: [PATCH 11/35] 2d colorbar printing now --- lib/matplotlib/colorbar.py | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index 62445db3363f..74c0bae946f3 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -972,7 +972,8 @@ def draw_all(self): self._process_values() self._find_range() X, Y = self._mesh() - C = self._values[:, np.newaxis] + C = np.array(X * 256 * 256 + Y * 256, dtype='int64') + # C = self._values[:, np.newaxis] self._config_axes(X, Y) if self.filled: self._add_solids(X, Y, C) @@ -1101,21 +1102,6 @@ def set_label(self, xlabel, ylabel, **kw): self._labelkw = kw self._set_label() - def _outline(self, X, Y): - ''' - Return *x*, *y* arrays of colorbar bounding polygon, - taking orientation into account. - ''' - N = X.shape[0] - ii = [0, 1, N - 2, N - 1, 2 * N - 1, 2 * N - 2, N + 1, N, 0] - x = np.take(np.ravel(np.transpose(X)), ii) - y = np.take(np.ravel(np.transpose(Y)), ii) - x = x.reshape((len(x), 1)) - y = y.reshape((len(y), 1)) - # if self.orientation == 'horizontal': - # return np.hstack((y, x)) - return np.hstack((x, y)) - def _edges(self, X, Y): ''' Return the separator line segments; helper for _add_solids. @@ -1414,11 +1400,11 @@ def _mesh(self): transposition for a horizontal colorbar are done outside this function. ''' - x = np.array([0.0, 1.0]) if self.spacing == 'uniform': - y = self._uniform_y(self._central_N()) + x = y = self._uniform_y(self._central_N()) else: - y = self._proportional_y() + x = y = self._proportional_y() + self._x = x self._y = y X, Y = np.meshgrid(x, y) if self._extend_lower() and not self.extendrect: From daef75126ed28ea738e33615b36c12ab62c096a0 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Sun, 23 Jul 2017 03:14:48 +0530 Subject: [PATCH 12/35] Add code for Colorsquare --- lib/matplotlib/colorbar.py | 591 ++++++++++++++++--------------------- 1 file changed, 262 insertions(+), 329 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index 74c0bae946f3..dd567e439e46 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -900,21 +900,21 @@ def remove(self): fig.delaxes(self.ax) -class Colorsquare(ColorbarBase): +class ColorsquareBase(cm.ScalarMappable): + n_rasterize = 50 # rasterize solids if number of colors >= n_rasterize def __init__(self, ax, cmap=None, norm=None, alpha=None, - values=None, - boundaries=None, - ticklocation='auto', - extend='neither', - spacing='uniform', # uniform or proportional - ticks=None, - format=None, + xvalues=None, + yvalues=None, + xboundaries=None, + yboundaries=None, + xticks=None, + yticks=None, + xformat=None, + yformat=None, drawedges=False, filled=True, - extendfrac=None, - extendrect=False, xlabel='', ylabel='', ): @@ -927,59 +927,78 @@ def __init__(self, ax, cmap=None, norm = colors.BivariateNorm() self.alpha = alpha cm.ScalarMappable.__init__(self, cmap=cmap, norm=norm) - self.values = values - self.boundaries = boundaries - self.extend = extend - self._inside = self._slice_dict[extend] - self.spacing = spacing + self.xvalues = xvalues + self.yvalues = yvalues + self.xboundaries = xboundaries + self.yboundaries = yboundaries + self._inside = slice(0, None) self.drawedges = drawedges self.filled = filled - self.extendfrac = extendfrac - self.extendrect = extendrect self.solids = None self.lines = list() - self.outline = None - self.patch = None self.dividers = None - self.set_label(xlabel, ylabel) - if cbook.iterable(ticks): - self.locator = ticker.FixedLocator(ticks, nbins=len(ticks)) + + if cbook.iterable(xticks): + self.xlocator = ticker.FixedLocator(xticks, nbins=len(xticks)) else: - self.locator = ticks # Handle default in _ticker() - if format is None: - if isinstance(self.norm, colors.LogNorm): - self.formatter = ticker.LogFormatterSciNotation() - elif isinstance(self.norm, colors.SymLogNorm): - self.formatter = ticker.LogFormatterSciNotation( - linthresh=self.norm.linthresh) + self.xlocator = xticks # Handle default in _ticker() + + if cbook.iterable(yticks): + self.ylocator = ticker.FixedLocator(yticks, nbins=len(yticks)) + else: + self.ylocator = yticks + + if xformat is None: + if isinstance(self.norm.norm1, colors.LogNorm): + self.xformatter = ticker.LogFormatterSciNotation() + elif isinstance(self.norm.norm1, colors.SymLogNorm): + self.xformatter = ticker.LogFormatterSciNotation( + linthresh=self.norm.norm1.linthresh) else: - self.formatter = ticker.ScalarFormatter() - elif isinstance(format, six.string_types): - self.formatter = ticker.FormatStrFormatter(format) + self.xformatter = ticker.ScalarFormatter() + elif isinstance(xformat, six.string_types): + self.xformatter = ticker.FormatStrFormatter(xformat) else: - self.formatter = format # Assume it is a Formatter + self.xformatter = xformat # Assume it is a Formatter + + if yformat is None: + if isinstance(self.norm.norm2, colors.LogNorm): + self.yformatter = ticker.LogFormatterSciNotation() + elif isinstance(self.norm.norm2, colors.SymLogNorm): + self.yformatter = ticker.LogFormatterSciNotation( + linthresh=self.norm.norm2.linthresh) + else: + self.yformatter = ticker.ScalarFormatter() + elif isinstance(yformat, six.string_types): + self.yformatter = ticker.FormatStrFormatter(yformat) + else: + self.yformatter = yformat # Assume it is a Formatter + # The rest is in a method so we can recalculate when clim changes. self.config_axis() self.draw_all() - def draw_all(self): - ''' - Calculate any free parameters based on the current cmap and norm, - and do all the drawing. - ''' + def _patch_ax(self): + # bind some methods to the axes to warn users + # against using those methods. + self.ax.set_xticks = _set_ticks_on_axis_warn + self.ax.set_yticks = _set_ticks_on_axis_warn - self._process_values() - self._find_range() + def draw_all(self): + normx = self.norm.norm1 + normy = self.norm.norm2 + self._xvalues, self._xboundaries = self._process_values(norm=normx) + self._yvalues, self._yboundaries = self._process_values(norm=normy) X, Y = self._mesh() - C = np.array(X * 256 * 256 + Y * 256, dtype='int64') - # C = self._values[:, np.newaxis] - self._config_axes(X, Y) + CX, CY = np.meshgrid(self._xvalues, self._yvalues) + self.update_ticks() if self.filled: - self._add_solids(X, Y, C) + self._add_solids(X, Y, [CX, CY]) def config_axis(self): ax = self.ax + ax.set_navigate(False) ax.yaxis.set_label_position('right') ax.yaxis.set_ticks_position('right') @@ -995,31 +1014,18 @@ def update_ticks(self): called whenever the tick locator and/or tick formatter changes. """ ax = self.ax - # xticks, yticks, xticklabels, yticklabels, offset_string = self._ticker() - yticks, yticklabels, offset_string = self._ticker() - xticks = [] - xticklabels = '' - ax.yaxis.set_ticks(yticks) - ax.set_yticklabels(yticklabels) - ax.yaxis.get_major_formatter().set_offset_string(offset_string) + xticks, xticklabels, xoffset_string = self._ticker(self.norm.norm1) + yticks, yticklabels, yoffset_string = self._ticker(self.norm.norm2) + ax.xaxis.set_ticks(xticks) ax.set_xticklabels(xticklabels) - ax.xaxis.get_major_formatter().set_offset_string(offset_string) - - def set_ticks(self, xticks, yticks, update_ticks=True): - """ - Set tick locations. - - Parameters - ---------- - ticks : {None, sequence, :class:`~matplotlib.ticker.Locator` instance} - If None, a default Locator will be used. + ax.xaxis.get_major_formatter().set_offset_string(xoffset_string) - update_ticks : {True, False}, optional - If True, tick locations are updated immediately. If False, - use :meth:`update_ticks` to manually update the ticks. + ax.yaxis.set_ticks(yticks) + ax.set_yticklabels(yticklabels) + ax.yaxis.get_major_formatter().set_offset_string(yoffset_string) - """ + def set_ticks(self, xticks, yticks, update_ticks=True): if cbook.iterable(xticks): self.xlocator = ticker.FixedLocator(xticks, nbins=len(xticks)) else: @@ -1034,59 +1040,28 @@ def set_ticks(self, xticks, yticks, update_ticks=True): self.update_ticks() self.stale = True - def get_ticks(self, minor=False): - """Return the x ticks as a list of locations""" - return self._tick_data_values - - def set_ticklabels(self, xticklabels, yticklabels, update_ticks=True): + def set_ticklabels(self, xticklabels=None, yticklabels=None, + update_ticks=True): """ set tick labels. Tick labels are updated immediately unless update_ticks is *False*. To manually update the ticks, call *update_ticks* method explicitly. """ - if isinstance(self.locator, ticker.FixedLocator): - self.xformatter = ticker.FixedFormatter(xticklabels) - self.yformatter = ticker.FixedFormatter(yticklabels) + if xticklabels is not None or yticklabels is not None: + if isinstance(self.xlocator, ticker.FixedLocator): + self.xformatter = ticker.FixedFormatter(xticklabels) + + if isinstance(self.ylocator, ticker.FixedLocator): + self.yformatter = ticker.FixedFormatter(yticklabels) + if update_ticks: self.update_ticks() - else: - warnings.warn("set_ticks() must have been called.") - self.stale = True - def _config_axes(self, X, Y): - ''' - Make an axes patch and outline. - ''' - ax = self.ax - # ax.set_frame_on(False) - ax.set_navigate(False) - # xy = self._outline(X, Y) - # ax.update_datalim(xy) - # ax.set_xlim(*ax.dataLim.intervalx) - # ax.set_ylim(*ax.dataLim.intervaly) - # if self.outline is not None: - # self.outline.remove() - """ - self.outline = mpatches.Polygon( - xy, edgecolor=mpl.rcParams['axes.edgecolor'], - facecolor='none', - linewidth=mpl.rcParams['axes.linewidth'], - closed=True, - zorder=2) - ax.add_artist(self.outline) - self.outline.set_clip_box(None) - self.outline.set_clip_path(None) + self.stale = True + return - c = mpl.rcParams['axes.facecolor'] - if self.patch is not None: - self.patch.remove() - self.patch = mpatches.Polygon(xy, edgecolor=c, - facecolor=c, - linewidth=0.01, - zorder=-1) - ax.add_artist(self.patch) - """ - self.update_ticks() + warnings.warn("set_ticks() must have been called.") + self.stale = True def _set_label(self): self.ax.set_ylabel(self._ylabel, **self._labelkw) @@ -1095,7 +1070,7 @@ def _set_label(self): def set_label(self, xlabel, ylabel, **kw): ''' - Label the long axis of the colorbar + Label the axes of the colorbar ''' self._xlabel = '%s' % (xlabel, ) self._ylabel = '%s' % (ylabel, ) @@ -1106,17 +1081,16 @@ def _edges(self, X, Y): ''' Return the separator line segments; helper for _add_solids. ''' - pass + N = X.shape[0]. + return [list(zip(X[i], Y[i])) for i in xrange(1, N - 1)] + + [list(zip(Y[i], X[i])) for i in xrange(1, N - 1)] def _add_solids(self, X, Y, C): ''' Draw the colors using :meth:`~matplotlib.axes.Axes.pcolormesh`; optionally add separators. ''' - # if self.orientation == 'vertical': args = (X, Y, C) - # else: - # args = (np.transpose(Y), np.transpose(X), np.transpose(C)) kw = dict(cmap=self.cmap, norm=self.norm, alpha=self.alpha, @@ -1128,7 +1102,6 @@ def _add_solids(self, X, Y, C): self.ax._hold = True col = self.ax.pcolormesh(*args, **kw) self.ax._hold = _hold - #self.add_observer(col) # We should observe, not be observed... if self.solids is not None: self.solids.remove() @@ -1138,74 +1111,49 @@ def _add_solids(self, X, Y, C): self.dividers = None if self.drawedges: linewidths = (0.5 * mpl.rcParams['axes.linewidth'],) - """ self.dividers = collections.LineCollection(self._edges(X, Y), colors=(mpl.rcParams['axes.edgecolor'],), linewidths=linewidths) self.ax.add_collection(self.dividers) - """ - elif len(self._y) >= self.n_rasterize: + elif(len(self._y) >= self.n_rasterize + or len(self._x) >= self.n_rasterize): self.solids.set_rasterized(True) - def add_lines(self, levels, colors, linewidths, erase=True): - ''' - Draw lines on the colorbar. - - *colors* and *linewidths* must be scalars or - sequences the same length as *levels*. - - Set *erase* to False to add lines without first - removing any previously added lines. - ''' - y = self._locate(levels) - igood = (y < 1.001) & (y > -0.001) - y = y[igood] - if cbook.iterable(colors): - colors = np.asarray(colors)[igood] - if cbook.iterable(linewidths): - linewidths = np.asarray(linewidths)[igood] - N = len(y) - x = np.array([0.0, 1.0]) - X, Y = np.meshgrid(x, y) - if self.orientation == 'vertical': - xy = [list(zip(X[i], Y[i])) for i in xrange(N)] - else: - xy = [list(zip(Y[i], X[i])) for i in xrange(N)] - col = collections.LineCollection(xy, linewidths=linewidths) - - if erase and self.lines: - for lc in self.lines: - lc.remove() - self.lines = [] - self.lines.append(col) - col.set_color(colors) - self.ax.add_collection(col) - self.stale = True - - def _ticker(self): + def _ticker(self, norm): ''' Return the sequence of ticks (colorbar data locations), ticklabels (strings), and the corresponding offset string. ''' - locator = self.locator - formatter = self.formatter + if norm is self.norm.norm1: + _values = self._xvalues + _boundaries = self._xboundaries + boundaries = self.xboundaries + locator = self.xlocator + formatter = self.xformatter + else: + _values = self._yvalues + _boundaries = self._yboundaries + boundaries = self.yboundaries + locator = self.ylocator + formatter = self.yformatter + if locator is None: - if self.boundaries is None: - if isinstance(self.norm, colors.NoNorm): - nv = len(self._values) + if boundaries is None: + if isinstance(norm, colors.NoNorm): + nv = len(_values) base = 1 + int(nv / 10) locator = ticker.IndexLocator(base=base, offset=0) - elif isinstance(self.norm, colors.BoundaryNorm): - b = self.norm.boundaries + elif isinstance(norm, colors.BoundaryNorm): + b = norm.boundaries locator = ticker.FixedLocator(b, nbins=10) - elif isinstance(self.norm, colors.LogNorm): + elif isinstance(norm, colors.LogNorm): locator = ticker.LogLocator(subs='all') - elif isinstance(self.norm, colors.SymLogNorm): + elif isinstance(norm, colors.SymLogNorm): # The subs setting here should be replaced # by logic in the locator. locator = ticker.SymmetricalLogLocator( subs=np.arange(1, 10), - linthresh=self.norm.linthresh, + linthresh=norm.linthresh, base=10) else: if mpl.rcParams['_internal.classic_mode']: @@ -1213,12 +1161,13 @@ def _ticker(self): else: locator = ticker.AutoLocator() else: - b = self._boundaries[self._inside] + b = _boundaries[self._inside] locator = ticker.FixedLocator(b, nbins=10) - if isinstance(self.norm, colors.NoNorm) and self.boundaries is None: - intv = self._values[0], self._values[-1] + if isinstance(norm, colors.NoNorm) and boundaries is None: + intv = _values[0], _values[-1] else: - intv = self.vmin, self.vmax + b = _boundaries[self._inside] + intv = b[0], b[-1] locator.create_dummy_axis(minpos=intv[0]) formatter.create_dummy_axis(minpos=intv[0]) locator.set_view_interval(*intv) @@ -1233,199 +1182,96 @@ def _ticker(self): else: eps = (intv[1] - intv[0]) * 1e-10 b = b[(b <= intv[1] + eps) & (b >= intv[0] - eps)] - self._tick_data_values = b - ticks = self._locate(b) + # self._tick_data_values = b + ticks = self._locate(b, norm) formatter.set_locs(b) ticklabels = [formatter(t, i) for i, t in enumerate(b)] offset_string = formatter.get_offset() return ticks, ticklabels, offset_string - 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*. - ''' + def _process_values(self, b=None, norm=None): + if norm is self.norm.norm1: + boundaries = self.xboundaries + values = self.xvalues + else: + boundaries = self.yboundaries + values = self.yvalues if b is None: - b = self.boundaries + b = 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 = np.asarray(b, dtype=float) + if values is None: + v = 0.5 * (b[:-1] + b[1:]) + if isinstance(norm, colors.NoNorm): + v = (v + 0.00001).astype(np.int16) + return v, b + v = np.array(self.values) + return v, b + if values is not None: + v = np.array(values) + if boundaries is None: + b = np.zeros(len(values) + 1, 'd') + b[1:-1] = 0.5 * (v[:-1] - v[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 + return v, b + b = np.array(boundaries) + return v, b # 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 + N = self.cmap.N + if isinstance(norm, colors.NoNorm): + b = np.linspace(0, 1, np.sqrt(N) + 1) * np.sqrt(N) - 0.5 v = np.zeros((len(b) - 1,), dtype=np.int16) - v[self._inside] = np.arange(self.cmap.N, dtype=np.int16) - if self._extend_lower(): - v[0] = -1 - if self._extend_upper(): - v[-1] = self.cmap.N - self._boundaries = b - self._values = v - return - elif isinstance(self.norm, colors.BoundaryNorm): - b = list(self.norm.boundaries) - if self._extend_lower(): - b = [b[0] - 1] + b - if self._extend_upper(): - b = b + [b[-1] + 1] + v[self._inside] = np.arange(np.sqrt(N), dtype=np.int16) + return v, b + elif isinstance(norm, colors.BoundaryNorm): + b = list(norm.boundaries) b = np.array(b) v = np.zeros((len(b) - 1,), dtype=float) - bi = self.norm.boundaries + bi = norm.boundaries v[self._inside] = 0.5 * (bi[:-1] + bi[1:]) - if self._extend_lower(): - v[0] = b[0] - 1 - if self._extend_upper(): - v[-1] = b[-1] + 1 - self._boundaries = b - self._values = v - return + return v, b else: - if not self.norm.scaled(): - self.norm.vmin = 0 - self.norm.vmax = 1 + if not norm.scaled(): + norm.vmin = 0 + norm.norm1.vmax = 1 - self.norm.vmin, self.norm.vmax = mtransforms.nonsingular( - self.norm.vmin, - self.norm.vmax, - expander=0.1) + norm.vmin, norm.vmax = mtransforms.nonsingular( + norm.vmin, norm.vmax, expander=0.1) - b = self.norm.inverse(self._uniform_y(self.cmap.N + 1)) + b = norm.inverse(np.linspace(0, 1, np.sqrt(N) + 1)) - if isinstance(self.norm, colors.LogNorm): - # If using a lognorm, ensure extensions don't go negative - if self._extend_lower(): - b[0] = 0.9 * b[0] - if self._extend_upper(): - b[-1] = 1.1 * b[-1] - else: - if self._extend_lower(): - b[0] = b[0] - 1 - if self._extend_upper(): - b[-1] = b[-1] + 1 - self._process_values(b) - - def _find_range(self): - ''' - Set :attr:`vmin` and :attr:`vmax` attributes to the first and - last boundary excluding extended end boundaries. - ''' - b = self._boundaries[self._inside] - self.vmin = b[0] - self.vmax = b[-1] - - def _central_N(self): - '''number of boundaries **before** extension of ends''' - nb = len(self._boundaries) - if self.extend == 'both': - nb -= 2 - elif self.extend in ('min', 'max'): - nb -= 1 - return nb - - def _extended_N(self): - ''' - Based on the colormap and extend variable, return the - number of boundaries. - ''' - N = self.cmap.N + 1 - if self.extend == 'both': - N += 2 - elif self.extend in ('min', 'max'): - N += 1 - return N - - def _proportional_y(self): - ''' - Return colorbar data coordinates for the boundaries of - a proportional colorbar. - ''' - if isinstance(self.norm, colors.BoundaryNorm): - y = (self._boundaries - self._boundaries[0]) - y = y / (self._boundaries[-1] - self._boundaries[0]) - else: - y = self.norm(self._boundaries.copy()) - y = np.ma.filled(y, np.nan) - if self.extend == 'min': - # Exclude leftmost interval of y. - clen = y[-1] - y[1] - automin = (y[2] - y[1]) / clen - automax = (y[-1] - y[-2]) / clen - elif self.extend == 'max': - # Exclude rightmost interval in y. - clen = y[-2] - y[0] - automin = (y[1] - y[0]) / clen - automax = (y[-2] - y[-3]) / clen - elif self.extend == 'both': - # Exclude leftmost and rightmost intervals in y. - clen = y[-2] - y[1] - automin = (y[2] - y[1]) / clen - automax = (y[-2] - y[-3]) / clen - if self.extend in ('both', 'min', 'max'): - extendlength = self._get_extension_lengths(self.extendfrac, - automin, automax, - default=0.05) - if self.extend in ('both', 'min'): - y[0] = 0. - extendlength[0] - if self.extend in ('both', 'max'): - y[-1] = 1. + extendlength[1] - yi = y[self._inside] - norm = colors.Normalize(yi[0], yi[-1]) - y[self._inside] = np.ma.filled(norm(yi), np.nan) - return y + return self._process_values(b=b, norm=norm) 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. ''' - if self.spacing == 'uniform': - x = y = self._uniform_y(self._central_N()) - else: - x = y = self._proportional_y() + x = np.linspace(0, 1, len(self._xboundaries)) + y = np.linspace(0, 1, len(self._yboundaries)) self._x = x self._y = y X, Y = np.meshgrid(x, y) - if self._extend_lower() and not self.extendrect: - X[0, :] = 0.5 - if self._extend_upper() and not self.extendrect: - X[-1, :] = 0.5 return X, Y - def _locate(self, x): + def _locate(self, x, norm): ''' Given a set of color data values, return their corresponding colorbar data coordinates. ''' - if isinstance(self.norm, (colors.NoNorm, colors.BoundaryNorm)): - b = self._boundaries + if norm is self.norm.norm1: + boundaries = self._xboundaries + else: + boundaries = self._yboundaries + if isinstance(norm, (colors.NoNorm, colors.BoundaryNorm)): + b = boundaries xn = x else: # Do calculations using normalized coordinates so # as to make the interpolation more accurate. - b = self.norm(self._boundaries, clip=False).filled() - xn = self.norm(x, clip=False).filled() + b = norm(boundaries, clip=False).filled() + xn = norm(x, clip=False).filled() # The rest is linear interpolation with extrapolation at ends. ii = np.searchsorted(b, xn) @@ -1443,8 +1289,17 @@ def _locate(self, x): z = np.take(y, i0) + (xn - np.take(b, i0)) * dy / db return z + def set_alpha(self, alpha): + self.alpha = alpha -class Colorbar(Colorsquare): + def remove(self): + """ + Remove this colorsquare from the figure + """ + fig = self.ax.figure + fig.delaxes(self.ax) + +class Colorbar(ColorbarBase): """ This class connects a :class:`ColorbarBase` to a :class:`~matplotlib.cm.ScalarMappable` such as a @@ -1484,7 +1339,7 @@ def __init__(self, ax, mappable, **kw): if isinstance(mappable, martist.Artist): kw['alpha'] = mappable.get_alpha() - Colorsquare.__init__(self, ax, **kw) + ColorbarBase.__init__(self, ax, **kw) def on_mappable_changed(self, mappable): """ @@ -1599,6 +1454,81 @@ def remove(self): ax.set_subplotspec(subplotspec) +class Colorsquare(ColorsquareBase): + """ + This class connects a :class:`Colorbarsquare` to a + :class:`~matplotlib.cm.ScalarMappable` such as a + :class:`~matplotlib.image.AxesImage` generated via + :meth:`~matplotlib.axes.Axes.imshow`. + + It is not intended to be instantiated directly; instead, + use :meth:`~matplotlib.figure.Figure.colorbar` or + :func:`~matplotlib.pyplot.colorbar` to make your colorsquare. + + """ + def __init__(self, ax, mappable, **kw): + # Ensure the given mappable's norm has appropriate vmin and vmax set + # even if mappable.draw has not yet been called. + mappable.autoscale_None() + + self.mappable = mappable + kw['cmap'] = cmap = mappable.cmap + kw['norm'] = norm = mappable.norm + + if isinstance(mappable, martist.Artist): + kw['alpha'] = mappable.get_alpha() + + ColorsquareBase.__init__(self, ax, **kw) + + def on_mappable_changed(self, mappable): + """ + Updates this colorsquare to match the mappable's properties. + + Typically this is automatically registered as an event handler + by :func:`colorbar_factory` and should not be called manually. + + """ + self.set_cmap(mappable.get_cmap()) + self.set_clim(mappable.get_clim()) + self.update_normal(mappable) + + def update_normal(self, mappable): + ''' + update solid, lines, etc. Unlike update_bruteforce, it does + not clear the axes. This is meant to be called when the image + or contour plot to which this colorsquare belongs is changed. + ''' + self.draw_all() + self.stale = True + + def remove(self): + """ + Remove this colorsquare from the figure. If the colorsquare was + created with ``use_gridspec=True`` then restore the gridspec to its + previous value. + """ + Colorbarsquare.remove(self) + self.mappable.callbacksSM.disconnect(self.mappable.colorbar_cid) + self.mappable.colorbar = None + self.mappable.colorbar_cid = None + + try: + ax = self.mappable.axes + except AttributeError: + return + + try: + gs = ax.get_subplotspec().get_gridspec() + subplotspec = gs.get_topmost_subplotspec() + except AttributeError: + # use_gridspec was False + pos = ax.get_position(original=True) + ax.set_position(pos) + else: + # use_gridspec was True + ax.set_subplotspec(subplotspec) + + @docstring.Substitution(make_axes_kw_doc) def make_axes(parents, location=None, orientation=None, fraction=0.15, shrink=1.0, aspect=20, **kw): @@ -1757,9 +1687,9 @@ def make_axes_gridspec(parent, **kw): orientation = kw.setdefault('orientation', 'vertical') kw['ticklocation'] = 'auto' - fraction = kw.pop('fraction', 0.35) + fraction = kw.pop('fraction', 0.15) shrink = kw.pop('shrink', 1.0) - aspect = kw.pop('aspect', 1) + aspect = kw.pop('aspect', 20) x1 = 1.0 - fraction @@ -1905,8 +1835,11 @@ def colorbar_factory(cax, mappable, **kwargs): if (isinstance(mappable, contour.ContourSet) and any([hatch is not None for hatch in mappable.hatches])): cb = ColorbarPatch(cax, mappable, **kwargs) + elif (isinstance(mappable.norm, colors.BivariateNorm)): + kwargs.pop('orientation', None) + kwargs.pop('ticklocation', None) + cb = Colorsquare(cax, mappable, **kwargs) else: - temp = kwargs.pop('orientation', 'vert') cb = Colorbar(cax, mappable, **kwargs) cid = mappable.callbacksSM.connect('changed', cb.on_mappable_changed) From 96af3d30f9d5111d46f689be395c5ef1d54619d9 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Sun, 23 Jul 2017 03:31:45 +0530 Subject: [PATCH 13/35] Modify axis aspect and fraction for colorsquare --- lib/matplotlib/figure.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index d47fa4d2d935..8cc95dc78569 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -35,6 +35,7 @@ from matplotlib.image import FigureImage import matplotlib.colorbar as cbar +import matplotlib.colors as mcolors from matplotlib.axes import Axes, SubplotBase, subplot_class_factory from matplotlib.blocking_input import BlockingMouseInput, BlockingKeyMouseInput @@ -1834,6 +1835,9 @@ def colorbar(self, mappable, cax=None, ax=None, use_gridspec=True, **kw): # Store the value of gca so that we can set it back later on. current_ax = self.gca() + if isinstance(mappable.norm, mcolors.BivariateNorm): + kw['fraction'] = 0.30 + kw['aspect'] = 1 if cax is None: if use_gridspec and isinstance(ax, SubplotBase): cax, kw = cbar.make_axes_gridspec(ax, **kw) From 9285372fc69ed855cce6a874c7e22050cd1381d7 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Sun, 23 Jul 2017 03:47:28 +0530 Subject: [PATCH 14/35] fix failing commits --- lib/matplotlib/axes/_axes.py | 66 ++++++----------------------- lib/matplotlib/cm.py | 3 +- lib/matplotlib/colorbar.py | 5 ++- lib/matplotlib/colors.py | 21 +++------ lib/matplotlib/tests/test_colors.py | 45 -------------------- 5 files changed, 22 insertions(+), 118 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 34fc461b924a..575e1a6e871f 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -3979,17 +3979,6 @@ def scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, else: try: c_array = np.asanyarray(c, dtype=float) - if c_array.ndim > 1: - if cmap is None: - cmap = mcolors.BivariateColormap() - if norm is None: - norm = mcolors.BivariateNorm() - c_array = norm(c_array) - c_array[0] = c_array[0] * (cmap.N-1) - c_array[1] = c_array[1] * (cmap.N-1) - c_array = c_array.astype(int) - c_array = c_array[0] + cmap.N * c_array[1] - norm = mcolors.NoNorm() if c_array.shape in xy_shape: c = np.ma.ravel(c_array) else: @@ -4054,10 +4043,8 @@ def scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, collection.update(kwargs) if colors is None: - isNorm = isinstance(norm, (mcolors.Normalize, mcolors.BivariateNorm)) - if norm is not None and not isNorm: - msg = "'norm' must be an instance of 'mcolors.Normalize' " \ - "or 'mcolors.BivariateNorm'" + if norm is not None and not isinstance(norm, mcolors.Normalize): + msg = "'norm' must be an instance of 'mcolors.Normalize'" raise ValueError(msg) collection.set_array(np.asarray(c)) collection.set_cmap(cmap) @@ -5151,6 +5138,11 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, """ + temp = np.asarray(X) + if temp.ndim == 3 and isinstance(norm, mcolors.BivariateNorm): + temp = norm(temp) + X = cmap(temp, alpha=self.get_alpha(), bytes=True) + if not self._hold: self.cla() @@ -5164,21 +5156,6 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, aspect = rcParams['image.aspect'] self.set_aspect(aspect) - temp = np.asarray(X) - isBivari = (isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)) - if (temp.ndim == 3 and isBivari): - if cmap is None: - cmap = mcolors.BivariateColormap() - if norm is None: - norm = mcolors.BivariateNorm() - temp = norm(temp) - temp[0] = temp[0] * (cmap.N-1) - temp[1] = temp[1] * (cmap.N-1) - temp = temp.astype(int) - X = temp[0] + cmap.N * temp[1] - norm = mcolors.NoNorm() - im = mimage.AxesImage(self, cmap, norm, interpolation, origin, extent, filternorm=filternorm, filterrad=filterrad, resample=resample, **kwargs) @@ -5219,10 +5196,10 @@ def _pcolorargs(funcname, *args, **kw): allmatch = kw.pop("allmatch", False) norm = kw.pop("norm", None) cmap = kw.pop("cmap", None) + alpha = kw.pop("alpha", 1) if len(args) == 1: C = np.asanyarray(args[0]) - isBivari = (isinstance(norm, mcolors.BivariateNorm) or isinstance(cmap, mcolors.BivariateColormap)) if (C.ndim == 3 and isBivari): @@ -5231,12 +5208,6 @@ def _pcolorargs(funcname, *args, **kw): if norm is None: norm = mcolors.BivariateNorm() C = norm(C) - C[0] = C[0] * (cmap.N-1) - C[1] = C[1] * (cmap.N-1) - C = C.astype(int) - C = C[0] + cmap.N * C[1] - C = np.array(C) - numRows, numCols = C.shape if allmatch: X, Y = np.meshgrid(np.arange(numCols), np.arange(numRows)) @@ -5256,11 +5227,6 @@ def _pcolorargs(funcname, *args, **kw): if norm is None: norm = mcolors.BivariateNorm() C = norm(C) - C[0] = C[0] * (cmap.N-1) - C[1] = C[1] * (cmap.N-1) - C = C.astype(int) - C = C[0] + cmap.N * C[1] - C = np.array(C) numRows, numCols = C.shape else: raise TypeError( @@ -5809,19 +5775,11 @@ def pcolorfast(self, *args, **kwargs): isBivari = (isinstance(norm, mcolors.BivariateNorm) or isinstance(cmap, mcolors.BivariateColormap)) if (C.ndim == 3 and isBivari): - if cmap is None: - cmap = mcolors.BivariateColormap() - if norm is None: - norm = mcolors.BivariateNorm() C = norm(C) - C[0] = C[0] * (cmap.N-1) - C[1] = C[1] * (cmap.N-1) - C = C.astype(int) - C = C[0] + cmap.N * C[1] - C = np.array(C) - norm = mcolors.NoNorm() - - nr, nc = C.shape + nr, nc = C.shape + C = cmap(C, alpha=alpha, bytes=True) + else: + nr, nc = C.shape if len(args) == 1: style = "image" x = [0, nc] diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py index b9b59bbbdd1f..bdf3e1575653 100644 --- a/lib/matplotlib/cm.py +++ b/lib/matplotlib/cm.py @@ -201,8 +201,7 @@ def __init__(self, norm=None, cmap=None): #: The Normalization instance of this ScalarMappable. self.norm = norm #: The Colormap instance of this ScalarMappable. - # self.cmap = get_cmap(cmap) - self.cmap = cmap + self.cmap = get_cmap(cmap) #: The last colorbar associated with this ScalarMappable. May be None. self.colorbar = None self.update_dict = {'array': False} diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index dd567e439e46..ae3d7efbd53f 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -1081,7 +1081,7 @@ def _edges(self, X, Y): ''' Return the separator line segments; helper for _add_solids. ''' - N = X.shape[0]. + N = X.shape[0] return [list(zip(X[i], Y[i])) for i in xrange(1, N - 1)] + [list(zip(Y[i], X[i])) for i in xrange(1, N - 1)] @@ -1159,7 +1159,8 @@ def _ticker(self, norm): if mpl.rcParams['_internal.classic_mode']: locator = ticker.MaxNLocator() else: - locator = ticker.AutoLocator() + # locator = ticker.AutoLocator() + locator = ticker.MaxNLocator(nbins=5) else: b = _boundaries[self._inside] locator = ticker.FixedLocator(b, nbins=10) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 98b0ff87d180..ff74839bc1af 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1417,22 +1417,13 @@ def __call__(self, values, clip=None): if clip is None: clip = [self.norm1.clip, self.norm2.clip] - return np.asarray([self.norm1(values[0], clip=clip[0]), - self.norm2(values[1], clip=clip[1])]) + temp = np.asarray([self.norm1(values[0], clip=clip[0]), + self.norm2(values[1], clip=clip[1])]) - def inverse(self, values): - """ - Parameters - ---------- - values : array-like - A list of two values to be inverted - - Returns - ------- - A list of two unnormalized values - """ - return np.asarray([self.norm1.inverse(values[0]), - self.norm2.inverse(values[1])]) + temp[0] = temp[0] * (256) + temp[1] = temp[1] * (256) + temp = temp.astype(int) + return temp[0] + temp[1] * 256 def autoscale(self, A): """ diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index e93f7257c619..721813e62f8f 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -272,51 +272,6 @@ def _mask_tester(norm_instance, vals): masked_array[0] = np.ma.masked assert_array_equal(masked_array.mask, norm_instance(masked_array).mask) -@pytest.mark.parametrize( - 'norm1, norm2, values, expected, clip', [ - ( - None, - None, - [[0.2, 0.4, 0.5], [5, 7, 9, 10]], - [[0, 0.666667, 1], [0, 0.4, 0.8, 1]], - None - ), - ( - mcolors.LogNorm(clip=True, vmax=5), - None, - [[1, 6], [5, 7, 9, 10]], - [[0, 1.0], [0, 0.4, 0.8, 1]], - None - ), - ( - mcolors.PowerNorm(2, vmin=0, vmax=8, clip=None), - mcolors.PowerNorm(2, vmin=2, vmax=8, clip=True), - [np.array([-0.5, 0, 2, 4, 8], dtype=float), - np.array([-0.5, 0, 1, 8, 16], dtype=float)], - [[0, 0, 1/16, 1/4, 1], [0, 0, 0, 1, 1]], - None - ), - ( - mcolors.SymLogNorm(3, vmin=-30, vmax=5, linscale=1.2), - mcolors.PowerNorm(2, vmin=2, vmax=8, clip=False), - [np.array([-30, -1, 2, 6], dtype=float), - np.array([-0.5, 0, 1, 8, 16], dtype=float)], - [[0., 0.53980074, 0.826991, 1.02758204], [0, 0, 0, 1, 1]], - [False, True] - ) - ], ids=[ - 'norm_is_None', - 'LogNorm_and_LinearNorm', - 'PowerNorm_clip_None_and_True', - 'SymLogNorm_and_PowerNorm_clip_in_call' - ] -) -def test_BivariateNorm(norm1, norm2, values, expected, clip): - norm = mcolors.BivariateNorm(norm1=norm1, norm2=norm2) - ans1, ans2 = norm(values=values, clip=clip) - assert_array_almost_equal(ans1, expected[0]) - assert_array_almost_equal(ans2, expected[1]) - @image_comparison(baseline_images=['levels_and_colors'], extensions=['png']) From 01b593200ac7bd45cba88c966498b66b22b9a936 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Thu, 27 Jul 2017 19:44:57 +0530 Subject: [PATCH 15/35] Change PEP8 violations --- lib/matplotlib/axes/_axes.py | 12 ++++++------ lib/matplotlib/colorbar.py | 23 +++++++++++++---------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 575e1a6e871f..7b81312f5ad5 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5200,8 +5200,8 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 1: C = np.asanyarray(args[0]) - isBivari = (isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)) + isBivari = isinstance(norm, (mcolors.BivariateNorm, + mcolors.BivariateColormap)) if (C.ndim == 3 and isBivari): if cmap is None: cmap = mcolors.BivariateColormap() @@ -5219,8 +5219,8 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 3: X, Y, C = [np.asanyarray(a) for a in args] - isBivari = (isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)) + isBivari = isinstance(norm, (mcolors.BivariateNorm, + mcolors.BivariateColormap)) if (C.ndim == 3 and isBivari): if cmap is None: cmap = mcolors.BivariateColormap() @@ -5772,8 +5772,8 @@ def pcolorfast(self, *args, **kwargs): C = np.asarray(args[-1]) - isBivari = (isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)) + isBivari = isinstance(norm, (mcolors.BivariateNorm, + mcolors.BivariateColormap)) if (C.ndim == 3 and isBivari): C = norm(C) nr, nc = C.shape diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index ae3d7efbd53f..eb1d7f88a1d9 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -901,7 +901,9 @@ def remove(self): class ColorsquareBase(cm.ScalarMappable): + n_rasterize = 50 # rasterize solids if number of colors >= n_rasterize + def __init__(self, ax, cmap=None, norm=None, alpha=None, @@ -1069,9 +1071,9 @@ def _set_label(self): self.stale = True def set_label(self, xlabel, ylabel, **kw): - ''' + """ Label the axes of the colorbar - ''' + """ self._xlabel = '%s' % (xlabel, ) self._ylabel = '%s' % (ylabel, ) self._labelkw = kw @@ -1086,10 +1088,10 @@ def _edges(self, X, Y): + [list(zip(Y[i], X[i])) for i in xrange(1, N - 1)] def _add_solids(self, X, Y, C): - ''' + """ Draw the colors using :meth:`~matplotlib.axes.Axes.pcolormesh`; optionally add separators. - ''' + """ args = (X, Y, C) kw = dict(cmap=self.cmap, norm=self.norm, @@ -1120,10 +1122,10 @@ def _add_solids(self, X, Y, C): self.solids.set_rasterized(True) def _ticker(self, norm): - ''' + """ Return the sequence of ticks (colorbar data locations), ticklabels (strings), and the corresponding offset string. - ''' + """ if norm is self.norm.norm1: _values = self._xvalues _boundaries = self._xboundaries @@ -1246,9 +1248,9 @@ def _process_values(self, b=None, norm=None): return self._process_values(b=b, norm=norm) def _mesh(self): - ''' + """ Return X,Y, the coordinate arrays for the colorbar pcolormesh. - ''' + """ x = np.linspace(0, 1, len(self._xboundaries)) y = np.linspace(0, 1, len(self._yboundaries)) self._x = x @@ -1257,10 +1259,10 @@ def _mesh(self): return X, Y def _locate(self, x, norm): - ''' + """ Given a set of color data values, return their corresponding colorbar data coordinates. - ''' + """ if norm is self.norm.norm1: boundaries = self._xboundaries else: @@ -1300,6 +1302,7 @@ def remove(self): fig = self.ax.figure fig.delaxes(self.ax) + class Colorbar(ColorbarBase): """ This class connects a :class:`ColorbarBase` to a From 28288e2028194041e81e651fa6d505c6b367b996 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Sun, 30 Jul 2017 00:06:45 +0530 Subject: [PATCH 16/35] Revert isBivari, remove classic locator --- lib/matplotlib/axes/_axes.py | 12 ++++++------ lib/matplotlib/colorbar.py | 3 --- lib/matplotlib/colors.py | 3 ++- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 7b81312f5ad5..c2ccd0fb748c 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5200,8 +5200,8 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 1: C = np.asanyarray(args[0]) - isBivari = isinstance(norm, (mcolors.BivariateNorm, - mcolors.BivariateColormap)) + isBivari = (isinstance(norm, mcolors.BivariateNorm) + or isinstance(cmap, mcolors.BivariateColormap)) if (C.ndim == 3 and isBivari): if cmap is None: cmap = mcolors.BivariateColormap() @@ -5219,8 +5219,8 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 3: X, Y, C = [np.asanyarray(a) for a in args] - isBivari = isinstance(norm, (mcolors.BivariateNorm, - mcolors.BivariateColormap)) + isBivari = (isinstance(norm, mcolors.BivariateNorm) + or isinstance(cmap, mcolors.BivariateColormap)) if (C.ndim == 3 and isBivari): if cmap is None: cmap = mcolors.BivariateColormap() @@ -5772,8 +5772,8 @@ def pcolorfast(self, *args, **kwargs): C = np.asarray(args[-1]) - isBivari = isinstance(norm, (mcolors.BivariateNorm, - mcolors.BivariateColormap)) + isBivari = (isinstance(norm, mcolors.BivariateNorm) + or isinstance(cmap, mcolors.BivariateColormap)) if (C.ndim == 3 and isBivari): C = norm(C) nr, nc = C.shape diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index eb1d7f88a1d9..af4cde186481 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -1158,9 +1158,6 @@ def _ticker(self, norm): linthresh=norm.linthresh, base=10) else: - if mpl.rcParams['_internal.classic_mode']: - locator = ticker.MaxNLocator() - else: # locator = ticker.AutoLocator() locator = ticker.MaxNLocator(nbins=5) else: diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index ff74839bc1af..15880eb1acbb 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -868,7 +868,8 @@ def _init(self): red_mesh, green_mesh = np.meshgrid(red, green) blue_mesh = np.zeros_like(red_mesh) alpha_mesh = np.ones_like(red_mesh) - bivariate_cmap = np.dstack((red_mesh, green_mesh, blue_mesh, alpha_mesh)) + bivariate_cmap = np.dstack((red_mesh, green_mesh, blue_mesh, + alpha_mesh)) self._lut = np.vstack(bivariate_cmap) self._isinit = True self.N = self.N * self.N From ca2b111084e35439c42b8d2c4e2934378085b513 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Wed, 2 Aug 2017 14:41:53 +0530 Subject: [PATCH 17/35] Subclass normalizers from Abstract Base Class --- lib/matplotlib/axes/_axes.py | 10 ++++------ lib/matplotlib/colors.py | 13 ++++++++++--- lib/matplotlib/tests/test_colors.py | 12 ++++++++++++ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index c2ccd0fb748c..21e3e93c6252 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5146,8 +5146,7 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, if not self._hold: self.cla() - isNorm = isinstance(norm, (mcolors.Normalize, mcolors.BivariateNorm)) - if norm is not None and not isNorm: + if norm is not None and not isinstance(norm, mcolors.Norms): msg = "'norm' must be an instance of 'mcolors.Normalize' " \ "or 'mcolors.BivariateNorm'" raise ValueError(msg) @@ -5483,8 +5482,7 @@ def pcolor(self, *args, **kwargs): collection.set_alpha(alpha) collection.set_array(C) - isNorm = isinstance(norm, (mcolors.Normalize, mcolors.BivariateNorm)) - if norm is not None and not isNorm: + if norm is not None and not isinstance(norm, mcolors.Norms): msg = "'norm' must be an instance of 'mcolors.Normalize' " \ "or 'mcolors.BivariateNorm'" raise ValueError(msg) @@ -5764,8 +5762,8 @@ def pcolorfast(self, *args, **kwargs): cmap = kwargs.pop('cmap', None) vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) - isNorm = isinstance(norm, (mcolors.Normalize, mcolors.BivariateNorm)) - if norm is not None and not isNorm: + + if norm is not None and not isinstance(norm, mcolors.Norms): msg = "'norm' must be an instance of 'mcolors.Normalize' " \ "or 'mcolors.BivariateNorm'" raise ValueError(msg) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 15880eb1acbb..3d6095222b8a 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -68,7 +68,7 @@ import numpy as np import matplotlib.cbook as cbook from ._color_data import BASE_COLORS, TABLEAU_COLORS, CSS4_COLORS, XKCD_COLORS - +from abc import ABCMeta class _ColorMapping(dict): def __init__(self, mapping): @@ -885,7 +885,14 @@ def reversed(self, name=None): raise NotImplementedError() -class Normalize(object): +class Norms: + """ + Abstract Base Class to group `Normalize` and `BivariateNorm` + """ + __metaclass__ = ABCMeta + pass + +class Normalize(Norms): """ A class which, when called, can normalize data into the ``[0.0, 1.0]`` interval. @@ -1377,7 +1384,7 @@ def inverse(self, value): return value -class BivariateNorm: +class BivariateNorm(Norms): """ Normalize a list of two values corresponding to two 1D normalizers """ diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index 721813e62f8f..fbcad2440141 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -707,3 +707,15 @@ def __add__(self, other): mcolors.SymLogNorm(3, vmax=5, linscale=1), mcolors.PowerNorm(1)]: assert_array_equal(norm(data.view(MyArray)), norm(data)) + + +@pytest.mark.parametrize('norm', [ + mcolors.Normalize(), mcolors.LogNorm(), mcolors.BivariateNorm() + ] +) +def test_abstract_base_class_norms(norm): + """ + Test that all types of normalizers subclasses Abstract Base class + `colors.Norms` + """ + assert isinstance(norm, mcolors.Norms) \ No newline at end of file From 75b4eba1a50a25c3c9c31473659000511b672975 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Wed, 2 Aug 2017 14:59:57 +0530 Subject: [PATCH 18/35] move _ticker function inside update_ticks --- lib/matplotlib/colorbar.py | 142 ++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index af4cde186481..4884eec2e11c 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -944,7 +944,7 @@ def __init__(self, ax, cmap=None, if cbook.iterable(xticks): self.xlocator = ticker.FixedLocator(xticks, nbins=len(xticks)) else: - self.xlocator = xticks # Handle default in _ticker() + self.xlocator = xticks if cbook.iterable(yticks): self.ylocator = ticker.FixedLocator(yticks, nbins=len(yticks)) @@ -1015,9 +1015,77 @@ def update_ticks(self): Force the update of the ticks and ticklabels. This must be called whenever the tick locator and/or tick formatter changes. """ + def _make_ticker(norm): + """ + Return the sequence of ticks (colorbar data locations), + ticklabels (strings), and the corresponding offset string. + """ + if norm is self.norm.norm1: + _values = self._xvalues + _boundaries = self._xboundaries + boundaries = self.xboundaries + locator = self.xlocator + formatter = self.xformatter + else: + _values = self._yvalues + _boundaries = self._yboundaries + boundaries = self.yboundaries + locator = self.ylocator + formatter = self.yformatter + + if locator is None: + if boundaries is None: + if isinstance(norm, colors.NoNorm): + nv = len(_values) + base = 1 + int(nv / 10) + locator = ticker.IndexLocator(base=base, offset=0) + elif isinstance(norm, colors.BoundaryNorm): + b = norm.boundaries + locator = ticker.FixedLocator(b, nbins=10) + elif isinstance(norm, colors.LogNorm): + locator = ticker.LogLocator(subs='all') + elif isinstance(norm, colors.SymLogNorm): + # The subs setting here should be replaced + # by logic in the locator. + locator = ticker.SymmetricalLogLocator( + subs=np.arange(1, 10), + linthresh=norm.linthresh, + base=10) + else: + # locator = ticker.AutoLocator() + locator = ticker.MaxNLocator(nbins=5) + else: + b = _boundaries[self._inside] + locator = ticker.FixedLocator(b, nbins=10) + if isinstance(norm, colors.NoNorm) and boundaries is None: + intv = _values[0], _values[-1] + else: + b = _boundaries[self._inside] + intv = b[0], b[-1] + locator.create_dummy_axis(minpos=intv[0]) + formatter.create_dummy_axis(minpos=intv[0]) + locator.set_view_interval(*intv) + locator.set_data_interval(*intv) + formatter.set_view_interval(*intv) + formatter.set_data_interval(*intv) + + b = np.array(locator()) + if isinstance(locator, ticker.LogLocator): + eps = 1e-10 + b = b[(b <= intv[1] * (1 + eps)) & (b >= intv[0] * (1 - eps))] + else: + eps = (intv[1] - intv[0]) * 1e-10 + b = b[(b <= intv[1] + eps) & (b >= intv[0] - eps)] + # self._tick_data_values = b + ticks = self._locate(b, norm) + formatter.set_locs(b) + ticklabels = [formatter(t, i) for i, t in enumerate(b)] + offset_string = formatter.get_offset() + return ticks, ticklabels, offset_string + ax = self.ax - xticks, xticklabels, xoffset_string = self._ticker(self.norm.norm1) - yticks, yticklabels, yoffset_string = self._ticker(self.norm.norm2) + xticks, xticklabels, xoffset_string = _make_ticker(self.norm.norm1) + yticks, yticklabels, yoffset_string = _make_ticker(self.norm.norm2) ax.xaxis.set_ticks(xticks) ax.set_xticklabels(xticklabels) @@ -1121,74 +1189,6 @@ def _add_solids(self, X, Y, C): or len(self._x) >= self.n_rasterize): self.solids.set_rasterized(True) - def _ticker(self, norm): - """ - Return the sequence of ticks (colorbar data locations), - ticklabels (strings), and the corresponding offset string. - """ - if norm is self.norm.norm1: - _values = self._xvalues - _boundaries = self._xboundaries - boundaries = self.xboundaries - locator = self.xlocator - formatter = self.xformatter - else: - _values = self._yvalues - _boundaries = self._yboundaries - boundaries = self.yboundaries - locator = self.ylocator - formatter = self.yformatter - - if locator is None: - if boundaries is None: - if isinstance(norm, colors.NoNorm): - nv = len(_values) - base = 1 + int(nv / 10) - locator = ticker.IndexLocator(base=base, offset=0) - elif isinstance(norm, colors.BoundaryNorm): - b = norm.boundaries - locator = ticker.FixedLocator(b, nbins=10) - elif isinstance(norm, colors.LogNorm): - locator = ticker.LogLocator(subs='all') - elif isinstance(norm, colors.SymLogNorm): - # The subs setting here should be replaced - # by logic in the locator. - locator = ticker.SymmetricalLogLocator( - subs=np.arange(1, 10), - linthresh=norm.linthresh, - base=10) - else: - # locator = ticker.AutoLocator() - locator = ticker.MaxNLocator(nbins=5) - else: - b = _boundaries[self._inside] - locator = ticker.FixedLocator(b, nbins=10) - if isinstance(norm, colors.NoNorm) and boundaries is None: - intv = _values[0], _values[-1] - else: - b = _boundaries[self._inside] - intv = b[0], b[-1] - locator.create_dummy_axis(minpos=intv[0]) - formatter.create_dummy_axis(minpos=intv[0]) - locator.set_view_interval(*intv) - locator.set_data_interval(*intv) - formatter.set_view_interval(*intv) - formatter.set_data_interval(*intv) - - b = np.array(locator()) - if isinstance(locator, ticker.LogLocator): - eps = 1e-10 - b = b[(b <= intv[1] * (1 + eps)) & (b >= intv[0] * (1 - eps))] - else: - eps = (intv[1] - intv[0]) * 1e-10 - b = b[(b <= intv[1] + eps) & (b >= intv[0] - eps)] - # self._tick_data_values = b - ticks = self._locate(b, norm) - formatter.set_locs(b) - ticklabels = [formatter(t, i) for i, t in enumerate(b)] - offset_string = formatter.get_offset() - return ticks, ticklabels, offset_string - def _process_values(self, b=None, norm=None): if norm is self.norm.norm1: boundaries = self.xboundaries From bf65847530c5ef6c93dac5dbb336f947d5815a07 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Wed, 2 Aug 2017 14:59:57 +0530 Subject: [PATCH 19/35] move _ticker function inside update_ticks --- lib/matplotlib/colors.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 3d6095222b8a..11e67cc6a340 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -70,6 +70,7 @@ from ._color_data import BASE_COLORS, TABLEAU_COLORS, CSS4_COLORS, XKCD_COLORS from abc import ABCMeta + class _ColorMapping(dict): def __init__(self, mapping): super(_ColorMapping, self).__init__(mapping) @@ -892,6 +893,7 @@ class Norms: __metaclass__ = ABCMeta pass + class Normalize(Norms): """ A class which, when called, can normalize data into From f9dc4b1fd48f5f15ddeaa45d2e3f40076f47a489 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Sat, 5 Aug 2017 15:14:25 +0530 Subject: [PATCH 20/35] remove cmap in imshow and pcolorfast --- lib/matplotlib/axes/_axes.py | 4 +--- lib/matplotlib/colors.py | 6 +++--- lib/matplotlib/image.py | 3 ++- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 21e3e93c6252..1939100df0be 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5140,8 +5140,7 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, temp = np.asarray(X) if temp.ndim == 3 and isinstance(norm, mcolors.BivariateNorm): - temp = norm(temp) - X = cmap(temp, alpha=self.get_alpha(), bytes=True) + X = norm(temp) if not self._hold: self.cla() @@ -5775,7 +5774,6 @@ def pcolorfast(self, *args, **kwargs): if (C.ndim == 3 and isBivari): C = norm(C) nr, nc = C.shape - C = cmap(C, alpha=alpha, bytes=True) else: nr, nc = C.shape if len(args) == 1: diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 11e67cc6a340..dc409440f249 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -862,10 +862,11 @@ def reversed(self, name=None): class BivariateColormap(Colormap): def __init__(self, name='bivariate', N=256): Colormap.__init__(self, name, N) + self.N = self.N * self.N def _init(self): - red = np.linspace(0, 1, self.N) - green = np.linspace(0, 1, self.N) + red = np.linspace(0, 1, np.sqrt(self.N)) + green = np.linspace(0, 1, np.sqrt(self.N)) red_mesh, green_mesh = np.meshgrid(red, green) blue_mesh = np.zeros_like(red_mesh) alpha_mesh = np.ones_like(red_mesh) @@ -873,7 +874,6 @@ def _init(self): alpha_mesh)) self._lut = np.vstack(bivariate_cmap) self._isinit = True - self.N = self.N * self.N self._set_extremes() def _resample(self, lutsize): diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index d34f98b4e45a..20129814a34b 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -363,7 +363,8 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, raise ValueError("Invalid dimensions, got {}".format(A.shape)) if A.ndim == 2: - A = self.norm(A) + if not isinstance(self.norm, mcolors.BivariateNorm): + A = self.norm(A) if A.dtype.kind == 'f': # If the image is greyscale, convert to RGBA and # use the extra channels for resizing the over, From 8a985f0400f39fe81834a1187f27e3052f2183f2 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 7 Aug 2017 18:14:47 +0530 Subject: [PATCH 21/35] Defer call to norm and cmap in imshow --- lib/matplotlib/axes/_axes.py | 5 ----- lib/matplotlib/axes/_subplots.py | 1 - lib/matplotlib/image.py | 34 +++++++++++++++++++++----------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 1939100df0be..8ad80f73ba59 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5137,11 +5137,6 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, of pixel (0, 0). """ - - temp = np.asarray(X) - if temp.ndim == 3 and isinstance(norm, mcolors.BivariateNorm): - X = norm(temp) - if not self._hold: self.cla() diff --git a/lib/matplotlib/axes/_subplots.py b/lib/matplotlib/axes/_subplots.py index 90d55d21cc4c..3d806106d4c0 100644 --- a/lib/matplotlib/axes/_subplots.py +++ b/lib/matplotlib/axes/_subplots.py @@ -177,7 +177,6 @@ def subplot_class_factory(axes_class=None): (SubplotBase, axes_class), {'_axes_class': axes_class}) _subplot_classes[axes_class] = new_class - return new_class # This is provided for backward compatibility diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 20129814a34b..96ae5226e6f0 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -253,7 +253,11 @@ def get_size(self): if self._A is None: raise RuntimeError('You must first set the image array') - return self._A.shape[:2] + if isinstance(self.norm, mcolors.BivariateNorm): + imshape = self._A.shape[1:] + else: + imshape = self._A.shape[:2] + return imshape def set_alpha(self, alpha): """ @@ -300,6 +304,12 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, `trans` is the affine transformation from the image to pixel space. """ + if isinstance(self.norm, mcolors.BivariateNorm): + imwidth = A.shape[1] + imheight = A.shape[2] + else: + imwidth = A.shape[0] + imheight = A.shape[1] if A is None: raise RuntimeError('You must first set the image ' 'array or the image attribute') @@ -323,15 +333,15 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, # Flip the input image using a transform. This avoids the # problem with flipping the array, which results in a copy # when it is converted to contiguous in the C wrapper - t0 = Affine2D().translate(0, -A.shape[0]).scale(1, -1) + t0 = Affine2D().translate(0, -imwidth).scale(1, -1) else: t0 = IdentityTransform() t0 += ( Affine2D() .scale( - in_bbox.width / A.shape[1], - in_bbox.height / A.shape[0]) + in_bbox.width / imheight, + in_bbox.height / imwidth) .translate(in_bbox.x0, in_bbox.y0) + self.get_transform()) @@ -362,9 +372,9 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, if A.ndim not in (2, 3): raise ValueError("Invalid dimensions, got {}".format(A.shape)) - if A.ndim == 2: - if not isinstance(self.norm, mcolors.BivariateNorm): - A = self.norm(A) + if A.ndim == 2 or (A.ndim == 3 and + isinstance(self.norm, mcolors.BivariateNorm)): + A = self.norm(A) if A.dtype.kind == 'f': # If the image is greyscale, convert to RGBA and # use the extra channels for resizing the over, @@ -372,7 +382,7 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, # Agg's resampler is very aggressive about # clipping to [0, 1] and we use out-of-bounds # values to carry the over/under/bad information - rgba = np.empty((A.shape[0], A.shape[1], 4), dtype=A.dtype) + rgba = np.empty((imwidth, imheight, 4), dtype=A.dtype) rgba[..., 0] = A # normalized data # this is to work around spurious warnings coming # out of masked arrays. @@ -411,9 +421,10 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, if not created_rgba_mask: # Always convert to RGBA, even if only RGB input + isBivari = (A.ndim == 2 and A.shape[0] == 2) if A.shape[2] == 3: A = _rgb_to_rgba(A) - elif A.shape[2] != 4: + elif A.shape[2] != 4 and not isBivari: raise ValueError("Invalid dimensions, got %s" % (A.shape,)) output = np.zeros((out_height, out_width, 4), dtype=A.dtype) @@ -596,8 +607,9 @@ def set_data(self, A): not np.can_cast(self._A.dtype, float, "same_kind")): raise TypeError("Image data cannot be converted to float") - if not (self._A.ndim == 2 - or self._A.ndim == 3 and self._A.shape[-1] in [3, 4]): + isRGB = (self._A.ndim == 3 and self._A.shape[-1] in [3, 4]) + isBivari = (self._A.ndim == 3 and self._A.shape[0] == 2) + if not (self._A.ndim == 2 or isRGB or isBivari): raise TypeError("Invalid dimensions for image data") self._imcache = None From 8f6928d3cb32271677ab3e4f5ebf848c2031db9e Mon Sep 17 00:00:00 2001 From: patniharshit Date: Tue, 15 Aug 2017 20:33:49 +0530 Subject: [PATCH 22/35] Fix bivariate handling with pcolormesh --- lib/matplotlib/axes/_axes.py | 24 +++++++++++++----------- lib/matplotlib/cm.py | 2 +- lib/matplotlib/collections.py | 3 ++- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 8ad80f73ba59..0929da99bc21 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5200,8 +5200,9 @@ def _pcolorargs(funcname, *args, **kw): cmap = mcolors.BivariateColormap() if norm is None: norm = mcolors.BivariateNorm() - C = norm(C) - numRows, numCols = C.shape + numRows, numCols = C.shape[1:] + else: + numRows, numCols = C.shape if allmatch: X, Y = np.meshgrid(np.arange(numCols), np.arange(numRows)) else: @@ -5219,8 +5220,9 @@ def _pcolorargs(funcname, *args, **kw): cmap = mcolors.BivariateColormap() if norm is None: norm = mcolors.BivariateNorm() - C = norm(C) - numRows, numCols = C.shape + numRows, numCols = C.shape[1:] + else: + numRows, numCols = C.shape else: raise TypeError( 'Illegal arguments to %s; see help(%s)' % (funcname, funcname)) @@ -5614,17 +5616,17 @@ def pcolormesh(self, *args, **kwargs): X, Y, C = self._pcolorargs('pcolormesh', *args, **kw) Ny, Nx = X.shape - if (isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)): - norm = mcolors.NoNorm() - # unit conversion allows e.g. datetime objects as axis values self._process_unit_info(xdata=X, ydata=Y, kwargs=kwargs) X = self.convert_xunits(X) Y = self.convert_yunits(Y) - # convert to one dimensional arrays - C = C.ravel() + # convert to one dimensional arrays if univariate + if isinstance(norm, mcolors.BivariateNorm): + C = np.asarray([C[0].ravel(), C[1].ravel()]) + else: + C = C.ravel() + coords = np.column_stack((X.flat, Y.flat)).astype(float, copy=False) collection = mcoll.QuadMesh(Nx - 1, Ny - 1, coords, @@ -5632,7 +5634,7 @@ def pcolormesh(self, *args, **kwargs): **kwargs) collection.set_alpha(alpha) collection.set_array(C) - if norm is not None and not isinstance(norm, mcolors.Normalize): + if norm is not None and not isinstance(norm, mcolors.Norms): msg = "'norm' must be an instance of 'mcolors.Normalize'" raise ValueError(msg) collection.set_cmap(cmap) diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py index bdf3e1575653..0ff3b56d9a45 100644 --- a/lib/matplotlib/cm.py +++ b/lib/matplotlib/cm.py @@ -238,7 +238,7 @@ def to_rgba(self, x, alpha=None, bytes=False, norm=True): """ # First check for special case, image input: try: - if x.ndim == 3: + if x.ndim == 3 and (x.shape[-1] == 3 or x.shape[-1] == 4): if x.shape[2] == 3: if alpha is None: alpha = 1 diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 3acbaeceefbe..8c0984f162d8 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -731,7 +731,8 @@ def update_scalarmappable(self): """ if self._A is None: return - if self._A.ndim > 1: + if (self._A.ndim > 1 and + not isinstance(self.norm, mcolors.BivariateNorm)): raise ValueError('Collections can only map rank 1 arrays') if not self.check_update("array"): return From d54cb4431df24d5645c64273412e94982d68d0a7 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Wed, 16 Aug 2017 11:56:00 +0530 Subject: [PATCH 23/35] Make pcolor work with bivariate --- lib/matplotlib/axes/_axes.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 0929da99bc21..0202dd1af2eb 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5408,10 +5408,6 @@ def pcolor(self, *args, **kwargs): X, Y, C = self._pcolorargs('pcolor', *args, **kw) Ny, Nx = X.shape - if (isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)): - norm = mcolors.NoNorm() - # unit conversion allows e.g. datetime objects as axis values self._process_unit_info(xdata=X, ydata=Y, kwargs=kwargs) X = self.convert_xunits(X) @@ -5426,7 +5422,10 @@ def pcolor(self, *args, **kwargs): xymask = (mask[0:-1, 0:-1] + mask[1:, 1:] + mask[0:-1, 1:] + mask[1:, 0:-1]) # don't plot if C or any of the surrounding vertices are masked. - mask = ma.getmaskarray(C) + xymask + if isinstance(norm, mcolors.BivariateNorm): + mask = ma.getmaskarray(C[0]) + ma.getmaskarray(C[1]) + xymask + else: + mask = ma.getmaskarray(C) + xymask newaxis = np.newaxis compress = np.compress @@ -5450,7 +5449,14 @@ def pcolor(self, *args, **kwargs): axis=1) verts = xy.reshape((npoly, 5, 2)) - C = compress(ravelmask, ma.filled(C[0:Ny - 1, 0:Nx - 1]).ravel()) + if isinstance(norm, mcolors.BivariateNorm): + C0 = C[0] + C1 = C[1] + C0 = compress(ravelmask, ma.filled(C0[0:Ny - 1, 0:Nx - 1]).ravel()) + C1 = compress(ravelmask, ma.filled(C1[0:Ny - 1, 0:Nx - 1]).ravel()) + C = np.array([C0, C1]) + else: + C = compress(ravelmask, ma.filled(C[0:Ny - 1, 0:Nx - 1]).ravel()) linewidths = (0.25,) if 'linewidth' in kwargs: @@ -5769,8 +5775,7 @@ def pcolorfast(self, *args, **kwargs): isBivari = (isinstance(norm, mcolors.BivariateNorm) or isinstance(cmap, mcolors.BivariateColormap)) if (C.ndim == 3 and isBivari): - C = norm(C) - nr, nc = C.shape + nr, nc = C.shape[1:] else: nr, nc = C.shape if len(args) == 1: From 4d0355293f82ac49937fe62698e78b2c84f047d2 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Sun, 20 Aug 2017 23:42:39 +0530 Subject: [PATCH 24/35] Do 2D->1D mapping in call method of colormap --- lib/matplotlib/colors.py | 12 ++++++------ lib/matplotlib/image.py | 5 +++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index dc409440f249..323966156494 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -473,6 +473,11 @@ def __call__(self, X, alpha=None, bytes=False): xa = np.array([X]) else: vtype = 'array' + if isinstance(self, BivariateColormap): + X[0] = X[0] * 256 + X[1] = X[1] * 256 + X = X.astype(int) + X = X[0] + X[1] * 256 xma = np.ma.array(X, copy=True) # Copy here to avoid side effects. mask_bad = xma.mask # Mask will be used below. xa = xma.filled() # Fill to avoid infs, etc. @@ -1427,14 +1432,9 @@ def __call__(self, values, clip=None): if clip is None: clip = [self.norm1.clip, self.norm2.clip] - temp = np.asarray([self.norm1(values[0], clip=clip[0]), + return np.asarray([self.norm1(values[0], clip=clip[0]), self.norm2(values[1], clip=clip[1])]) - temp[0] = temp[0] * (256) - temp[1] = temp[1] * (256) - temp = temp.astype(int) - return temp[0] + temp[1] * 256 - def autoscale(self, A): """ Set *vmin*, *vmax* to min, max of *A*. diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 96ae5226e6f0..db57edda9407 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -375,7 +375,8 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, if A.ndim == 2 or (A.ndim == 3 and isinstance(self.norm, mcolors.BivariateNorm)): A = self.norm(A) - if A.dtype.kind == 'f': + if (A.dtype.kind == 'f' and + not isinstance(self.norm, mcolors.BivariateNorm)): # If the image is greyscale, convert to RGBA and # use the extra channels for resizing the over, # under, and bad pixels. This is needed because @@ -421,7 +422,7 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, if not created_rgba_mask: # Always convert to RGBA, even if only RGB input - isBivari = (A.ndim == 2 and A.shape[0] == 2) + isBivari = (A.ndim == 3 and A.shape[0] == 2) if A.shape[2] == 3: A = _rgb_to_rgba(A) elif A.shape[2] != 4 and not isBivari: From 2573610cd817959ff82da3eb0b6c02eaf0c4d3ed Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 21 Aug 2017 02:44:48 +0530 Subject: [PATCH 25/35] Use list comprehensions to ravel --- lib/matplotlib/axes/_axes.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 0202dd1af2eb..71e2a11ed2b0 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5450,11 +5450,12 @@ def pcolor(self, *args, **kwargs): verts = xy.reshape((npoly, 5, 2)) if isinstance(norm, mcolors.BivariateNorm): - C0 = C[0] - C1 = C[1] - C0 = compress(ravelmask, ma.filled(C0[0:Ny - 1, 0:Nx - 1]).ravel()) - C1 = compress(ravelmask, ma.filled(C1[0:Ny - 1, 0:Nx - 1]).ravel()) - C = np.array([C0, C1]) + C = np.array([ + compress( + ravelmask, + ma.filled(c[0:Ny - 1, 0:Nx - 1]).ravel() + ) for c in C + ]) else: C = compress(ravelmask, ma.filled(C[0:Ny - 1, 0:Nx - 1]).ravel()) @@ -5629,7 +5630,7 @@ def pcolormesh(self, *args, **kwargs): # convert to one dimensional arrays if univariate if isinstance(norm, mcolors.BivariateNorm): - C = np.asarray([C[0].ravel(), C[1].ravel()]) + C = np.asarray([c.ravel() for c in C]) else: C = C.ravel() From 9228480b85b910e1032c38f23f1844045a814f6b Mon Sep 17 00:00:00 2001 From: patniharshit Date: Tue, 22 Aug 2017 03:19:57 +0530 Subject: [PATCH 26/35] Reflect on reviews --- lib/matplotlib/axes/_axes.py | 39 ++++++++++++++++------------- lib/matplotlib/colorbar.py | 4 +-- lib/matplotlib/colors.py | 4 +-- lib/matplotlib/tests/test_colors.py | 2 +- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 71e2a11ed2b0..4ce84d18776a 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -4044,7 +4044,8 @@ def scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, if colors is None: if norm is not None and not isinstance(norm, mcolors.Normalize): - msg = "'norm' must be an instance of 'mcolors.Normalize'" + msg = ("'norm' must be an instance of 'mcolors.Normalize' or " + "'mcolors.BivariateNorm'") raise ValueError(msg) collection.set_array(np.asarray(c)) collection.set_cmap(cmap) @@ -4403,7 +4404,8 @@ def hexbin(self, x, y, C=None, gridsize=100, bins=None, accum = bins.searchsorted(accum) if norm is not None and not isinstance(norm, mcolors.Normalize): - msg = "'norm' must be an instance of 'mcolors.Normalize'" + msg = ("'norm' must be an instance of 'mcolors.Normalize' or " + "'mcolors.BivariateNorm'") raise ValueError(msg) collection.set_array(accum) collection.set_cmap(cmap) @@ -5141,8 +5143,8 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, self.cla() if norm is not None and not isinstance(norm, mcolors.Norms): - msg = "'norm' must be an instance of 'mcolors.Normalize' " \ - "or 'mcolors.BivariateNorm'" + msg = ("'norm' must be an instance of 'mcolors.Normalize' or " + "'mcolors.BivariateNorm'") raise ValueError(msg) if aspect is None: @@ -5193,9 +5195,9 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 1: C = np.asanyarray(args[0]) - isBivari = (isinstance(norm, mcolors.BivariateNorm) - or isinstance(cmap, mcolors.BivariateColormap)) - if (C.ndim == 3 and isBivari): + is_bivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) + if (C.ndim == 3 and is_bivari): if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: @@ -5213,9 +5215,9 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 3: X, Y, C = [np.asanyarray(a) for a in args] - isBivari = (isinstance(norm, mcolors.BivariateNorm) - or isinstance(cmap, mcolors.BivariateColormap)) - if (C.ndim == 3 and isBivari): + is_bivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) + if (C.ndim == 3 and is_bivari): if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: @@ -5486,8 +5488,8 @@ def pcolor(self, *args, **kwargs): collection.set_array(C) if norm is not None and not isinstance(norm, mcolors.Norms): - msg = "'norm' must be an instance of 'mcolors.Normalize' " \ - "or 'mcolors.BivariateNorm'" + msg = ("'norm' must be an instance of 'mcolors.Normalize' or " + "'mcolors.BivariateNorm'") raise ValueError(msg) collection.set_cmap(cmap) @@ -5642,7 +5644,8 @@ def pcolormesh(self, *args, **kwargs): collection.set_alpha(alpha) collection.set_array(C) if norm is not None and not isinstance(norm, mcolors.Norms): - msg = "'norm' must be an instance of 'mcolors.Normalize'" + msg = ("'norm' must be an instance of 'mcolors.Normalize' or " + "'mcolors.BivariateNorm'") raise ValueError(msg) collection.set_cmap(cmap) collection.set_norm(norm) @@ -5767,15 +5770,15 @@ def pcolorfast(self, *args, **kwargs): vmax = kwargs.pop('vmax', None) if norm is not None and not isinstance(norm, mcolors.Norms): - msg = "'norm' must be an instance of 'mcolors.Normalize' " \ - "or 'mcolors.BivariateNorm'" + msg = ("'norm' must be an instance of 'mcolors.Normalize' or " + "'mcolors.BivariateNorm'") raise ValueError(msg) C = np.asarray(args[-1]) - isBivari = (isinstance(norm, mcolors.BivariateNorm) - or isinstance(cmap, mcolors.BivariateColormap)) - if (C.ndim == 3 and isBivari): + is_bivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) + if (C.ndim == 3 and is_bivari): nr, nc = C.shape[1:] else: nr, nc = C.shape diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index 4884eec2e11c..7e4d1c9ff212 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -1152,8 +1152,8 @@ def _edges(self, X, Y): Return the separator line segments; helper for _add_solids. ''' N = X.shape[0] - return [list(zip(X[i], Y[i])) for i in xrange(1, N - 1)] - + [list(zip(Y[i], X[i])) for i in xrange(1, N - 1)] + return ([list(zip(X[i], Y[i])) for i in xrange(1, N - 1)] + + [list(zip(Y[i], X[i])) for i in xrange(1, N - 1)]) def _add_solids(self, X, Y, C): """ diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 323966156494..6e058a89fcb6 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -888,14 +888,14 @@ def _resample(self, lutsize): return BivariateColormap(self.name, lutsize) def reversed(self, name=None): - raise NotImplementedError() + raise NotImplementedError +@six.add_metaclass(ABCMeta) class Norms: """ Abstract Base Class to group `Normalize` and `BivariateNorm` """ - __metaclass__ = ABCMeta pass diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index fbcad2440141..d18ab41ecf19 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -718,4 +718,4 @@ def test_abstract_base_class_norms(norm): Test that all types of normalizers subclasses Abstract Base class `colors.Norms` """ - assert isinstance(norm, mcolors.Norms) \ No newline at end of file + assert isinstance(norm, mcolors.Norms) From 5c8dc6581cfedc51ea7aa94f5d6c69497d0f89ca Mon Sep 17 00:00:00 2001 From: patniharshit Date: Fri, 25 Aug 2017 11:30:01 +0530 Subject: [PATCH 27/35] Update docstrings --- lib/matplotlib/axes/_axes.py | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 4ce84d18776a..75b9b6af1f11 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5039,23 +5039,25 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, Parameters ---------- - X : array_like, shape (n, m) or (n, m, 3) or (n, m, 4) + X : array_like, shape (n, m) or (n, m, 3) or (n, m, 4) or (2, n, m) Display the image in `X` to current axes. `X` may be an array or a PIL image. If `X` is an array, it can have the following shapes and types: - - MxN -- values to be mapped (float or int) + - MxN -- univariate values to be mapped (float or int) - MxNx3 -- RGB (float or uint8) - MxNx4 -- RGBA (float or uint8) + - 2xMxN -- bivariate values to be mapped (float or int) The value for each component of MxNx3 and MxNx4 float arrays - should be in the range 0.0 to 1.0. MxN arrays are mapped + should be in the range 0.0 to 1.0. MxN and 2xMxN arrays are mapped to colors based on the `norm` (mapping scalar to scalar) and the `cmap` (mapping the normed scalar to a color). - cmap : `~matplotlib.colors.Colormap`, optional, default: None + cmap : `~matplotlib.colors.Colormap`, + `~matplotlib.colors.BivariateColormap`optional, default: None If None, default to rc `image.cmap` value. `cmap` is ignored - if `X` is 3-D, directly specifying RGB(A) values. + if `X` is 3-D but not bivariate, directly specifying RGB(A) values. aspect : ['auto' | 'equal' | scalar], optional, default: None If 'auto', changes the image aspect ratio to match that of the @@ -5079,7 +5081,8 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, on the Agg, ps and pdf backends. Other backends will fall back to 'nearest'. - norm : `~matplotlib.colors.Normalize`, optional, default: None + norm : `~matplotlib.colors.Normalize`, `matplotlib.colors.BivariateNorm` + optional, default: None A `~matplotlib.colors.Normalize` instance is used to scale a 2-D float `X` input to the (0, 1) range for input to the `cmap`. If `norm` is None, use the default func:`normalize`. @@ -5259,7 +5262,7 @@ def _pcolorargs(funcname, *args, **kw): @docstring.dedent_interpd def pcolor(self, *args, **kwargs): """ - Create a pseudocolor plot of a 2-D array. + Create a pseudocolor plot of a 2-D univariate or 3-D bivariate array. Call signatures:: @@ -5557,11 +5560,13 @@ def pcolormesh(self, *args, **kwargs): Keyword arguments: *cmap*: [ *None* | Colormap ] - A :class:`matplotlib.colors.Colormap` instance. If *None*, use - rc settings. + A :class:`matplotlib.colors.Colormap` or + :class:`matplotlib.colors.BivariateColormap`instance. If *None*, + use rc settings. *norm*: [ *None* | Normalize ] - A :class:`matplotlib.colors.Normalize` instance is used to + A :class:`matplotlib.colors.Normalize` or + :class:`matplotlib.colors.BivariateNorm` instance is used to scale luminance data to 0,1. If *None*, defaults to :func:`normalize`. @@ -5679,7 +5684,7 @@ def pcolormesh(self, *args, **kwargs): @docstring.dedent_interpd def pcolorfast(self, *args, **kwargs): """ - pseudocolor plot of a 2-D array + pseudocolor plot of a 2-D univariate or 3-D bivariate array Experimental; this is a pcolor-type method that provides the fastest possible rendering with the Agg @@ -5738,11 +5743,13 @@ def pcolorfast(self, *args, **kwargs): Optional keyword arguments: *cmap*: [ *None* | Colormap ] - A :class:`matplotlib.colors.Colormap` instance from cm. If *None*, + A :class:`matplotlib.colors.Colormap` or + :class:`matplotlib.colors.BivariateColormap` instance from cm. If *None*, use rc settings. *norm*: [ *None* | Normalize ] - A :class:`matplotlib.colors.Normalize` instance is used to scale + A :class:`matplotlib.colors.Normalize` or + :class:`matplotlib.colors.BivariateNorm` instance is used to scale luminance data to 0,1. If *None*, defaults to normalize() *vmin*/*vmax*: [ *None* | scalar ] From 21ea65fefd1442e59c508aaae9f4338c6306572f Mon Sep 17 00:00:00 2001 From: patniharshit Date: Fri, 25 Aug 2017 16:29:15 +0530 Subject: [PATCH 28/35] Add bivariate example --- .../bivariate_demo.py | 38 ++++++++++++++++++ lib/matplotlib/axes/_axes.py | 8 ++-- .../mpl-data/sample_data/air_temperature.npy | Bin 0 -> 84176 bytes .../mpl-data/sample_data/surface_pressure.npy | Bin 0 -> 84176 bytes 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 examples/images_contours_and_fields/bivariate_demo.py create mode 100644 lib/matplotlib/mpl-data/sample_data/air_temperature.npy create mode 100644 lib/matplotlib/mpl-data/sample_data/surface_pressure.npy diff --git a/examples/images_contours_and_fields/bivariate_demo.py b/examples/images_contours_and_fields/bivariate_demo.py new file mode 100644 index 000000000000..d4e41d227b14 --- /dev/null +++ b/examples/images_contours_and_fields/bivariate_demo.py @@ -0,0 +1,38 @@ +""" +=========== +Bivariate Demo +=========== + +Plotting bivariate data. + +imshow, pcolor, pcolormesh, pcolorfast allows you to plot bivariate data +using a bivaraite colormap. + +In this example we use imshow to plot air temperature with surface pressure +alongwith a color square. +""" +import matplotlib.colors as colors +from matplotlib.cbook import get_sample_data +import matplotlib.pyplot as plt +import numpy as np + + +############################################################################### +# Bivariate plotting demo +# ----------------------- + +air_temp = np.load(get_sample_data('air_temperature.npy')) +surf_pres = np.load(get_sample_data('surface_pressure.npy')) + +fig, ax = plt.subplots() + +bivariate = [air_temp, surf_pres] + +cax = ax.imshow(bivariate, norm=colors.BivariateNorm(), + cmap=colors.BivariateColormap()) + +# if input data is bivariate then colorbar automatically draws colorsquare +# instead of colorbar +cbar = fig.colorbar(cax, xlabel='air_temp', ylabel='surf_pres') + +plt.show() diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 75b9b6af1f11..8270512bf1e0 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5081,8 +5081,8 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, on the Agg, ps and pdf backends. Other backends will fall back to 'nearest'. - norm : `~matplotlib.colors.Normalize`, `matplotlib.colors.BivariateNorm` - optional, default: None + norm : `~matplotlib.colors.Normalize`, + `matplotlib.colors.BivariateNorm` optional, default: None A `~matplotlib.colors.Normalize` instance is used to scale a 2-D float `X` input to the (0, 1) range for input to the `cmap`. If `norm` is None, use the default func:`normalize`. @@ -5744,8 +5744,8 @@ def pcolorfast(self, *args, **kwargs): *cmap*: [ *None* | Colormap ] A :class:`matplotlib.colors.Colormap` or - :class:`matplotlib.colors.BivariateColormap` instance from cm. If *None*, - use rc settings. + :class:`matplotlib.colors.BivariateColormap` instance from cm. + If *None*, use rc settings. *norm*: [ *None* | Normalize ] A :class:`matplotlib.colors.Normalize` or diff --git a/lib/matplotlib/mpl-data/sample_data/air_temperature.npy b/lib/matplotlib/mpl-data/sample_data/air_temperature.npy new file mode 100644 index 0000000000000000000000000000000000000000..cfcbf84f9b6ad401a1ccc90ba28c549fe420bc8e GIT binary patch literal 84176 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

HMX9&qKm*K4$*HIa1Qo!+*{)?$?(X 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%0A+Il{3?7IHY^fIl- z?P>V?dZzdAJ)y@LdRh1Pu@A9dvF--m2Y4^^zUuiDd)0OqAGut~&y`&d`(el5&3?iD+g(oe*1T^I-7ff-!21sS zdD;6n^8)@dU6)>`f!BG*^Lb)AlbvavcZ^f7v(g-D2lNJhHti3OBkgQ?oI&^w_?y8Z zs;_POl`}mozo_@uo)9+f5teQgj;QG2!s&Lx`boms?ZRXZeP`#(!sPqH>~DnC$AwMLqrqp?fAH5u&yT71yX<``-}88O z&QLmYyz`G0=1&lgP7}s$Vb^rLey!4-+l1jz*n37efR4LevpLnSF6+YkBKu=#IgbD9 zp09mlJfEH)d*7>jT{ldR;m6q@YV3pl{*38h)%2a`+ol^C_Z#wL)9slVtKRP$E{7aj z_w!xTorc#N>#pT|+Rb++pV0TrOc&rsX0NFKSf8=?UD8AU-+oi&SkFz@1D$D`&P-oZ zx#*w5`d@?q*6Y=59~fxolb3ex)_lb0yCs=r{63*Yl*{ z@okS)K6{}s^EF|8>UDXRaPlRm-_W{l-RSjwuCRW*@fhKtDV+UKSUXBs-A|bPk}!Dx zt&ix&j)p?W@>Q~lu` ze%}ddM{iSo-{@^&e7gF9@j?!&e%tf;Kw%OI**DwFn+x=O`A5QGQ&=;->71f8@2UBH z^;2E$WMRv6DLGH+=@r7F=Uw9Y-tan0`8e<6Q`3XQ>$POQf8uecp62gVZ+wj~OZrZ~ zcO>loOIY^0WBxWgznOozzo{JbGT&Ev_*-FYy3D+*oUQ!8-#_}H(uHG$W7F%b`z`-- z<mSjb+;gveg!SWvv#o^v4TaN+uym2Ixv-ua+#npCr22xU-cvbK@9kZ# zc4V(o``V@(=n>1`Q$J-+6AtUbrsct+$Fb-2nwZaJez7h>^C{K0)UUnggp<34InV#h znM#*Tuex53tk3X#{hu}89Ka`;ZnT|dJ~X|)2VT#$1O49Jh2d_(=KjL=QNmJNSiDZi zdSZPIJg=vJ(*OONg~8=cpCe4^@R3UAzbh;pB8>MF20IC(ErgYIg|(H1)zyT>jfJg! zgfsJ()!)0E*MHmldFXZ5aC^}Ql-=IsdOcV1x@j8w?#G7z?|I*^8KI}pt z^ZTZr5AEYru6CBNdbO}`Itl%NPL{oYLEq@F!O!$u5W7C_tL<}KuixKyyDPs@K61kJ zJf%lR3)`L#{Z*Cjzo+#X-zThGE}U6T>R3K&n_lI&)^laQula)Oc~RK&_vS5!<(?58 zm|SCebgbw^bAQo|{E?y~z1u}!MjHvMuS`FpOVfvhlb3~~vi@&Pguw%Pe)^K?E3B#a zG#h$v;ph6E$m4>1ko&6W4cIn+!9G0;%#+#m3p!MByq`cLVf=X>o&{U1CeEIuHF9u?d#6Y8nz|Gequ#B`>@x;|6?!`H^g zD&6+;)jgEXR)m>v3LD1O4ob)V-d3b^e|urUbd3I|oq_3X+45?34b9t$^>SJ3;(a>UThEu>zR}KZr}vk%ou21|mi{juCJfyV z(@m7_eNi|z4m@vy6_sB$9SW|~dTqh)SkIDMLitHqSTf(#G(UwrjQtV&boVE!KmQv& z*R$N#`n>s+2h9(iD>^ccMOTVL(VN;n!v3zp%-zC4N9D#dJy$(PbS<-~`LA2_zM1!p zhV3i0W7PlHY0#%O-c~!)`Fe}eInUeKQ0cz+iTra)XKoe7b^rfqVecmQ)7ipCTL?XG zJ+1Wg9bq=B=f;Z(1Md$F^9_mDN54Ua@nk(gpWR?s}yM z6JdENy=NE-n+pl+)+gr9Q@P4X=Le=odGis;uaqB|�U3WjyYq#r1#R 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 Date: Fri, 25 Aug 2017 22:04:08 +0530 Subject: [PATCH 29/35] Treat one as slightly less than one --- lib/matplotlib/colors.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 6e058a89fcb6..59cc9aac240d 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -474,6 +474,9 @@ def __call__(self, X, alpha=None, bytes=False): else: vtype = 'array' if isinstance(self, BivariateColormap): + vals = np.array([1, 0], dtype=X.dtype) + almost_one = np.nextafter(*vals) + np.copyto(X, almost_one, where=X == 1.0) X[0] = X[0] * 256 X[1] = X[1] * 256 X = X.astype(int) @@ -482,7 +485,6 @@ def __call__(self, X, alpha=None, bytes=False): mask_bad = xma.mask # Mask will be used below. xa = xma.filled() # Fill to avoid infs, etc. del xma - # Calculations with native byteorder are faster, and avoid a # bug that otherwise can occur with putmask when the last # argument is a numpy scalar. From 7681d146ea1e653bdc41ac90ec99181eceae154f Mon Sep 17 00:00:00 2001 From: patniharshit Date: Sat, 26 Aug 2017 02:38:41 +0530 Subject: [PATCH 30/35] Change conditions for bivar --- lib/matplotlib/axes/_axes.py | 45 +++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 8270512bf1e0..5b3b638df82a 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5150,6 +5150,13 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, "'mcolors.BivariateNorm'") raise ValueError(msg) + is_bivari = (X.ndim == 3 or X.shape[0] == 2) + if is_bivari: + if cmap is None: + cmap = mcolors.BivariateColormap() + if norm is None: + norm = mcolors.BivariateNorm() + if aspect is None: aspect = rcParams['image.aspect'] self.set_aspect(aspect) @@ -5194,17 +5201,11 @@ def _pcolorargs(funcname, *args, **kw): allmatch = kw.pop("allmatch", False) norm = kw.pop("norm", None) cmap = kw.pop("cmap", None) - alpha = kw.pop("alpha", 1) if len(args) == 1: C = np.asanyarray(args[0]) - is_bivari = (isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)) - if (C.ndim == 3 and is_bivari): - if cmap is None: - cmap = mcolors.BivariateColormap() - if norm is None: - norm = mcolors.BivariateNorm() + is_bivari = (C.ndim == 3 or C.shape[0] == 2) + if is_bivari: numRows, numCols = C.shape[1:] else: numRows, numCols = C.shape @@ -5218,9 +5219,8 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 3: X, Y, C = [np.asanyarray(a) for a in args] - is_bivari = (isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)) - if (C.ndim == 3 and is_bivari): + is_bivari = (C.ndim == 3 or C.shape[0] == 2) + if is_bivari: if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: @@ -5413,6 +5413,13 @@ def pcolor(self, *args, **kwargs): X, Y, C = self._pcolorargs('pcolor', *args, **kw) Ny, Nx = X.shape + is_bivari = (C.ndim == 3 or C.shape[0] == 2) + if is_bivari: + if cmap is None: + cmap = mcolors.BivariateColormap() + if norm is None: + norm = mcolors.BivariateNorm() + # unit conversion allows e.g. datetime objects as axis values self._process_unit_info(xdata=X, ydata=Y, kwargs=kwargs) X = self.convert_xunits(X) @@ -5630,6 +5637,13 @@ def pcolormesh(self, *args, **kwargs): X, Y, C = self._pcolorargs('pcolormesh', *args, **kw) Ny, Nx = X.shape + is_bivari = (C.ndim == 3 or C.shape[0] == 2) + if is_bivari: + if cmap is None: + cmap = mcolors.BivariateColormap() + if norm is None: + norm = mcolors.BivariateNorm() + # unit conversion allows e.g. datetime objects as axis values self._process_unit_info(xdata=X, ydata=Y, kwargs=kwargs) X = self.convert_xunits(X) @@ -5783,9 +5797,12 @@ def pcolorfast(self, *args, **kwargs): C = np.asarray(args[-1]) - is_bivari = (isinstance(norm, mcolors.BivariateNorm) or - isinstance(cmap, mcolors.BivariateColormap)) - if (C.ndim == 3 and is_bivari): + is_bivari = (C.ndim == 3 or C.shape[0] == 2) + if is_bivari: + if cmap is None: + cmap = mcolors.BivariateColormap() + if norm is None: + norm = mcolors.BivariateNorm() nr, nc = C.shape[1:] else: nr, nc = C.shape From 59f56af84f9b019ddcd3a6a06b35aa9c6521c548 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Sat, 26 Aug 2017 02:39:28 +0530 Subject: [PATCH 31/35] Add image comparison test for bivariate --- lib/matplotlib/axes/_axes.py | 3 +- .../test_axes/bivar_imshow.png | Bin 0 -> 87855 bytes .../test_axes/bivar_pcolor.png | Bin 0 -> 50734 bytes .../test_axes/bivar_pcolorfast.png | Bin 0 -> 49080 bytes .../test_axes/bivar_pcolormesh.png | Bin 0 -> 50734 bytes lib/matplotlib/tests/test_axes.py | 28 ++++++++++++++++++ 6 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/bivar_imshow.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/bivar_pcolor.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/bivar_pcolorfast.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/bivar_pcolormesh.png diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 5b3b638df82a..3bcc8f55d2e9 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5150,7 +5150,8 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, "'mcolors.BivariateNorm'") raise ValueError(msg) - is_bivari = (X.ndim == 3 or X.shape[0] == 2) + temp = np.asarray(X) + is_bivari = (temp.ndim == 3 or temp.shape[0] == 2) if is_bivari: if cmap is None: cmap = mcolors.BivariateColormap() diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bivar_imshow.png b/lib/matplotlib/tests/baseline_images/test_axes/bivar_imshow.png new file mode 100644 index 0000000000000000000000000000000000000000..757a1929ec6600aba50de4aa7f2c29035435691f GIT binary patch literal 87855 zcmeFYWmFqc*9IEgy;zZ81zOy-xE3hxPH=a3hoEhdLV;q1;=$dmNP!~3gG-U%E|}Nj{r}j}E2lF*1006*IRFKgC0FY<^07N}>)R!Y! z-r=q+4G62wYl>*?t# z%)#;h_G5Q(x8ZQ(PL~G&XaI^bl3Kps4m$!W-pKnMKWbeY1Xw3o|EyLs* zM5m3!mwMS`hVJOeOZ<25bR_~g_CH7QEw~vZ{(A!cXIcch|2Y>M1OLC>`Yjbg|7Qe7 zX+)X-Ho3?NY5om~FBSVM1wioMrgHTE4f%if^8bwJWu^V!>iIvnflm8>{u2HF0>%G7 z5i*nN0G)Co@Dyy?k0yR2xg2!8a+3sv17^(sT+2;a4VY5cJuU!CKtjV^ zyE~{Ja-0ij$q6`a@mu5B@%x_aO3G7J_PN& z;xh_79dN%TmOA{vAd!T4e+?hfx5?p~cV4=J!^HhpOT;eU8o3P+%X3-3V3kfoUw8lv zJj&7apeHYlPK&A#N{MpZvP&&`(}PFtD866xIq;c`QEl;aDAB~*>zpg`&}sI?)l0k* z%?Tu7fkW2AM_nXw-y__rj`5RZX1uj5?~x}MYVb)bJ>ixwnMkwZQpZkXk`nas?`(IW z{4s25!&T(x(Z$2_wf$NuQISjAsqmkii{tj!f+EE(Ojc*M@1y1G6AHRQOvI80+CT~P zzC;JR@azzTlr>75J|@m>*P8Fjj}X|rl#&Wlk`b(Il9Y>*=9e;JCQHH7IA-F2=y zy=3_uulu=$%zgW1k_`S$Qb}I0@Nw%wRnL`6@OgG;2o*vf-u3*o!)%OuPFQ^o+$?DP zP8jl3w*z)+dtZ@?UXi#IU$Z&PwZtuvY>~#XyTqLUKZiNU^k+^D`o(gxvkp2BkTlu2 z=Fl6kg+wANq+U^-h2}<~CnVxDYwIl$63zBC3$ROW~FdD zNHQgUu1qRqzC!5J{&%hy!vN$sHoxynV|iv7s6UzmL`P$eB` z$Y&VQLG)y*)S0}*300ug>CjLAdbujV1ZiZQWvJIqcTfkN)*FqGMn23&{C>fAB49N_ zHE@H-clA7XcS-yrA8$RN>pI{xl1bG3=oUdg)bUas(?M)UzK+CEB>FZpAC4G_Q^O}^ zQSQ_kS(&Wg;9~6GxF{}%JloBvvqHhcY;hT4>;y04=3)lAJv68BtvWP9pD7kQtKOIo z(OIhGQ}IYNaZ@*y0ZiYpX9;EpoQF83qFr-Y>~X z-#?IzRA1S4K1AVfpwl3@zw$ly$O9i#wc&Dv+>W}9ye(OqN)F}?e!dO?hCD(;5@Gip zFzNY%h#qMU#4EFQYln*nQFo&b97D&Yw<5$e5BG<8KS=NyK#nqzj&Fs_iVfYy%8nXc zl#BG*8$r?@IGzC4zp9{82{|$%9E8ni#g2*RA$K5fg1|_3DT|1!clavCgx{o4L=YaP z=S4rbF5F0uJ{S(36(b?VYjLzyPL?evVR&lejs|hS2287=Y`N!L#KMH8 z!MNa~Mm7Iip9l@XliPOQ`lA4j1M%hZRdSrr+xU9S7q24uU$1h)6mrJo+k<5iY9n_3 z6%hJ9;A*WY_@L=zwCiEiF!wnY92%r&Dy;+6spjUq?K1|7+=Wn(jHd%H_=e;FyAKx% zI5p&w`J}tBUN*Gl80CH6Ro61n9IPV_&Td+RxM3}buc-8sMhq={*znNap>t@}h zrq*iM{j?tv#ZJWeAnR2nnL1X4%E5?7gG-vaeujGE5YTKGqhTm)1>Jt(Xb{m)eX^(O^?j=NV1w-X zcR->&?+<9=I-Ym2GmNw1PxteCO!KX-I24l@2D(EZ;kT%mg^RFAR?)1Kff4#A8<>L$b}@}3`d-G-=q){fiYgN49H+i&h8ZscNX!Q~9eFJCDY#hd+ld zx>KDmnj;L}s$uX5w_PVjsYML{z@i4mYO-6j`x z!6~2^+W&))X}|f0iCX26K&>qX1lEZ*gsW1@(n&FCnHQ7%f);jClLNPsCcgS~%juGT zb89%o_;RmCRYxU#5mrOA>19?^Ei9n_He%E6e!liYs3#dI%>dyLibBj&p-EH9_q&dF z@6#zwlAVA=B#tvxgw*A|6`NXZN={6xORY_AzK%waATOHDNImir&tOU-S`f*z&N|4* z5qm>^qc5qh_U}3}x3jd^4-&R0RPb$k!>zi!>z28*~80k48LKzsku|3OLy zF(^ck%D#?iG!?*^oI9Au!Y86-m0Ki6EFz&Dszs3@`Wp{t8rpJ}k_)6ZCO-|1lvXvp*DWgHf8{`H1~etXZ*Vhp1aIEAU9^Gw z9L_EqmF0=AwY!EA%8#B*Y?^TmEa#TtlK2k4jhU1mT9*iD4iJ^Ip;tUYMwjj5G`FkS zdTZQzvH1*1qF5GUKbUzStnzC?rQSCKO%Pmqss5)q9bWRIFzPG?2Scd_YjbY3>ohuzf}^sfdb>0+TnbzLA^uI$GyIQ>q5OA849J@SKL7qR;hJvS^FKw!ImNKL zV7sOETv`lV%k`-&8VIa`3;`omK|L;rnpz2A<1?_6)E1cS;AE>aWN zG|T7ny5#Lf2*Y&KXF-*;U6EhY&$w1Qqo$};&EX?$^IU{9Z7F_-hLTc`D9T+e9((U7 z5@jVJ!QZ>~r5d=R0517}8t>KcO2?73E5)%c&|=Sm1>Y1`kq#ENDV_C9l|M#{o8ksN z9ai>HY_hf@aC8v@f?BSmONAvaaUFQKh1>D6n>(ELkZaB780N-KB{bY~4cf8{XKgky zRNPRExZAO-(>Hph$~*QCzEeHaKXsMQtxUVEJNEmC^7TF;@{SC5G~venCytM&gwdxp zy#mfNFkc**$ze-bVeeGA_|@D5EkNJ3$V(v{y?&?JFK}9z{l2&`$XFLMWnTMOkL2+p z7!0uZ{G5%6&K637UUv~N_v{VfLdv>zwF8+h%%Ga38;BVtM6yaLhq{(4Oq+7I8EYSa z7BE(pt9n79uE)bc1FqRuz?H`~u8+@0*Cp3qm$89@|85)q6_^5DLcdNKRYl_IeZ1kU zpC;K-*N%^ysG4^H&TXidhtqtX8k~ZsbMR``JSHqr(_0RY#i(YZ20qjs1Wrh%TPZ)o zXKAd4-1NmuSh#ghc2_o4Hf(O*a2dW$ReMAa{M{;89Y4fhEkcqUhK|w44Yck1C_A^< z97Vk3WJ=uBQ>gRiyBLXr)w@Y^mOq^MjG&3KN+%IxSI6e#)V{k1oL`ew)l|dyc-!I8 zGFWfDUCb2`^e<4A6s`h`l10g97=_I?BFyeU_ftZG1UannD5G)y#*r69CNUgpg z=Exx7O&f-cZio<}ZcujFsPERBsXjiqXBJY6NCzYv@tw^vTG83?RR0#}!8(CZi%w2N zW2_)2Jq-17OYK*HI4Oso@UeAClZ#J87$nTxk4mG?NJUH!EP;s4j8Z2q{nhvdL*(iB ztrN1`90e-HtZ8t|z7NSPf8>lPpA^e)b$$$q)J8(qW00RPW?F=DsU0kd7tg)gPJRf{ z`rgmLtwH`acS+)YKWl(l#q-DvF`QV+UMJxvXvUTWgJOO*Yg&j=LIWiAq_R=SHDz8& zMQO@|Xb~TSfosSg#$LHuKuVc|K}165<)BdXAx>*hn4!nqq6c}n;yIDrACfv}UYML5 zhv!l(OG0Uk#H;cwX0LE_Q@N{L8$etu$a0p5Jlx2LnG?Q3h)3IBCH>;B{uDgN((ELY zl;LSQRm{iy(bM%aRHNdp$wj8t|TesOpmiy*y^>}wwTskAg)3Lu6IGF)}ifCDsJ{i7tK)ivZRhNf-J%~Ka z&GyB`NYU(Ahf%myg@$^ht4(&Xsfe%5rkJzhO~c>SPbdo68C5776{cov)QW+T?{6*J z1Xj*aZ<%HTt5=L99nJLh+vy7pxaLHpi~Qvo9rUT*-c8X7^0uw~B#x z(|K|U1f<5E1ng~xwNrk3ou`Q|YdhI4gSuUJ+M4@5;OGSOO10 zz`mC(KZfc3zGCyk*(d~Z+U=jC7<#CYHKI0OHrU2#;dCDx#(mdS<39q+7tUQVUdFGg zqB?j(&T!RM4!wW?sZ!sOdo^}6M`L`uXseQ>bd#Teg8O_IbE4-46*S$v*KkJb8MLR! z)1>M;cKaFiVg1L@c5Hu4l=?S$D4WcRUhrhyV4)Qb@08v`o!~UjC>ym(JQl1FVA;g< z#rb_iAQKm1*fO`pgg+rQXqwDDoQqB-P&# zpT@DUW17ive}dX&84d-h1-ifR0<}l^OLn?bD>kM}{LU);KeoC(cd?#9!hhQv9)28- z^z<`yB95ddD{Msc)&~mj45KJfPB^MJ!kag7zxk~CHQyh%1uX@R`k_RbrN zW&eZ9=CyDvSE#YidNhS|_pGjIBDCY!D|k5!3C(p@TQ||yUUzYp+)y#{B2kwdpK0lnFLXv~9UHqrBPyRI~ zd^`a1Uem5a^2@;P1IIr-C`=oB|z&0wW<8gq@HDP@V1K*Y~D|#R+Aa8 zk&t#^Y_cJ(%ifeq=ZzrhvwVT>{w8;x?w5d0w8HIyImohZ#(A$=oic z9tBYk&o|EDr<7}pBKJoq22vhoSP@c>@;|!V`TXK8y2k3rb0pVFQWHLWKckHpd7tQd zE>oWhvDWAHdjNgZ>>k$GejEuRkiIUbdOt58_s_W{p&EWUT5yccdtAsH_?&yeKq=~r z&k?XNDwiB^o()Tw2)?Sjxfv2q+7;au0)%FCUKBT9EjqaUdXur%e*T*!DP%f(HBz^I zgLt5^(Fyzvd^(BwM|W+ixcC#9T$bq~09K!_nl^PqE_F{2ZNw=!{HMSV^BL`1Z}eD6 znjf#0PETUQDX&)pICAf1N;U>Kg1KJUD0t3c*UbRO#y=P0ww+Wx}|9A}?!w(SiG7@a71 zl-umvfV#$cC_|Z&8&~hF$vTE^0&NsyPIO`odgm+cwcND<<)V#NlO+GY>uSK>$QbB?5iBY0PVFRSv zW#SB2L9O|QG^!8Zsjq)?*`ZeuGBn@z4}PBY#!~|K@6Sv8gJ@QhFSk<8Sy{f^7~7l6{e#+fU^H-6bysW7^P) z?`ER!+2_2&4J1HS+p%!_CKbF}MPP*&pGIZcjNj0u^|=T5fIxkg60-(p*kQQi%5?n|bK z1o+p1S0zH=#mQ6e@Z_Fii~gfHfluqejTin)dV0pG`5+ar5Ooq`?`Z18`6@x*puD2` z4jwzdz^%aF=tsK=@#Y~5aBeA%K&|Wf^Mr}q<>U#6 z7lvK;?b+)8{!Av65u@ z{rqF#Z90c0HE8mz)5hFCo4ZebY`g;5A_FWf(66_a&#M^%pW+ z^tb5w*v9-nd%C$O5l^fR+-C883Da$b7fPXrQWbOH1HjDu|7rou4e4~A5wPtuz}7eZ zro`z^tk~&l!Qyf_pCxIwUBD$F_@7g?z~Qaa&2h=H3Jw>jz2R4+#15V+cp|tCPAw=1 zv$x+GTMPXu4R!sv=b(`pba)H%4T7_X43AegLtD|rbt!d6>CQY`2Se9X!p-lW`1SCK%Qfw z^K-2E9@jR}9GnB*F(7lz5~6y`oxU5}kvfVve6L&_(Cfw;FNBd?03?ly5~Oo1+q9>L zj;b01ICE9gQE{>Mkj@bpKHb!OT-}?zF1D>(J5juK?CqKdMhN+5R0!c~vMAUfTBff+ zNEk#(!rlo3SVhcQ#@HCd*4IC++PxiD$^HY~YF>PFPzdE!49#4#y}F?5M;WHfEEbYp zOy5D3B&1O2t1EPu1#551jBMWByDF2tlA=wbPm)+z?FtbGBz&~?ozu5jrw85+o83E@ zoWE|ro2^C#eDhwk^WA1KjnnP;tIaO+^ay*VLc^uhBj2%rbpKn(YiJ=SXu2lPMV~+R z?w8~p-?LRUsI7Zk!(ki4qO=20y*vQwtM>FMMZ#Q`&=D-024v;_t4@Qb=7*lD3c# z-A570T}_l!x}3Z>!#D(2u6qS-q`535&Dc32bkZfhqX zXD{H5*zD=f;_`+-Nlah<(KlS4=J(0_!EG$B++VZRkd467`Ps9LcEDoDWbC3$IM<-E z0$t})YIbTX`@E@5M(F!jk*vr>j?T5mDxJ$**PIvrY`4>J$g*#!?#v@<)3QXnPrGF zXh-`zok*$b7=-yht<_j@aMGVnIbI+ZIn~|Ne4Sc2N-%sccONr})Wm`uE1VDBjKq6V z@2X+Ds&oMcH(xJ%-~rb9iBu^MMP6z!H7zZ15omZ86S?ngmq;>9gN1T0D{R*9JK^^y z)z5d;zDrB1(a`oCzW*TcgX*qeL-R8(Ln?=RP(t%d*li--`Iz$JR-5xF&z>RbDa+lp z$!2#FhHM}RYUNvifZCz7VR_D9rNL}^DpN9RT6mL-?-94vRg_Obk*%x0F{M_t+0ll^ zuA(^ugkaQfWPN(kh%=pQHu{HE>fEZIn9eEsHlghi>W7??FYunZK$E@1COTUl^xM_x z#l+i`MDKGUJbH&@7Dz1;ms%_a@E3ZATfK~(pjYa{jAnCKTQTUl*Re<-AwK4bazJQrLuhIZZ4ojgAz_hCWr z+*vb5d&HKkhYpvT@Zdr4fKlJ~&$s^ouv;IFz}jqeFyBY9+byc7mRU%ncx31gyT<>W zFa)dTz7uK9df$`*qR($E=<9FD9@Fx*m2HQjPh%mJa&ue*qu4I@a3aJ%5R+6gk1q#0 znEbp8!&kloj`ht1F(WiJeZRUXo6Vd8T&w~ay_dBd&mys49#`ghELS{gR3!p{SA_yp8II1<>cJNTP&6P zak|NV)dU7HspmGb&c-v-3N+wJV7;j0bcbp|k)6M!dCmf8?>UC#xPW-)q(yi`6rAy< zm~FnzV+sgmo33+U6TVdH%T;gFac{8S)i)c{a2OJ;w7J(f7+USLDpGOQohvDBFx&S# zX;|s|5P0(br2t1k79fP>*6xZta`ocr)_Nejc_G0B(4)u}A_fU+fV{oMSM8c9?38@`vk<_5 z{8ChmN|`Lr!<@9@-LSa%rG}4A74)OkQDlnv42wuZICe$q5y~&yvip*mE|6FJ5qDvY z!fLD}9C18Bj3*_%p4D9pdW?e5kx%%^+>-w0p}T-lo$QYUG{W|+FE=*HdG zEWKbqiNfv4syZH9aDX?0epGi;N5;yXli)=}s*>^Cq{HIed1k5i^(K?{zHNe&PD1Ky zwKW6(Pma(PB-K^S)Ab2l@}5gLm)nL_^t2({a_>4lV=B5ENSJ&s7IrM>Jok?2G`jHs4HajErrA*tlG;6`2#&JRk1`l#>0?5(&)4cQhET;0{N@3#541Y* zY*qI%79wngXq&?8e{Gl1uJ`bCy`b@h@sZ=~j-hte^A3bFQH>$O7PGj`uP+z~c-=gd zZ})mR`2Hv&s0kJ<@=~w-#@1Jp9>bpa$?fmYk_~gbfcX(lRgoiJ(U&?O3IOl~^0-tZ#HicvFlO}H1cNA1v>oA{BK11xie;#pQ zhmNQnlXL*|vjF=e@bw47s zlf}C&X_Bc7!LNT$r1oL4{9(iaD}8TR7jq)yU6MEF)#4Fx@Q<*aV*o8;C#qQqU{!c> z6ky;L(zbD6j8u(Y``TG}e2t2ui1yAk&LD)HK5ivId>N2_mo-H+Z1H}1PDeFcW4Ak1}Fh>on zLW7OPb#-uET~3QLbXO6fh|TyVNL0g>8lOetw`I6Z5r-=JNJU_ zF5VGOYFM#?RYHhX_W_-|0j@nLq-&q^9vD{d=9=yjHbU;3Lck)&%^*%;opJY;|A<5C zoxuMV>($Y}jQ2G6x*hHL6!^Suv6&5fV0@|bO{}#{1XTgA>r39_1Y8~V03WA->o&nV zHi7psVi&Z4Zq>&bRbum}0n-PR|0qV7f;X4|7sN-v$31zsRli*vxuHc|LK=}ZTNPH# z&FIj$l-M3yDU$_-UJ8_^FC zm$udKUmLnbuTV!tKcQo2P1|8?v@4;OB?7kgIibX(EFO3Vp#udzSO@8k@0&mUH(d*ht_o@S6T zN|jPq~j+Z(BF%SY3r6Xs~dGYX*M92M$s?5WVXY}(Bw~0-=59ntjlBgVaA54 zEwt(2?^o+k%x#&*B8I8$)xp>hUB6EyP{{2lm3IHuPlzvr)nnRzr13?C{Um?3J}Di#EB?QWP1=YDekN z_5)*hZ%+i;={83QIpE~$L?9~c_O}n2n&;ul<(dCKFzX*(QPr~Zdf5wV-2At! z+;x!LW-TLlKSQ)apnVREczTAXSiUG7URwt;1O zgZM8Y7u_VEU^c3$YW@3e*|iVn=EeGC+s||0{a)5y&8k!*!o1xNQmO_Tb9|r#BUc(g9f}OZbs-=D|^YB2U+j7 zEEKcV3%Ltc%fi+-pzQO0c;l~m-}@V^mQQ)aCx z$bI&zz05M?Nk|zjqB#F)6s?6@Il#<*t^&Eq9L_A9;4m3G8ZoMlPdZOSC%?E|iyAQr z+8megK2_ZQxhJ9>m!h|Q-3=%S;Fnc0I4ZAcqxNqrS5~Nx@SJb%H zq~m*gS#HA4=q4NJso)0uJ2n|8og7!9iy>H}e?S{^tI~|vQolozr3jgGD`!Q9NPt}N zF!8<7kCeZd#E1L2yF^shirVdV_6&tJ9OUb!uo8EW?bl1A2IUAT8s~XFV+NEO@Suf5 zP4uoho0>z<;?vhv6mG+fB`%H7-HafKwT}*6R}TLSWcwL*S>>~C4EHAmti`ibb;mK~ z#)3II$plt?>4P@~f{}nX-Dm(nvj0rsNlD0ENmQxeX+P1aNY}ZD@2KJG#?nXOeTMd{ zhH5I`Inf=i3jcAH~bP2g%a(l`7opZ?PU!-5=)GvRU&pNXu6@SE~ zbT-qi3;8}aiy~bg$2mnm(c!fsYGaiHlje=}{N0f2K%dUgr~~8eCTLLYWJHk^`Pd+Q zRgK$+(2(D*jpCWchnR>u-R)H(F7rx{#kv)b0^x2N1?USe-o&zP>EHs2!XEVehs$jy z6OtXtaB&ol0rz6cpEWjdS{P6X&S>lTP3=bn4kwSlv1XBj03-Ssn%FFF-4s$eG5=I* z!cT)xJvQ$m?CU3H?Mkl_Ywe+5f z9`Lvs0hzniP~4JaruZPF6}nsz8?;<2Anf)C9+F!>SQR!sgJI>RxW~?x^|$;uq55k+*?juXlLzZj~R-#h>f0mwcBu zsRjHG9r^oS_`S$~uH%LDXQIBFjM+d7UPF`X3+yGz4gH68ZeDDVY1s!B^pC~?6MYmk zH?*UaM%+R_mtai)xsKZuWiEl5grkl@2wXvwb;^Pk=pPxrCW2+@`9_=j{6dV!Ga$Q- z#ePTP7c#c%hBkMha{bzbzjn;mys1JKnI9yyF%e#voq+8NYyTbJ{zYz7p)S zE)D!*RyRVa7HoEHPJaUEh^L)0sQ;K&WT4cU_qs6%)Z)2#a$n( zJ35Zw^=#?!s5;pygWU2;{Bg0Bb*jLHiH(5h@q?qo@qt+{3@g87{VSLfUYD)MQJ-V{ z^+7z2z$M3V(#QLwiXA)d!n|zf1gmF|!qSIG&ajZ8GfO!SUG0yo)8`GbKi{zL6#F&~ zYp@$_A9h$<0fc^gI-IN3GGgw(CzBHHJji1^7<1VGMQb4Yo!uV(rLebf$`#%G z4j?VRjq84}G~0Z62ZSbS-dQ!`W#&md3M*&UF{@bh-fesZ7vT`rY>`Nb;AyQ&_9mPS zthhT6e5!()k#lwk9nkEccbhxs|Pxj=+{g=%DMYX-;r@h9c_nQek|H7D~ zpAowG5D{*b)XUV?eU7uzIn8$nBl^hRl=Dov_Mo&zZ{(HzbIzIPu_+zT5+wM;K-A&X zb=|y@HZ0*qw8j$gOU%{KH}t#MEKalMNA+@5Jm-Xk>`9 z>r-=cXpow3ZKEFfyNC5_17!!v4bNJ2D$IZ>CZf9EGYAWMo=ucICP#zna#;kRDv;R5 zD~gSuum~@I0noyR_237+tMEd7y6dHVjTXgg*fE+$C+$xA)@HV>Hh!6dfd*^R+#M)q z)Fw5)kh~}jqFp~sV>-Ix+nnBF;^FsQ6iMzZE4WPo^VW}9c#dh)ZB4jNX6j56ouD%V zgvg+gc?HA8IEfFJ;w$;UD)2`glVgc=QneoHDZPG#BwBQ%mum>lZ;4z8s<|E@^xHX6 zxky9SF*jQ`Tpo%p*vbFW@hRLOd3gZK%D~9=hsR`E!vjJG^QKNs7`_UdLe0ASwDSIu ziCN=bHLS?IiC{9>UK=CjWsV0ULT|;)8qvfeoh6U=Bs2CwMa8`5vUz30Mw6W>ge$Y#w__QS)nq=KuL^Z*GjScfrSA-SlHB9CUa; z9gY#R(*Wy>b(Y`xwl)cMVv~D6(nXZw1DPGx{wCA(U8ObnHxn3AZ4Ih)E}Nmcd$)1- zbW?d%Mlj0{Cdz$SGJC~-x1uiATq?m&vP{#6y>@~8iYXh?$JZt%k4ORLFS3zY2v@iH z5r<%~jE{Aq?wM7yK?e4YRDA>F|JE` z+Cy;evTB_()~B#YP6Twc^gmEw6WgQq<7}WYmyD@BY(uB*nPT%`;|C`WA80iP=3wT( z$I=N7)$nX?juV=w1Pt&dqqL387N!yx&V5~f{rSfBPv|T2J$62_zjLbyCcbyO(9_0?vURL&nt2eZ>A=`*QA{-ZyE$08#_6 zNgG<`LJ-zthm+_$#A0Z76PO)LLTJc=kSybj34VA`(`gG*G$M2#JoO`f- z_})1O((mUy=Kkjw>0}sGoMMOs1K&-w@PDQT*T;f9R4msT+tXE`d^K(G=%LS9)r!u--=0q_?ou-?LbUZAaCD+ z@9u&>m4feN7AaT+ib*=iXFP#p;GT2Vjw#fIxi0s0aPTcO&^-^+0}i=qnUa&Ubx>Cb zA9M(j_8#K$X(RJLh3H-ING{=Aw$S~}u;*@+jz`n*+ti8fg>{Uh5>Ff-=8S`0laKW) zjNSItHDpAgSh2`+Gh~mLd6a69BSl*@lLlm6GPO8=?2w#O6hUe9WpA_nodPkQ2o~;%KVc1JaU8vehrpFTihCcc2LiWQNH2 zdr3d7=Bg;}$Jmo!^UF7!=AVoT@$a*IG`V>&Cm65lvUZbr(yFWwr;&|p5sF@4G6F{V zvGjRFD}T((_i}?W67u~m-;pA3asT1fx6~UQYCnKd0QfDs#-zOs9m;A@QGJ-tYloo{ z+a>R82yXRHAIzosaz-0wSZlK`92x7)*S9qIgGh5dPT>8{ps%#Tbr^ODpt(M?((sZa$#?=(=wt3oFZEp z0v<+E*1DdI{F3-iHzAkA!?c`aID&2d7m3L zCe7^2(LXkChs(&@aj_Ns*{ z!zBFCIXrlqWGahM5FL4$V#*A=+~E#i-R5|A0iPl5j@UHc-pZNqjVSpM_G$<^4G4xE zOyT#dD%q&;_*iFdG1aIj{uiQT_*=xfB<$%uq7T<>boqp|T8-d0*coThc;=vb5}-4F z^p-Qpur^~uC+!cLw;E!hxj6QZH6!89k{+k5zlIy%92sgb6&LeO=(`^VNfgkZz!j{L z&%;I>(DiM3xv)~%ueN)CpRQM?j+&mLM^aK}4D=2r1ua~(xB?tK?aWXuQ$t^wFd$gu zEQ>6njW_@=-&M9?>kHY_yTe|@a5;!3>rW57tZ0vpi#s6aW(wKzVu07yLI9`9)?RoWlVhHzOJa`=y0$^9P%*>LJNJ!`hh z80M`X{=6N{vBqWlbq2fqO~Lc7KXp7*dXgGR<~tWdw@ISIv`xtate@vCLk_Lgu)?(M zt_=3-lZFSas8pTFx#-81zdWo+kXTRMb?+;?T`eko;PA<^F%1yF979+9U`M0C{3Oc2 zy35oC%XHfhz9DInfT~#a6u8)V5m;1mx3lfk5NPNxNWjwteN@PHPs6)7u%Jobg7~8fJx-3wH4|H5E{#;Q^&wE1hGkO&8 zE)4mmR8v&cI|ErELzv&kSje#w$s-xb-+$LYGzM4et(@B8Mx zBC0xbdwR|&&tC<8eZN(tLIqGUhx$V^>O3DAdv~`v)j8!~TL}F?z)-Vyh1cYcn5}Qi zNsS;^jFWCDvC2=^o{tP0NjvJ3L$r*c{Plv=qz283k_I7B$-V>ZfJ4UK zhPh?+*@#9w#Bg4wYmU#XP--dqbU+wM&u90iSDTRpk>jZkHG=uqk#eN~DdH#2Si zJ{4|1ju<)co&45=sGNb?aej#rW3hK_*Yh)hVeB?R-*9cGBsKZi&Qnd6BQ@Wck<&6+ zVblN`Gl$?&l%(#8VO=2FM&HxYqpFqjWSLc^@E6sqK-6wFo4hUOuXzj3aiU+Xpc9rZ zk8X=9-xrYi1@3uU42|CrnSTWrT$V6nACbGmm_Jl;Fi2!&%BE$=^2e)_gbbb0y~m<$ zf!@aIlQc0%Rmk=lHm9sKEaR5!P9q0XsRjV~jqSccuO~-iI|6QkUU^`p7+2e+#N0WR zUu*mO+=;RHd_hyVeZ9X(f}Al`P}?i>@$saJbMBy%)kH|L%0IBGtItRJr~>)_vnt+L zWApCQf5VopcB&RLa5h`Y8UV!T88{pn}#WM zF0lI^Gt@pDshud;$rEa45%K5jJ3Z(fuf&qI?oV>I^G4wB4B6rDFwC+u8+L|oomSpl z@s_+<-Cz0ql3r!kOc__J&85_ZuHA2K+ia!2Xq$G4v3?o^eqYwTnfEYK4lSA+5YF@c z^h?q-#mX;_6w3^9C_9ud4ZyWN?U`7ndu%$(XzxA?1kTyZRnmQv3n*GvP}y~pMc!>_ zka{&RhH3dyH>YeKwfxZ4WJcSv6lQdA(`g`9C<-$W1COL;POA|=K6Dl`wuIdP9HK4a z{#Ofd<_cxZ4E>Xqd>kU-m48?8@Pxg6%If;}xo$)#w{EZf9l4w*FEU3xcy$c#swvSrKhtO zj~jVZBumgrSiBKU>6ho`bkMC>9J7gjb44A4e? zRZDv}Gg@K`!c7M1L!pf+XhnN-${HUjzmoLjpSARq9wEb6JeH<`)>fN2RZHG#sbCkN zN7>n%ez&NRD|32;S|xK`GP*PNNrV+8pA{N=~uB*)prr`NSPYd~vnW3xj3#~p&MKryuQqutlf@9=`sJ$Y6? zNiHJnE&k~!1HXvf%8=35&U1W6 z`ewa_?0x*6)ftLJqF;32XpxQ&hF{OQIB$ZG{rOY!5)}?CEK9Z0TiodoS9SZ4f#O{_ zYFZnvZ(@@9hx)mbKo&posUVBGKqV_w32$iabG~RUikdODaiEsEwYmlLE5(}To^+3nTiKZz;E}<^@ ztbpP=F;NAgzTy_6z)x+N#+9v%Y@rh=j<>&he~FB0%=H6+ptN1Inoguj^5>tIg*m(F z=spqgCrPvHauuvPauwt$N-Ro>YJA50nG{8SG*aHT_SviwsP?nRL~-~mSR%y026S?= zFIpygv1f6zo#bOj^VvHyObluVUkA& zkAI!5?-$kY$g;GiA0r+d_T~L(m5)LDD3K$0Il8ekS@wogBNpa5D2p!J^8xR5Mu)c> z?*l2l9_VTM-C~i4|6||~JgO#UK(QKG{YNd}*dh%O0*^l*v_~J3`*kL`$RCe)9l;sm zP;`RXV{xxp*@^c?i7x7}g|)snmY~OPMthJx%8Kf?@HVc_jY@rNca5&EA7Ok~&4<%u z@ri-j0?P~uonmiyNr8UP*W{Bg^RmAMcY*E2+qxZL9xYqLQn?*SDkOe?Rr47@%98%< z*_93%e%G{5XI#|@v`+X6#{C2lb~yJwz&|Ri`+A}PrYP0E37lv~5~etf;$;5F4i}+_ zVONmvM=Npo?tYU6LbVBUx}(y3-OM)*%{(KdD!Ot_I~yGpkt z$#KLMUD5_Dp&jTz(F?}O;7fXbcd+VgUu0RSj#$XXw%`BqY?K(3U`Mn9d|!o6%Odj$ ze+cE>Qp}6up1oiEfm!@+S;+6?{RYQGJX+rbIT7)`XfA1?_rTfazJGf%lL1Tb?(2;o zq7&6=*r)s=jBfr#2DJTB*o(vR)g)XFTk_E4a%dM(s@t(gd7d0uh!=&UmZJrPEeRX`OXgmH>?6~ z%}i3xdq-x%u>~^mm7%r2`@MW%XX=PF}S?+|J-l=E;%7LVYeuJQ)=o0F!)3*^R=~23(C!Bo8Fpnk) z5;~GO>_@dxB^t+z?fwyCi7YIJbg6z}hc6W&QK4&_O*iC{L%xJCKULq4mfvgB%l{iPEX_5HO8;l8x5&tN`@5}iL9n{do zs?|LG)tLzD#VkJNSPdjwlNggROAXM|6qpE2;u69=(Zdqn%6 zLcU$fS!5VU3l|+^-+U+-VEUl+xsZ=v_vPu8qBs@^jWm}vLT`|M!KI2hQYCl&^3BHC zpcL)`lzKQ?J=;LsF3IOVR=5m*b5eDq;DF~=4b)vZMx`<82xehVJmbyVV_`=;$LL99~Z zNXGMKQ=)+=-3%4{QrR=+PO;xc!2J{Z+7KfRv#fy@3I(ve}+ij-;eKw z7zZ+`w}rN9=w*!_*tJ>0>N#;iToGp-?Ox2?8qg2MB`wMI+D6dESISyEx*q%RB9ZBM zcT>>D375aHvJ2C6pWPYokfqKiTt&LhP!X#KQLbuN>X?*Dk?zR5`M{4=1w5IUP9qsbV?VI~jk zmI&rrWkx<+wW5T;Mx_tq`gO;-`@4iEKQmlH;6;i&a^^zzGJ)yqIBN`;Th&Eb)x%+U zu7U8dZOwmkuHM_=zBC9C`{li`b{Y(Copk>JGVYsZXa7HjpF*Ej-DH3sERJNOJHoH8 zKPqs6BVmt!MYE25M^9pyk_r2&vo3fjqZS5TO`V2Il=_{H{jCNEJNHn5w8g zp*Vz7igpfrD9bv9_;=W@XQ`pLMg3LOUqJKssSvAojpEW|MM;*%>Kf02t7)|M%^GKt zaHS_Wze6qB??5?R(HyD}#a$QdI*b4iU?+WI-K*N|mmlt`@EidRNOyG3Pm2(Rwz#r> z2>k*#Tyjw3PEla<*>RM0E>XE%!>!Mfk*Hx8u5>;9y?+6JU! zu0J8Vu*hk!BUvtut&I&7F04Zvyo4OtKOt6*an4%XuJ;k zM`z~-Vr|cmT_1mT_XCl!dt8wYr-hLrGfC`U+@l*PBv1M_*klMAgn0Z$<5owy9bzVb zNH(_9o3!Fm2ynC&oIV>95jY;SZ7xiAa=ZqQA6fp5NRD4f91BMRbM8?hTg0Ec)d)4# zNq=>pTIAW|&P2d1T`BBpG4@&&*I&FCX8SnA>0rr8v{0%D-(#?^9ch3Q92;fTQu(Vz z5#HA+xeYPbYP%ywZ25NF`scEu376a!R0Uit^y%f$;bFZ0N8X}*`N-V?qUecw^uil@ z2O8LRjPx6$a$q;2y!{sYvb2VRMla+ri>BA$D~(v^YoEjU@6AbL2ot8pj``hA9+#&Nhet~BPqorAY zDm&qaEi(#n(o&D&kbxWs#!j=WkBy@_pLQOi|BJp|mkaGlE&J{UJ};?h_Ks7F_0Lpm zWh1)dU8IrF%zDz9>eK43!!^AoPhfR%{WuF(j`d8@Uwe&gryq8%`oE$T`~NP{>&`Xz z4S>|!PJ(%F1c%(~_&7IKB4{k}@Q6}QzmF++$bs-si2?>~b>`Z1izs&XXVV;av3BY*gAG1XVpGIr ztvmfKdB|SVSULY$})-oj2jh(p=&;D4&^F-C&XbN=}jLvZ@+h(?YE9 zM^3-9qv|X2B<~*{6_qlsBSQaX-hK}{S&$U*c1x{{$T{Nd-LZ-kRXdcZ(#n!X4g}6p}zKvShjP_!kLiRmnR1&Z=V(>~(2|SsO6;JOUzn$7Zp=Fg^9iBtoB1 zi;S|nxjXz#(k+D2*$dEEt4B~B7U$;g*xrb%XSk@k9grJtRa6*fb4@LTZgsf{+5x{b zsjW^8TLt~7@G)6DMC z`Gut)?80%V-J+vB3TW@y`QXRtcfFb=r65%_~nPl_a_L>U?(o+$k5J$-{3dQC^ZWm z&gDrruMj!2obpd-gN~B;cr04C_1S&3B5DUEaNLbUgK%KpjosEP_SL+`#Ej(aUqb>q zs;&w)?BN~)-UQF5|GEGKodw-oYU_x`qGlM%Hg;rL}as`(8i@%rh>z(9VgQm3qaFQ zaF)irSj<{(%C~glxw<@;$o~;NGf5NS02&f~*!f`PW*V000Mj|dp}9rXXc#_Y9#YJvPiX9!Ww}Y0cMUY3Tnkm9|llX+-HK zER>2gx%r|>NYurByUAv@JEX#4%ztb%D)$BMXk^)vDphbf11{~Z5Vd}dhiz{Wz#1q1 z&j<;9k`;v$wV&)69(7BdD2ZxcDxN64JlI1Yf@v`iGP+K=>Q`?&4t`gDHM9EU*p2AV@~Ldzy1Ak81v;ZRYXi*rvyT^-sXOJ`apLzZsr5HsjxX zV*=^F$Y$mU`dz~vC&)8MM*p`^{eW4Lc46~D;Rvpr6X}WaY>YWp49p5K>rO#cJyz^g z+#J}E(ewoI^iJ&%%5d(X=zO^ei|D7kd!gZRnn1!PzvkjVBiP>CUM<3~#anHf^y?W? zaqrxis3~Mj0Pzqm`8!E4Ccrlc0Xz}Z5nRVJ;dLjTzB{A>(>qK0=bCv;LcEB~iSJox zMXcHHUuqK1Bh-x2$NNsh93B}rRTum%;}dS*Y7S>-xUR=NMJzlnS)?hz_wJl(ZxO{P76W5seN zE~>Xj3$^h6&SZ>}JoVoZSjt;pvbT}sE5gn3B;!LJ%lHb3IC|AxSW&m##I?%5_T2d^ z@o7e)Sw9f>$-X_)A^@HNv%fFo`TBuvIYkPw?t*!4B%SRGhDCo>dz{V(1L3dp>^3^m zGKjS~PzMObN9c??$-uc4?rmq#t~fW647ve3Op|HI!3SN8+ITttDB5)q!D@QG*4c71 zt>Cs9f#-ZoICq7a(V1eq)#EVxD}Px;z|Op_%DDJtoTlb;{KZ7%o}u-(DkQ7%s2Fhm zNnFCq(e~m%S3WHIt%A@@bNGd&-(2gmfRe0bzAI+~N*E8p>{_gujN)!K7d{Kmo!#{u z`V$ET=u(W8Gy?&$`%?OcWtsz_EuldbCAAT?_HvqB=WLN_eN_kv&%;6h=@?$A76?yC$E}xcK@Ov4v77UyTvDI^$gX%7lCgc z+l#gPEQxW3X&QGjRTbYfJLEp3v6f|{%0SSlto`M_R@8-06eQFx z4B&a9`8m2#+tF+mn*uuwzal-ce{D)JJ>|1d!N#!#ojHg+p%EnVoRoN-G`Y)w!&Z*PnPy0oJysTDytVh^joVA!Kuu9 z-;$I45SHdIy5mu3e49gDBo53rv>z(DXW)qD+ln9j;`BzAnP29ryX!56$Ha?H4Kqr1 zXV+BFP?90yt*Bu=hr!906LGyB5e>8E%uL22WgM90o{Q%afeUajV*w_^^;l5Fv{r3Q z;$(1-vh&Zc+gbP)U73xZPQJVUZ2JHE_9wUjWeZXNgF0^UGY#F5czAfGyhy4#@ANy) zysG<;Oen4YSQlRn3N_lr-3ie2yY^Do{h9>3^G?~JIr20uW}q6zDd zJWqcS>mB1G z;5*Ad9K~&tEzTTSXe-FxQ~yxz0epxP==Es#J=RpLRC_=2nIN1NzXEqgpud+i!Z;tKG2A)SSt_X4Tkkyc?kN7QoGEy zi{2vC61rg>2A}8DeR;H$Jp3$?ng46CqB_v_Pm}qGa{*YIN1t>*ifHN%y=N*th7l_k zcS?*!Td54Z*`@3xQpF;hXM&Ua^fKb`4VOgdi%WmV_ZoO!Zj<1W5T;4F+Zx9AWaE9d zstwca(}|}ULAztt`smD8BQZv>=xaI%uBavHdH<(hLvPv3c8Gn2E|q6HRQ0}XcS4K& zVDtL_$J^cT9biXjDgwi^*AtirD|b|MGK5ygs48`o1it3^x3K(=WiNq(;D-~3qYVW? zt`XrK@2y|W986qhtB7vp<5jS!pGo&x2cGUq=7j7Ow#i*3YJC&$%JRZJzt~8XG_bQp zmz+q?Db0r4+M*vdQ00Bm zpg>BonW|*wHd2p~sQ?igBNDdFqKK4H8nUDLFwzkrDj+TMLQCc zA=)Px;j4%M5iAUPJzl7i8az~oUsVso>3PO`)5;KJMAaVk*U1Pam_3f(i=NYO3*f%? z3BTXdX7k87R)0LA?4apCv&-daD2?Z)r#(a^xlR87{~Gwa{hfZ^<6rVpCf(i8R$QJ# zjya0lK~fA@wRj=CLt|L|1!qVYsl^5^+B(?zau`gDCi-pJ$ z)9$Jis_yRF zY)TL(L03GX`f=1KbMs1Qb2mpKR_lJ~%xTpp**}U23(ttmtCRXG~bErqYF=aqA-Lqi(7#)5!CUK$yBF9xx_7q zK?`y_@3f<-4*}=r|Fa9A%>KQJoE3Mfuqf2Zwn0%~>>@l_#ykq|{X2a$^)1Gq4$_E{ z)Tk7mjCY<<9(Vp9E6$&x&Wg@E{(JY3F7G=XuQPt1^Tzpx`L*MFgJYsHr=FWXJv)DT z&Wa_2g<;>7SHZ{(g-q~G86n5Bz{%hOSKSKg$w3rRB?cx+u;#sGj6u__XG*G{+e=Q1 z{)MXnEFeTMV{ot=LzL0`In?c>A`R=m?Y#%@ZK;#Lp790Az|fye>jGByyXaQWITBHd z9sM4%S^Rz?eLeM%Lg3xiY`|5o{GA zrNH;0hTb|&rI&+Qz1aX$siYcsDC*dhW{_5}NKs1#Pg1FjJb{#)5VOokRc@^H#9D1f z(!Ju!Y=#@L4qU=^u$%!o6Ug&JfuPdlJAR3c`R?-%q38zlK>;q*VaYb8?wY+ ziQsgag?SpIikMCZ>JzMu9`HztJ3Z0XU(6{YS@y`tfczBy_uTzTwEx8ex}yX&!oHbH z0D$FY7X$#4enUw{@a5KER$kuF&JMMVtSr&>%hS7_uQc{_Fg-Cg0J<)!+3UHdH8JE2 zd{nlABP>FTN!45tPys85Z`Y>Ogd&E}c={G=mbihl7dBiL3_P$8*Q`Ob%!CV7*jz=t zqbPdP^z0wzH?^b$XN6KG-j}Nur}|*ea1@ldXd-$OrkU*zo>R6bk@Vc4o7&5Io*s|a z)Wxxcq8MnWgHobmRB6vGZ@fW&+Cv3CpBD?llNOz^VS0;~$w!yz^Ama#m9h7*N+1&R zS9wdt|7$DBO(yv;o6yd+tGjS{kQiYU?@Sli5Sv<|S}%ZpiWRe}D!WRj{p&Ki?NxZT zn5}&3M&9#?V2U6)mj>rb z!zSk@6%bRHTO&!IWz^u@yG;DKC1tPQA(+Yq3BH8G5TYK`-on!k;uY2`a$QC7dhLy}7rLT3MVO*nw3iLiKU@lK)o ziiPsg)P_iac1z5Q{$=gYPT%)??dcl_rQGpw9;b~W^anG>Du~s5k)lQlM>!%D=``> z!tXGIZ@^v8tLIx#Wkj@wH-KqCO?b zo7td<8cwmHs=S$&*wTa2v2;idB^C!V-?V~Hrz^>b_V*>U79)Un#QLoBcVuk}LR%k- z5Q4!B3m-=d7dp0EBGV_{o&nCDvvpX?zB_`hBLCzM=^Bhvc($kthWka`)hH4ibe8w`FcPA0SxZ)d~MFex{PT@qah%dtI4H#}%jm#W9Ut+`Tj~7!G$=Z!4gp z4)3RvPA#Wh!BJj=QJAX0=uVhUJvVT(HXFuC{T^gSmo%iz{Z2GEdxQ(qGwNU@Bw=ol zCr%_t>z>fBfW083OG`e@Uk@Z96-lI>(%UX2p|ca_v?4%ry7p*`XFVDv8Cd+CmtoIg zv}grg(3=k>irP7TW_=|tJp4dF_o_F__oSrlL&oR*o;G9UtNZtuGwstsZQXTzFs425 z&nR>ma81)=Yt*L;dG!sjmKk*c_s$i@orG_=u79^CukU2Zf;`>-)%2rFs^KiuSt*<@ zF&i{(L{lZ=>&v+CvdJ49Y!Rkw*=D%{z*Zu&jsw_AZe*3n`Pb#wb4$TEqLxz;2g&7!C3x0tQ&X^E&j z{7ri(#>*&4&yMqS5CSHc$54k|kJ>rvE(NLQoR)2*9eWjUrA9u4N0I9zN;rZtBzGDw zl+W&Giwvu0dl8E0PQWL~@uM1i{>|Isr$y8=L}%O!$DdTzyIE}e+rj~#wb?W^X-&uD zk81(>Qvs2xAs(`u9}-L3>8meOPO0kzrbjbgP0H#Gpwci$X=)Sr#OQG492vepxM-Tp z8?4AZK61M*U!rOD*%Mm6g(I&tPg zax2|~Tb~cH(%3!0hmzs)EO-mVJ2;`tAU88eo|kv+Suujv0bHs!T>1Yk=S-IN_Q-Es zzDt+aJD2}F&Ai=@zZ$uoPwFueh3|C#;{aZbF%AmOsRUnP3q5Rvai8lhy3;~NbKO7) z2kl~8q`2^Mb!v2Rz9Uy|x5~u`lzx|qwAG;?SZ}Zv4Oj;bMG88q1fh=|(ZL)Yx(0P4 z9x1$xf_=Un02k11#>7Nok-|wLI8N$($ws2+wsnWo=wZmGs^EecC{brM$w8}F6dPuk zkj0tAf)CtEMK=CeSto;c9Ek1>0X=0*8rVHMux#Aly~PAV0zX+4R(04j3f%cO5^2gB zd!50CZjQnaQhZ8KeptV*8np$4(7;G6txjDcV(BzS_sDlV^F^a~)53oJs4}4DjfnGT zx=acbr(W_%&VZFWyz_We4k{mz_+;2Ik%1J{`M$oXE}=n4(AXmq>Jw;Sj&zQME8?Ds zUKq{}w*^t1e!Uzjzk(xoHj9WS*Bbwzeeuh_mC9NRa*`Mwc;Rd%A-0fLj&Xw=jmJQW zl1@jdyxq=;g&3^?3kzp?uX^@&fXTW~4qqMly?wypnz8c4392dZD=3IrQ;tBR#RIr66CnBiPRH#C?76gTy{F`!rO6$3Cjvk9s{0oa5%b^@8 zlybE*&RD_Jx(+ujuhc_PPM?yE0C4LZXFMXWRuGmAX+hE~2p{+&##*L-^JGT%bp@`4 zG{{#ric%o++vYZLYL6{y>H~ju;KF6kgz0?<^s+}K0wIunjQ2I|0MUL#Q;Y|s!PT_O zRz)-;aLj0|g&NjLB$W{%BC#@GE912H!u9d5ORG+rdojVA zd$K&e0n#2{hMwH zi4%Kg_)m+9bvsmPw78$To|zvvW{(MDRM$!64C`@^_*Cgw&}LKP+yyCG9d11gegn^V zD5x}9FCQ#9H#`~~HWx)8YiI`)OYS$AVZQ$1QBBoPzoTrL4u(j;q#x@T(`y8x5tt~* zjtoX1NzySs{B2G28d&S^zvjkjbI!m@;mUvEw-$qJk=gmaGCL!YLBFk5G7= zLnx-PlJyYFwVYO3Fo}4b6(^WYx(pFV%CyRBf?xdq!?~jIt^fdhJIRtYc7JG3+RwWr z$IbH3uujUQJU=fZnTiW-X<|5jtTxH18F(OV)A1sQhG zeXewRc6dz98EdZPO=a;Gw5HCcl_~Lw{k|;gCwKmoLj>uCToBHeB4Y=uQ6$q)I%;7q z^^iA|$VHS%mXGa#S|shYvC>xt?~ZIIC3v{(HeEnDV#uLF^Q@$)E)?Jjc$q{vzCF-+ z_yK$W<328jM^E;!LMn?H8?75{K5gmudcT8o$E2CGwDS81Zp|vgpD<5LkyknY=GEq~ zRm-EL#CL0vb1SN@?FE^sFSuE(QyL1zTK03D9X-^@<83I(%|8z2)zSOXVk7O_%~vW2 zLix>8qK7C(Y^5slM4YhUF`$6LV@|gMj)*{1h(1b7K{#B17njn(45 zAJ^=;@dUS<0sYj|XaA_rRScj5agQG?8G6^xy@Nh{Plyxnv=%>qtV#K1#zYO20&_1U zTxe{8NPI%V=9DDHFOJDCzUq?Z zxel}>6%3nMLIHAY62qig_ye5LOi8hBgnLHjfgo$r5tP$dQ^KIw0fPfZfB6okd(j7&Gv*AeUgc%usr&lJ$dBIzQf- z?4fN$rn$f8(4SyT1JbjADi~~e<3SnZAGdz4yzdH)O}UBs31N5GQbHIELgWrToE5T_ zNYHGkWpM-hTbWYW$(a;HaH16u;cq{$zHHo;k8eA}_SF}T&)rcHlJhk6ev|REKg4gq zdaOATf+Mf8O4~@*WG;SA5f{dm$CGmvKdTCdBoA|b3JH9$gALuXZARH_-7ZL1L@#1a zCsfg7;Q|&~2t|4Z#**GwqBgM&wfpbG{Fb4qRSKny`8@w)@bGW$cKe+%Qm@)Q6YzDf z^>W2oYL;JqPc1-%sWrK_V3e57EVXcm#Dvi~vUHt6Tjdn4z3m?h@;`y^Uz}C*Z}(w< z?B@kg1)|(?WTES%Zu|lYmB!OC@_NV8vH=26IIoP-<^PAX)oper0c>22vqHluRzlte zo^K&L04T?prDtE{p8r1tB9v+iOAbzd<5l|(G8%_K!CeTtb(Tn^AOE^_Krz$S?DQId`M#I}%e;?o0SdHTndrpZjw0h7b zivIJh(5r`k>zRgzhx6-M>dooS&Yga{0mz%-JR@d^0h zo5(6<+wpAq_z7Ihq|fN`lpMkMrvewb>;3bgq$DzyaxSu5*+P+%88Pev&}WSM((24= zA;ze6kr$KcHvh-??`d_j&9wGNuG~G-r8hBjG#VL2w{~kyofA0@MtQ2E_@`jE0{T58 zN^BB!`JMArr}zgUgo+&%yWl?yXKgpUNkPwwuFwq_CE1`4rk{p#yE4Ms=+1m*TSgjJ zv4mIY5-dhYJq~rpjP_@4Ck%4}k3D}d5wLo%9I#t2m97smtqsE!#NtAp(!dzDCvdFe z!S~^8{Vt-XHZFfrDahaGEyn+@GPmEtxpo%h>2kxHyI)Qp#&o(u4-X6ITA>FVvCoQ| zga}|GRe_~Xr&%U>?R9oC^qM2nHLhBFz!+$=+YvJ*mPUqrx zTRr&O$`mz9**M5=n!?1;I`GnwP%8ZtsHH_zJ~vWF9DBnViE2hvK0jO#_dH|kt1%5p+54X(MuNG7jL+=C5INprIiVU0&O$Cl+zqTBX_T#hM7VJ46JL9 z;6|Dy%#?Gv_aQgu~n`uIIH=U&dxJ1e|l*>`K7gMtwl=T8cJggIN4k0YDYwew5}IGV@;PS~N$ zD3=muk?yPX>VdbReEz?i;sq#b<#NFyY4!^?w7EuoD-S#_YfQskuP^5?0O&<4oca{{ zbio1^I{Y{j1&-)7wIbdskZz~H7uHoTe-sqa0-QGvVE$2D{QK0K=o%V)hfOni-?1;; z@4ux7z3A^1;!sJ6A=b2`r(nu_=y2#YxKfl6N=XzMXx9)2HPLI?nKR@ahR6je>X zi*$aY$DR1o*X%LC7KsCl;}=F-8pp*VLot)p!aY}h@!3_;~Ma>W<&)%DasmoTmt%Plmu4ps<( zje3cnvCauxQVuE=Q5e&C^u6s5TkG$X6M1R??*QGbH)Rfl7qODH_5FgaMiz{l90~HE zTN+E3ba}oYz{N%w#@2lIKW>2O?pS)GC!9t;928uA$Q5fFme~pQW84?QU zBqa^HQ6mn#=ygv}YWKY~XM$d;Cq&8ICx!2!DvmL-$`jYPzcE@hP8 ze%)J86kQ(Y3V*>~NI_n-+EfRPQ7EEa%lwi(Qm(39jHeZ~(6R#DB3$goYJ>vvJq4~IKy0I|9e}Tg9Djlm ze~NPA51;j*L{8Zy+tZEbLpPQft0*D^1Px1c-z<{nJNd*G(DF=E%)SGx#(MuC9@zMN zj?~_hZiKc5_tl?|UP7vTj3h})2@zk6fuo|g)RS}Zmo4Zq=HX#b>BiG20dmmsPD38h zRT}(@6dtpKXD&|M>c>l95IUWed^jk&_1ZmtxsX8<=BG$!w2xG(mX8+@n-0x5Z51=B zM%Qd1P6N&B527IXjxdzl`d~gwqA$J=@jj_kBFdZB{AAe4+Jap1b)f(AaOlYvMdITR zMN47=cQ(fn`wQp#3^&UmgH-x7G9Mb&4z2`}uAa4iL-vWkd+-W^!qf%!S}6t|Dn(Us zH>8|)mPReY%pKoWKQMOhUVU^yCwr+7sdu>Gb_qH*aQnqQzahB(n0P`j1nst3b~6nA z8=hpcp~c}cml<_Kzf?sP6$^KFtZ(1GEp!D1SO`q0d=$mAd;EJ%0j(E4&>!{pixb8A zoD)y-+@c+!6bwDM@0lVnIB2Si0oq$vYCu_9R#LORKiKby6rQm{!0f<6EzP-JRwT#F z9rw%_72wk9`-2V`hFHQxI}k0+sV|?F4LKGY+>`(ntZN%$@4`@Yyrvj;;gWWQw-4@A z;!k?EHdOp|4E%L?rZxDJf81=B#}}*li23#$Wm4%y)3ZheU3lR}g@>y>H&w1mEWAZ^`I$EFjn_pV)WL(KC2P`_HL*sE+6u9nw%!O+#BfS$a z8tp6gQeNq>HJgaVjELIhtdH2mm2B3=;>>>%g{o%~-i*j*?@^g}NQe=L(Cs z8KRJMhpzs02T15poIxIJ`6{&{H^^(H$5>PoBig(KAY`)9jv~^JII#Y@-{Zc1RR{!I zMX9NSyX|ofl0d@hf(O_@v*bOo0UKi1IAFJmt$_NJV(r5V?iXK z7wj47GnEsmi;f?|Lzrf772fI1U#k)mllgFjp(I8h8T~EVK~ZjJ&31YKc3_YsRsFU; zQI~~0TD$^Sf7M^=3IBk|rVddLJ2Tsn%ye;j=SV=9rJGr-DkY1JoluFAu9FdnKjqMy zPXj%AnZ$m|V?UP6(ow17g;l_L_N{1Ke?$vv_stjTYo$K&hi z_+kKbrnZJ=;VZ9|Mu<3vNO5)iZ?q=>hY63jEEm$5&9E10CA8-gt=c1Fb}PE zA`)*>j;K(=9?M6^z=ha$f+hgcsNIjBvVCun>wPsDG*m};$f{I~V;ST=dGGft%l?L0 zv7EVQv1>%P0J8aAZH0E}sm+qoMModB5a1(`sqt^nZxa{A-L8}dI}6-}`5-cwp^O#; zap9LFF=JFQKU?PaSqaMS*oC96jsm(w#d%nu5lM%zl+SI_+90)AMFg<=gDq{GE4nDW63o{!6Er0eanNR6T`jmHU z?_x78Wg@!H_j+9GG-T{_vZQE_5nm}MMAyt?u<0w3X_Oe4b@C0rS`aKLs|Gslwt}|^czwAahUO6E5eq_N71#s>V&BN0C1uFcYI5=X&>Nd$FQzOp#VeWH z0OrB{Gc?sCIA!4Ph6Dd;oz?h7YGy|f`y@272#+=RGA_-b$#F3hnr<|kdIr@?daI1u zQ?K$J_|ICl^`T$)_b`CIux&&t5+VZj_A1)8s5+&8rkpp=fbOT+fEMyKGm3UN?d{}M zG^xHR=^7h+x6&gFqJB<4`efzc351Q@lds?!mLWhqU=|TG8F_T)J$Z!B$0z$fAGsHw zx})f*mU&pPJSu`I)jN*FH1&A6*~+uN4F=u#lSj$lGaVp+G^UgM6LwJ^H>xdvhyNP>I@E|O#h*LfUo9F3!FeAypY316lx}yG2-9uiu2EEjS>9v{O)FjlJ z(Gc_ZCdE2ZJ)mkre9qm2^uL6$&4XOv1lXJYo6nR0e)kloVzR(BnZpS`vFY2{cAn8H z>rQL zCyLWQM!zACQFIM>IJeIO_p{3ld;CDk!Y%gd)7-ipSoTg0yA!?-h@WJyoGtg^B9uog zMxs>M$six8(wx7icZ%f=E(AYpM!CJ*&Tm7tgyxoM;kyM3x8us@E$AW@PEK2QvTj`=S9enCw(ht>|-dkE6&s9E5 z_;iK&bRHX}o54#83 zUs*Q6ntq-=F!bOpa8SY(?2m{Tv@l2Ya`X9a)G3;^P!tAf3(M-B-}TQgs=V6wWpKSz z7pzBGJD2jI47lL#yCt;hlE50Tsp`j`HxXFb|BZ`mfF%Se#pRe*4cm%bsK+a8GETK@`m544JzU1qDzFsmnjx0ZqqSf zy|^hea3v$q^+{aJAh-VU=-iSfTOJKn%$Y%wOoPt-)QOTzT?Ymn5q_~S!cD0|m(Ooq zmENVZoxGeo%76u~CVpo-J?C3kDOaI8v^aJ z@$z3zY-%k>u?+nWzo(u-S(&KH{JS`By3JcA8MJUmzG;Pw+7&&I`}wSg#`kUWn>T+{ zhTp`X^~c=x-t(8W^UXJYG>_u~kx5Bo}bOe!VN z@`=BeH~j$&8sZG~-pmI9^Sw^3kG%oS%EWwLAxPd~LnXL2pIreW$#uq&Vfe7F@`fX|nFItxD*m93){7=sdq$pDk=MSh0&e;fG`0Z+U z*vNB=^4}lK(!C^em60zqIgoKws1`qGr>4G=9FBdOv-OS3(hHGeYmy8Dm z&`0LRg&gj91*u#~u^* z*1iE$kLRn0-!`WCo9t&9Donab$)LPdD1Mn206^#80Xr@=AVKl)E~)#_sfX*`qRlpR z5f22wkq&|8;u?G{tN)L`EBf+BbaTaHa`3k-85&^0rTfKoJArqLyV_4F^{)EgQT0W+ z$qVvZjk$!z=olW|K=IK*xVe`n(5;JWRo&ry@%qHA@$zKj#bCB%i)9obOv4cd9>;A_ z)h>SxMGEi+$q~jJwNjilV0H`XJH7b{GOvUm*5BoPJ)<}4Sw~`^|IYL?)^&MPuYjm@$T$ln-8+#$e0{MU& z6GMr^e*X9z)pRbe)$%7L4ViN8yr_e3LyQ)`*Fte|1GQJk5u=9k^cpHZAp?s_nY~kC zgFjqXfxrK4u5s3!%DPXnvU|P&nfHOOESd$PAO(6BB~hg@#(@&B)2@I4B66yVixNr& zrLgDDgr%L4k?qa7A7OY*x;Jd}&g4m4>hCW62 zF1B!*eJk8>oiz&+k*_L<;O=`*nVa_ppy>~clhvpM%WuQ3e^4t0!kcaj4XiWSgpRau zyyzMCbA3oB1df^BsJQqfNl7#Q@-*n>&!`3=$p^2+E#CJE8 z%zIg%|AGo|T`-F(T&@f#KJXNH+tmJ#4vr!Em(BR^7Tz}W1Bj;|_GO^QKZZ0dF(o+- zWfmNHxnTv*V41+y_h^XS_m%rP2bo%Ipaei{joDRgxV-^3oK_szaU#$ZP2RQ+{Od_h zPA)dljt{34y~Q3iTgnH;ThwWi#W?hhH+whOZ+nt0=K*XY;;rVR$5I6@CJ?`0MpOR+ zeoY**EHa1u^!o9XUZJc-c_!dx+Z^U2HWYT*Ho*Vh;{1)+(4C|$Yrz` zG5eeX`7r*U&te{Vzc{4o3*(f`Z779{m38UpsSnKC0S=}uT9Ii7dO^YwkceSl%UNsn z24YV6RD1Hg_bTh<;?kCxn@&0K$@0rdbtqq*GQpjtZpq^3Kt+%- z=}MV=k4l6h@!*Er-;RYl&ckU46o2HjrY%)7>brF3r(A^cna^^1ao?Q$b8X+90otg; zy*gdpFyUD<40U80IGI7Kv~Js^`?#h0ThbR{dM=ZO=`rK?oaFP+TAVD2{#ng?dwaXi zfL#%tZv#N=+5?pQ<0U}y2HDP4%Y&A2xtSJYMCjB=2xl0I*6&g1NdVJZ`NTs`LUD)% z!%k@Mi`)Q=Bt7xsAH+ArpC9+P<>Qf_gS)%CdvJFrNN{%vnjnGT?!hI2pur`$6Fj)PyVJYA{{Pd@>2sd$ySl22s=e1- zbIvi|@k>bEE2RYy?|mZ^X#&RWP++m@O|s3Lk~qB}$5LA|No~l+3WbVcg@5_6sLwp? zp=iip{3$}~*Sub+58`G0!PkY9Y&SZ|$wWts`tc^&v{Rf2NFMm+Q zw5s5BliXU~Yb9}J0L4^le zJ=334M@-ds!T3LPzGOnD%vXeZ!DEr{Q-q)ibVN#v>K^Lm&PFpT#HFLph9C<4Oi(@u@4|!zcWJqFSM=&_Q8R8`Kv~$0sr%rBaQ|f(sv5?n0Bs*G%K4ct zbqBLMLzC|QK0k`W5WUoe(p1qdpBR4qyE^x_6S?{&h!RIvL?c|*^2G-(8Jket&m zjrLI+n%;{pAUlQg<8g@5d-*S%^R!=R<);I2p%#HkH8dqZ*a zLDCKXL>O4Wz%?n=%V9zum^?3I#s3=w9P__?uRa3xOT=e0iViZh=s_1F23ECCz~|he zlN-OL)0QKbyA^K>2M3f&-RgcrAi{tkr6)KK%ta)wi?H6HTA@hHtfn&>?EzJ(MOf`1 z?n8NP2gK7N6uwLDNeb00gG%+VTX31tMHTW{0ATGw_<|81$UH$c7d@oZZRc!x zrk<*fqkP7G!2_~;zx&1RcYyup0&x{oY6QWNDR$@S15GZ@GYl}3oDtlo~nSKoziTFwlG*hdyy+>fGG6$;Y4i)J z=eqMlI6PL*HSu0u1)r_ORLl18u;4rPgJx8;Ym~TfYZBHnWR)|xVdIdwyvyPu6H7ri8EJAf7wXrqklg)(iopK-&$&27=T&$327O27_cA3@lpBePkuStrV!b5!ou%WMS?wiY zijaL`(>UZ0&C&J+tk$|Jbc&p4ddnjnQ*vP8NC}`cvX(PJuEme>IBzTo7p|M|8ti*Y zZwl=;u+nYsFgMB=PvvgZ?X)Guvkl6b-_h5TdFIudv@W#2tLPZ#o}kd@m@A?bD5-L! zCgUZ05`so?q`uyh%#@4#Sy-ikjX4B0g7Pr9!!VC-Ca%E;96u*YgAt9LfA1vwE1be8 z$e=!k>|;(0Sh%=?yA!@?3Xl#C%+Rk7D%S_du~be}Bq|Lel1Dotgt-c-!C|Zwv0Y!C zVgM;L)QV3TqQ8aY7QG6+o_GY@Y#(73jvn3KTuHJHDVe*Ik7{RA74HkR6*3~P{~?%k z&TCtF3Y?(HG5r*tfau+Z0L>9_$s!T}#EbR=kf5N=rmfhXxS(eXfyV!BRh!oNY-Qv= z#?yl+huPK1W|L@P7V8oNu90^7h{KFW_d_y_9tz$eX5|c?#91fnTn#%%GyNYphf`Wy z)ys;p>rTof_Hcx>us1qswVC{P!=%+ORG8|bVO+VgMl%LyQ8n_ez79EadGgexGOO-- z?b5$+dr0+kLQ(-Nx_z)IjB8PEt&|{G+c;Wnqt1?&f2_OZ-X7Og(QsT!lG~S9h%V&` zOvYNVZ4BZ?vlecR=nPX6AcnjL0qo1~;=ZxR``CmS23S+c4JvU)25?uIKK~xMB_du$bax$8EOo~e3_=O@1m zq=3grLHG5&8Z`v57R4NPPnfFry0T8hQgTZsuYj;B26%sKx1ZgcaR#~_OWkNrRXcU1RVQQ!U>}f-k<|jM+3tY4#>Mi_LHnZ&!2aSr?&bEN=sISuG zh7r^S)R!2DGx~ zxYC@Hz4%y)Uj*~plx#yK+8@@)M&13p(C>D$VM?4r$I@cd@^I4ZuaQ12CsjiP~}D?=Ss?CPDSNhvIelTMuatq zcs^2AgDQ-9HiWgr&b?Mt=3evUi?%?*0a;k*f-hp3!zWwBuSK%1If!kv1L| z|64(}^!E;y7AsNP%oO≦O6kA);W+dFM3&71HI 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 D_=3-9 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bivar_pcolor.png b/lib/matplotlib/tests/baseline_images/test_axes/bivar_pcolor.png new file mode 100644 index 0000000000000000000000000000000000000000..051a32c265d4b4382daf255195014d81cfee5e18 GIT binary patch literal 50734 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
u%$l)syW+q>)#8b1cHpV8XMoWCu{V3z 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 Date: Sat, 26 Aug 2017 11:34:44 +0530 Subject: [PATCH 32/35] Update is_bivar condition to expect either BivariateNorm or BivariateColormap --- .../bivariate_demo.py | 2 ++ lib/matplotlib/axes/_axes.py | 30 ++++++++++++------- lib/matplotlib/tests/test_axes.py | 8 ++--- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/examples/images_contours_and_fields/bivariate_demo.py b/examples/images_contours_and_fields/bivariate_demo.py index d4e41d227b14..7b390dbc08c2 100644 --- a/examples/images_contours_and_fields/bivariate_demo.py +++ b/examples/images_contours_and_fields/bivariate_demo.py @@ -28,6 +28,8 @@ bivariate = [air_temp, surf_pres] +# to distinguish bivariate data either BivariateNorm or BivariateColormap must +# be passed in as argument cax = ax.imshow(bivariate, norm=colors.BivariateNorm(), cmap=colors.BivariateColormap()) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 3bcc8f55d2e9..529888e92c3c 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5151,8 +5151,11 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, raise ValueError(msg) temp = np.asarray(X) - is_bivari = (temp.ndim == 3 or temp.shape[0] == 2) + is_bivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) if is_bivari: + if temp.ndim != 3 and temp.shape[0] != 2: + raise TypeError("Expected shape like (2, n, m)") if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: @@ -5205,7 +5208,8 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 1: C = np.asanyarray(args[0]) - is_bivari = (C.ndim == 3 or C.shape[0] == 2) + is_bivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) if is_bivari: numRows, numCols = C.shape[1:] else: @@ -5220,12 +5224,9 @@ def _pcolorargs(funcname, *args, **kw): if len(args) == 3: X, Y, C = [np.asanyarray(a) for a in args] - is_bivari = (C.ndim == 3 or C.shape[0] == 2) + is_bivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) if is_bivari: - if cmap is None: - cmap = mcolors.BivariateColormap() - if norm is None: - norm = mcolors.BivariateNorm() numRows, numCols = C.shape[1:] else: numRows, numCols = C.shape @@ -5414,8 +5415,11 @@ def pcolor(self, *args, **kwargs): X, Y, C = self._pcolorargs('pcolor', *args, **kw) Ny, Nx = X.shape - is_bivari = (C.ndim == 3 or C.shape[0] == 2) + is_bivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) if is_bivari: + if C.ndim != 3 and C.shape[0] != 2: + raise TypeError("Expected shape like (2, n, m)") if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: @@ -5638,8 +5642,11 @@ def pcolormesh(self, *args, **kwargs): X, Y, C = self._pcolorargs('pcolormesh', *args, **kw) Ny, Nx = X.shape - is_bivari = (C.ndim == 3 or C.shape[0] == 2) + is_bivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) if is_bivari: + if C.ndim != 3 and C.shape[0] != 2: + raise TypeError("Expected shape like (2, n, m)") if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: @@ -5798,8 +5805,11 @@ def pcolorfast(self, *args, **kwargs): C = np.asarray(args[-1]) - is_bivari = (C.ndim == 3 or C.shape[0] == 2) + is_bivari = (isinstance(norm, mcolors.BivariateNorm) or + isinstance(cmap, mcolors.BivariateColormap)) if is_bivari: + if C.ndim != 3 and C.shape[0] != 2: + raise TypeError("Expected shape like (2, n, m)") if cmap is None: cmap = mcolors.BivariateColormap() if norm is None: diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 0495d1b7c7e2..294c6e4ae0cb 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -5285,17 +5285,17 @@ def test_bivariates(): bivariate = [air_temp, surf_pres] fig1, ax1 = plt.subplots() - cax1 = ax1.imshow(bivariate) + cax1 = ax1.imshow(bivariate, norm=mcolors.BivariateNorm()) cbar = fig1.colorbar(cax1, xlabel='air_temp', ylabel='surf_pres') fig2, ax2 = plt.subplots() - cax2 = ax2.pcolor(bivariate) + cax2 = ax2.pcolor(bivariate, norm=mcolors.BivariateNorm()) cbar = fig2.colorbar(cax2, xlabel='air_temp', ylabel='surf_pres') fig3, ax3 = plt.subplots() - cax3 = ax3.pcolormesh(bivariate) + cax3 = ax3.pcolormesh(bivariate, norm=mcolors.BivariateNorm()) cbar = fig3.colorbar(cax3, xlabel='air_temp', ylabel='surf_pres') fig4, ax4 = plt.subplots() - cax4 = ax4.pcolorfast(bivariate) + cax4 = ax4.pcolorfast(bivariate, norm=mcolors.BivariateNorm()) cbar = fig4.colorbar(cax4, xlabel='air_temp', ylabel='surf_pres') From 75a289fcbfcf8f772b80de689c3faaa71191cbdb Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 28 Aug 2017 00:49:18 +0530 Subject: [PATCH 33/35] Add line continuation in docstrings --- lib/matplotlib/axes/_axes.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 529888e92c3c..50cb9a11554a 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5054,7 +5054,7 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, to colors based on the `norm` (mapping scalar to scalar) and the `cmap` (mapping the normed scalar to a color). - cmap : `~matplotlib.colors.Colormap`, + cmap : `~matplotlib.colors.Colormap`, \ `~matplotlib.colors.BivariateColormap`optional, default: None If None, default to rc `image.cmap` value. `cmap` is ignored if `X` is 3-D but not bivariate, directly specifying RGB(A) values. @@ -5081,7 +5081,7 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, on the Agg, ps and pdf backends. Other backends will fall back to 'nearest'. - norm : `~matplotlib.colors.Normalize`, + norm : `~matplotlib.colors.Normalize`, \ `matplotlib.colors.BivariateNorm` optional, default: None A `~matplotlib.colors.Normalize` instance is used to scale a 2-D float `X` input to the (0, 1) range for input to the @@ -5302,10 +5302,12 @@ def pcolor(self, *args, **kwargs): vectors, they will be expanded as needed into the appropriate 2-D arrays, making a rectangular grid. - cmap : `~matplotlib.colors.Colormap`, optional, default: None + cmap : `~matplotlib.colors.Colormap` or \ + `matplotlib.colors.BivariateColormap` optional, default: None If `None`, default to rc settings. - norm : `matplotlib.colors.Normalize`, optional, default: None + norm : `matplotlib.colors.Normalize` or \ + `matplotlib.colors.BivariateNorm` optional, default: None An instance is used to scale luminance data to (0, 1). If `None`, defaults to :func:`normalize`. @@ -5572,12 +5574,12 @@ def pcolormesh(self, *args, **kwargs): Keyword arguments: *cmap*: [ *None* | Colormap ] - A :class:`matplotlib.colors.Colormap` or + A :class:`matplotlib.colors.Colormap` or \ :class:`matplotlib.colors.BivariateColormap`instance. If *None*, use rc settings. *norm*: [ *None* | Normalize ] - A :class:`matplotlib.colors.Normalize` or + A :class:`matplotlib.colors.Normalize` or \ :class:`matplotlib.colors.BivariateNorm` instance is used to scale luminance data to 0,1. If *None*, defaults to :func:`normalize`. @@ -5765,12 +5767,12 @@ def pcolorfast(self, *args, **kwargs): Optional keyword arguments: *cmap*: [ *None* | Colormap ] - A :class:`matplotlib.colors.Colormap` or + A :class:`matplotlib.colors.Colormap` or \ :class:`matplotlib.colors.BivariateColormap` instance from cm. If *None*, use rc settings. *norm*: [ *None* | Normalize ] - A :class:`matplotlib.colors.Normalize` or + A :class:`matplotlib.colors.Normalize` or \ :class:`matplotlib.colors.BivariateNorm` instance is used to scale luminance data to 0,1. If *None*, defaults to normalize() From 7803974ca54df4fde7df1d1c003a9abbc4bbe2e8 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 28 Aug 2017 22:16:46 +0530 Subject: [PATCH 34/35] Debug doc build fail --- lib/matplotlib/axes/_axes.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 50cb9a11554a..2e025c351c1b 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5055,7 +5055,7 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, and the `cmap` (mapping the normed scalar to a color). cmap : `~matplotlib.colors.Colormap`, \ - `~matplotlib.colors.BivariateColormap`optional, default: None + `~matplotlib.colors.BivariateColormap`, optional, default: None If None, default to rc `image.cmap` value. `cmap` is ignored if `X` is 3-D but not bivariate, directly specifying RGB(A) values. @@ -5082,7 +5082,7 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, 'nearest'. norm : `~matplotlib.colors.Normalize`, \ - `matplotlib.colors.BivariateNorm` optional, default: None + `matplotlib.colors.BivariateNorm`, optional, default: None A `~matplotlib.colors.Normalize` instance is used to scale a 2-D float `X` input to the (0, 1) range for input to the `cmap`. If `norm` is None, use the default func:`normalize`. @@ -5302,12 +5302,12 @@ def pcolor(self, *args, **kwargs): vectors, they will be expanded as needed into the appropriate 2-D arrays, making a rectangular grid. - cmap : `~matplotlib.colors.Colormap` or \ - `matplotlib.colors.BivariateColormap` optional, default: None + cmap : `~matplotlib.colors.Colormap` or + `matplotlib.colors.BivariateColormap`, optional, default: None If `None`, default to rc settings. - norm : `matplotlib.colors.Normalize` or \ - `matplotlib.colors.BivariateNorm` optional, default: None + norm : `matplotlib.colors.Normalize` or + `matplotlib.colors.BivariateNorm`, optional, default: None An instance is used to scale luminance data to (0, 1). If `None`, defaults to :func:`normalize`. @@ -5574,12 +5574,12 @@ def pcolormesh(self, *args, **kwargs): Keyword arguments: *cmap*: [ *None* | Colormap ] - A :class:`matplotlib.colors.Colormap` or \ + A :class:`matplotlib.colors.Colormap` or :class:`matplotlib.colors.BivariateColormap`instance. If *None*, use rc settings. *norm*: [ *None* | Normalize ] - A :class:`matplotlib.colors.Normalize` or \ + A :class:`matplotlib.colors.Normalize` or :class:`matplotlib.colors.BivariateNorm` instance is used to scale luminance data to 0,1. If *None*, defaults to :func:`normalize`. @@ -5767,12 +5767,12 @@ def pcolorfast(self, *args, **kwargs): Optional keyword arguments: *cmap*: [ *None* | Colormap ] - A :class:`matplotlib.colors.Colormap` or \ + A :class:`matplotlib.colors.Colormap` or :class:`matplotlib.colors.BivariateColormap` instance from cm. If *None*, use rc settings. *norm*: [ *None* | Normalize ] - A :class:`matplotlib.colors.Normalize` or \ + A :class:`matplotlib.colors.Normalize` or :class:`matplotlib.colors.BivariateNorm` instance is used to scale luminance data to 0,1. If *None*, defaults to normalize() From e40c87b66c9a255a807ea1bdb7702a15426c1e08 Mon Sep 17 00:00:00 2001 From: patniharshit Date: Mon, 28 Aug 2017 22:44:59 +0530 Subject: [PATCH 35/35] Add missing symbols in docs --- .../images_contours_and_fields/bivariate_demo.py | 12 ++++++++---- lib/matplotlib/axes/_axes.py | 6 +++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/examples/images_contours_and_fields/bivariate_demo.py b/examples/images_contours_and_fields/bivariate_demo.py index 7b390dbc08c2..fead56aaae61 100644 --- a/examples/images_contours_and_fields/bivariate_demo.py +++ b/examples/images_contours_and_fields/bivariate_demo.py @@ -1,7 +1,7 @@ """ -=========== +============== Bivariate Demo -=========== +============== Plotting bivariate data. @@ -28,13 +28,17 @@ bivariate = [air_temp, surf_pres] -# to distinguish bivariate data either BivariateNorm or BivariateColormap must +############################################################################### +# To distinguish bivariate data either BivariateNorm or BivariateColormap must # be passed in as argument + cax = ax.imshow(bivariate, norm=colors.BivariateNorm(), cmap=colors.BivariateColormap()) -# if input data is bivariate then colorbar automatically draws colorsquare +############################################################################### +# If input data is bivariate then colorbar automatically draws colorsquare # instead of colorbar + cbar = fig.colorbar(cax, xlabel='air_temp', ylabel='surf_pres') plt.show() diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 2e025c351c1b..404275d0c5e9 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5302,11 +5302,11 @@ def pcolor(self, *args, **kwargs): vectors, they will be expanded as needed into the appropriate 2-D arrays, making a rectangular grid. - cmap : `~matplotlib.colors.Colormap` or + cmap : `~matplotlib.colors.Colormap` or \ `matplotlib.colors.BivariateColormap`, optional, default: None If `None`, default to rc settings. - norm : `matplotlib.colors.Normalize` or + norm : `matplotlib.colors.Normalize` or \ `matplotlib.colors.BivariateNorm`, optional, default: None An instance is used to scale luminance data to (0, 1). If `None`, defaults to :func:`normalize`. @@ -5575,7 +5575,7 @@ def pcolormesh(self, *args, **kwargs): *cmap*: [ *None* | Colormap ] A :class:`matplotlib.colors.Colormap` or - :class:`matplotlib.colors.BivariateColormap`instance. If *None*, + :class:`matplotlib.colors.BivariateColormap` instance. If *None*, use rc settings. *norm*: [ *None* | Normalize ]