From 11440f83bdaa473de826dca0464499aecf090139 Mon Sep 17 00:00:00 2001 From: "Philipp S. Sommer" Date: Mon, 4 May 2020 20:48:56 +0200 Subject: [PATCH 1/9] Use label_artists instead of xlabel_artists as the latter has been removed for cartopy 0.18 see https://github.com/SciTools/cartopy/pull/1117 --- psy_maps/plotters.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/psy_maps/plotters.py b/psy_maps/plotters.py index 4394d9a..d863f79 100755 --- a/psy_maps/plotters.py +++ b/psy_maps/plotters.py @@ -5,6 +5,7 @@ from difflib import get_close_matches import copy from itertools import starmap, chain, repeat +import cartopy import cartopy.crs as ccrs from cartopy.mpl.gridliner import Gridliner import matplotlib as mpl @@ -1299,7 +1300,11 @@ def update(self, value): continue gl.xlabel_style['size'] = value gl.ylabel_style['size'] = value - for text in chain(gl.xlabel_artists, gl.ylabel_artists): + try: + texts = [t[-1] for t in gl.label_artists] + except AttributeError: # cartopy < 0.18 + texts = chain(gl.xlabel_artists, gl.ylabel_artists) + for text in texts: text.set_size(value) @@ -1379,8 +1384,12 @@ def _disable_other_axis(self): def _modify_gridliner(self, gridliner): """Modify the formatting of the given `gridliner` before drawing""" - gridliner.xlabels_top = False - gridliner.ylabels_right = False + if cartopy.__version__ < "0.18": # cartopy < 0.18 + gridliner.xlabels_top = False + gridliner.ylabels_right = False + else: + gridliner.top_labels = False + gridliner.right_labels = False gridliner.yformatter = lat_formatter gridliner.xformatter = lon_formatter @@ -1388,8 +1397,13 @@ def remove(self): if not hasattr(self, '_gridliner'): return gl = self._gridliner - for artist in chain(gl.xline_artists, gl.yline_artists, - gl.xlabel_artists, gl.ylabel_artists): + try: + artists = chain(gl.xline_artists, gl.yline_artists, + [t[-1] for t in gl.label_artists]) + except AttributeError: # cartopy < 0.17 + artists = chain(gl.xline_artists, gl.yline_artists, + gl.xlabel_artists, gl.ylabel_artists) + for artist in artists: artist.remove() if gl in self.ax._gridliners: self.ax._gridliners.remove(gl) From 61a5d8c4705cd70601a523da918053aaba38b88b Mon Sep 17 00:00:00 2001 From: "Philipp S. Sommer" Date: Mon, 4 May 2020 20:53:20 +0200 Subject: [PATCH 2/9] Include cartopy 0.18 compatibility in changelog --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 588508c..9996f16 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,7 @@ v1.2.1 ====== Added ----- +* compatibility for cartopy 0.18 (see `#14 `__) * all plotmethods now have a ``transpose`` formatoption that can be used if the order of dimensions in the data is ``(x, y)`` rather than ``(y, x)`` * the `transform` and `projection` formatoptions now automatically decode the From e732e0955a8bbe420a21fa5dad79fdf90706efcf Mon Sep 17 00:00:00 2001 From: "Philipp S. Sommer" Date: Mon, 4 May 2020 21:36:20 +0200 Subject: [PATCH 3/9] minor fix for tests --- tests/test_plotters.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test_plotters.py b/tests/test_plotters.py index 68c0537..6e4e9d4 100755 --- a/tests/test_plotters.py +++ b/tests/test_plotters.py @@ -401,8 +401,12 @@ def test_clat(self): def test_grid_labelsize(self): """Test grid_labelsize formatoption""" self.update(grid_labelsize=20) - texts = list(chain(self.plotter.xgrid._gridliner.xlabel_artists, - self.plotter.ygrid._gridliner.ylabel_artists)) + try: + texts = list(chain(self.plotter.xgrid._gridliner.xlabel_artists, + self.plotter.ygrid._gridliner.ylabel_artists)) + except AttributeError: + texts = list(chain(self.plotter.xgrid._gridliner.label_artists, + self.plotter.ygrid._gridliner.label_artists)) self.assertEqual([t.get_size() for t in texts], [20] * len(texts)) From a5aa4c4c42d913f158f8baf5f869eb3d9d4778e0 Mon Sep 17 00:00:00 2001 From: "Philipp S. Sommer" Date: Mon, 4 May 2020 22:35:50 +0200 Subject: [PATCH 4/9] Minor fix for tests --- tests/test_plotters.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_plotters.py b/tests/test_plotters.py index 6e4e9d4..ad4e6c1 100755 --- a/tests/test_plotters.py +++ b/tests/test_plotters.py @@ -407,6 +407,7 @@ def test_grid_labelsize(self): except AttributeError: texts = list(chain(self.plotter.xgrid._gridliner.label_artists, self.plotter.ygrid._gridliner.label_artists)) + texts = [t[-1] for t in texts] self.assertEqual([t.get_size() for t in texts], [20] * len(texts)) From b0d5ea9045792392a0b490b4a136df190e7f7ee9 Mon Sep 17 00:00:00 2001 From: "Philipp S. Sommer" Date: Mon, 4 May 2020 23:41:15 +0200 Subject: [PATCH 5/9] disable xgrid for vector plotters --- tests/test_plotters.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/test_plotters.py b/tests/test_plotters.py index ad4e6c1..329a2e7 100755 --- a/tests/test_plotters.py +++ b/tests/test_plotters.py @@ -400,7 +400,7 @@ def test_clat(self): def test_grid_labelsize(self): """Test grid_labelsize formatoption""" - self.update(grid_labelsize=20) + self.update(xgrid=True, ygrid=True, grid_labelsize=20) try: texts = list(chain(self.plotter.xgrid._gridliner.xlabel_artists, self.plotter.ygrid._gridliner.ylabel_artists)) @@ -503,6 +503,8 @@ def setUpClass(cls): rcParams[plotter.map_extent.default_key] = 'data' rcParams[plotter.color.default_key] = 'absolute' rcParams[plotter.cticklabels.default_key] = '%0.6g' + rcParams[plotter.xgrid.default_key] = False + rcParams[plotter.ygrid.default_key] = False cls.data = ArrayList.from_dataset( cls.ds, t=0, z=0, name=[cls.var], auto_update=True)[0] cls.data.attrs['long_name'] = 'absolute wind speed' @@ -594,6 +596,8 @@ class StreamVectorPlotterTest(VectorPlotterTest): def setUpClass(cls): plotter = VectorPlotter() rcParams[plotter.plot.default_key] = 'stream' + rcParams[plotter.xgrid.default_key] = False + rcParams[plotter.ygrid.default_key] = False return super(StreamVectorPlotterTest, cls).setUpClass() def get_ref_file(self, identifier): @@ -714,6 +718,8 @@ def setUpClass(cls): rcParams[plotter.lonlatbox.default_key] = 'Europe' rcParams[plotter.cticklabels.default_key] = '%0.6g' rcParams[plotter.vcmap.default_key] = 'winter' + rcParams[plotter.xgrid.default_key] = False + rcParams[plotter.ygrid.default_key] = False cls._data = ArrayList.from_dataset( cls.ds, t=0, z=0, name=[cls.var], auto_update=True, prefer_list=True)[0] @@ -1045,6 +1051,8 @@ def setUpClass(cls): rcParams['plotter.maps.clat'] = 90 rcParams['plotter.vector.arrowsize'] = 200 rcParams['plotter.maps.lonlatbox'] = 'Europe' + rcParams['plotter.maps.xgrid'] = False + rcParams['plotter.maps.ygrid'] = False super(CircumpolarVectorPlotterTest, cls).setUpClass() def ref_map_grid(self, close=True): From 0890a1fffda4e57283de9992824bb9680fc3849b Mon Sep 17 00:00:00 2001 From: "Philipp S. Sommer" Date: Tue, 5 May 2020 00:43:30 +0200 Subject: [PATCH 6/9] Use BoundsType for grid validation --- psy_maps/plugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/psy_maps/plugin.py b/psy_maps/plugin.py index 6d1da75..ad1d081 100644 --- a/psy_maps/plugin.py +++ b/psy_maps/plugin.py @@ -9,7 +9,7 @@ try_and_error, validate_none, validate_str, validate_float, validate_nseq_float, validate_bool_maybe_none, validate_fontsize, validate_color, validate_dict, BoundsValidator, bound_strings, - ValidateInStrings, validate_bool) + ValidateInStrings, validate_bool, BoundsType) from psy_maps import __version__ as plugin_version @@ -50,7 +50,7 @@ def validate_grid(val): try: return validate_bool_maybe_none(val) except ValueError: - return BoundsValidator('grid', bound_strings, True)(val) + return BoundsValidator(BoundsType)(val) def validate_lsm(val): From 11491e5ef8e833433477e23886c63fbec8fda194 Mon Sep 17 00:00:00 2001 From: "Philipp S. Sommer" Date: Tue, 5 May 2020 01:21:36 +0200 Subject: [PATCH 7/9] Increase RMS tolerance for test_grid --- tests/test_plotters.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_plotters.py b/tests/test_plotters.py index 329a2e7..4e0a2f3 100755 --- a/tests/test_plotters.py +++ b/tests/test_plotters.py @@ -371,14 +371,14 @@ def test_projection(self, *args): def test_grid(self, *args): """Test xgrid, ygrid, grid_color, grid_labels, grid_settings fmts""" self.update(xgrid=False, ygrid=False) - self.compare_figures(next(iter(args), self.get_ref_file('grid1'))) + self.compare_figures(next(iter(args), self.get_ref_file('grid1')), 10) self.update(xgrid='rounded', ygrid=['data', 20]) - self.compare_figures(next(iter(args), self.get_ref_file('grid2'))) + self.compare_figures(next(iter(args), self.get_ref_file('grid2')), 10) self.update(xgrid=True, ygrid=True, grid_color='w') - self.compare_figures(next(iter(args), self.get_ref_file('grid3'))) + self.compare_figures(next(iter(args), self.get_ref_file('grid3')), 10) self.update(xgrid=True, ygrid=True, grid_color='k', grid_settings={'linestyle': 'dotted'}) - self.compare_figures(next(iter(args), self.get_ref_file('grid4'))) + self.compare_figures(next(iter(args), self.get_ref_file('grid4')), 10) def test_clon(self): """Test clon formatoption""" From f484426d4f88234e7aca689b801b27944f3738c9 Mon Sep 17 00:00:00 2001 From: "Philipp S. Sommer" Date: Tue, 5 May 2020 02:08:37 +0200 Subject: [PATCH 8/9] Minor fix for tests --- tests/test_plotters.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_plotters.py b/tests/test_plotters.py index 4e0a2f3..3d60a62 100755 --- a/tests/test_plotters.py +++ b/tests/test_plotters.py @@ -371,14 +371,14 @@ def test_projection(self, *args): def test_grid(self, *args): """Test xgrid, ygrid, grid_color, grid_labels, grid_settings fmts""" self.update(xgrid=False, ygrid=False) - self.compare_figures(next(iter(args), self.get_ref_file('grid1')), 10) + self.compare_figures(next(iter(args), self.get_ref_file('grid1')), tol=10) self.update(xgrid='rounded', ygrid=['data', 20]) - self.compare_figures(next(iter(args), self.get_ref_file('grid2')), 10) + self.compare_figures(next(iter(args), self.get_ref_file('grid2')), tol=10) self.update(xgrid=True, ygrid=True, grid_color='w') - self.compare_figures(next(iter(args), self.get_ref_file('grid3')), 10) + self.compare_figures(next(iter(args), self.get_ref_file('grid3')), tol=10) self.update(xgrid=True, ygrid=True, grid_color='k', grid_settings={'linestyle': 'dotted'}) - self.compare_figures(next(iter(args), self.get_ref_file('grid4')), 10) + self.compare_figures(next(iter(args), self.get_ref_file('grid4')), tol=10) def test_clon(self): """Test clon formatoption""" From 7b8b02cfc12dd212dda9991b5dfef2afb2f549a9 Mon Sep 17 00:00:00 2001 From: "Philipp S. Sommer" Date: Tue, 5 May 2020 06:16:33 +0200 Subject: [PATCH 9/9] Disable grid for contour test --- tests/test_plotters.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_plotters.py b/tests/test_plotters.py index 3d60a62..c131517 100755 --- a/tests/test_plotters.py +++ b/tests/test_plotters.py @@ -420,6 +420,8 @@ def setUpClass(cls): plotter = FieldPlotter() rcParams[plotter.plot.default_key] = 'contourf' rcParams[plotter.lonlatbox.default_key] = [-180, 180, -90, 90] + rcParams[plotter.xgrid.default_key] = False + rcParams[plotter.ygrid.default_key] = False super(FieldPlotterContourTest, cls).setUpClass() @unittest.skip('Extend keyword not implemented')