Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cbb72b1

Browse files
committed
Factor out common _GeoTransform code.
1 parent a8721cd commit cbb72b1

1 file changed

Lines changed: 40 additions & 136 deletions

File tree

  • lib/matplotlib/projections

lib/matplotlib/projections/geo.py

Lines changed: 40 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@
1919
from matplotlib.ticker import Formatter, Locator, NullLocator, FixedLocator, NullFormatter
2020
from matplotlib.transforms import Affine2D, BboxTransformTo, Transform
2121

22+
2223
class GeoAxes(Axes):
23-
"""
24-
An abstract base class for geographic projections
25-
"""
24+
"""An abstract base class for geographic projections."""
2625
class ThetaFormatter(Formatter):
2726
"""
2827
Used to format the theta tick labels. Converts the native
@@ -247,28 +246,37 @@ def drag_pan(self, button, key, x, y):
247246
pass
248247

249248

250-
class AitoffAxes(GeoAxes):
251-
name = 'aitoff'
249+
class _GeoTransform(Transform):
250+
# Factoring out some common functionality.
251+
input_dims = 2
252+
output_dims = 2
253+
is_separable = False
252254

253-
class AitoffTransform(Transform):
255+
def __init__(self, resolution):
254256
"""
255-
The base Aitoff transform.
257+
Create a new geographical transform.
258+
259+
Resolution is the number of steps to interpolate between each input
260+
line segment to approximate its path in curved space.
256261
"""
257-
input_dims = 2
258-
output_dims = 2
259-
is_separable = False
262+
Transform.__init__(self)
263+
self._resolution = resolution
260264

261-
def __init__(self, resolution):
262-
"""
263-
Create a new Aitoff transform. Resolution is the number of steps
264-
to interpolate between each input line segment to approximate its
265-
path in curved Aitoff space.
266-
"""
267-
Transform.__init__(self)
268-
self._resolution = resolution
265+
def __str__(self):
266+
return "{}({})".format(type(self).__name__, self._resolution)
267+
268+
def transform_path_non_affine(self, path):
269+
vertices = path.vertices
270+
ipath = path.interpolated(self._resolution)
271+
return Path(self.transform(ipath.vertices), ipath.codes)
272+
transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__
273+
274+
275+
class AitoffAxes(GeoAxes):
276+
name = 'aitoff'
269277

270-
def __str__(self):
271-
return "{}({})".format(type(self).__name__, self._resolution)
278+
class AitoffTransform(_GeoTransform):
279+
"""The base Aitoff transform."""
272280

273281
def transform_non_affine(self, ll):
274282
longitude = ll[:, 0:1]
@@ -291,27 +299,11 @@ def transform_non_affine(self, ll):
291299
return np.concatenate((x.filled(0), y.filled(0)), 1)
292300
transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__
293301

294-
def transform_path_non_affine(self, path):
295-
vertices = path.vertices
296-
ipath = path.interpolated(self._resolution)
297-
return Path(self.transform(ipath.vertices), ipath.codes)
298-
transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__
299-
300302
def inverted(self):
301303
return AitoffAxes.InvertedAitoffTransform(self._resolution)
302304
inverted.__doc__ = Transform.inverted.__doc__
303305

304-
class InvertedAitoffTransform(Transform):
305-
input_dims = 2
306-
output_dims = 2
307-
is_separable = False
308-
309-
def __init__(self, resolution):
310-
Transform.__init__(self)
311-
self._resolution = resolution
312-
313-
def __str__(self):
314-
return "{}({})".format(type(self).__name__, self._resolution)
306+
class InvertedAitoffTransform(_GeoTransform):
315307

316308
def transform_non_affine(self, xy):
317309
# MGDTODO: Math is hard ;(
@@ -335,25 +327,8 @@ def _get_core_transform(self, resolution):
335327
class HammerAxes(GeoAxes):
336328
name = 'hammer'
337329

338-
class HammerTransform(Transform):
339-
"""
340-
The base Hammer transform.
341-
"""
342-
input_dims = 2
343-
output_dims = 2
344-
is_separable = False
345-
346-
def __init__(self, resolution):
347-
"""
348-
Create a new Hammer transform. Resolution is the number of steps
349-
to interpolate between each input line segment to approximate its
350-
path in curved Hammer space.
351-
"""
352-
Transform.__init__(self)
353-
self._resolution = resolution
354-
355-
def __str__(self):
356-
return "{}({})".format(type(self).__name__, self._resolution)
330+
class HammerTransform(_GeoTransform):
331+
"""The base Hammer transform."""
357332

358333
def transform_non_affine(self, ll):
359334
longitude = ll[:, 0:1]
@@ -370,27 +345,11 @@ def transform_non_affine(self, ll):
370345
return np.concatenate((x, y), 1)
371346
transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__
372347

373-
def transform_path_non_affine(self, path):
374-
vertices = path.vertices
375-
ipath = path.interpolated(self._resolution)
376-
return Path(self.transform(ipath.vertices), ipath.codes)
377-
transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__
378-
379348
def inverted(self):
380349
return HammerAxes.InvertedHammerTransform(self._resolution)
381350
inverted.__doc__ = Transform.inverted.__doc__
382351

383-
class InvertedHammerTransform(Transform):
384-
input_dims = 2
385-
output_dims = 2
386-
is_separable = False
387-
388-
def __init__(self, resolution):
389-
Transform.__init__(self)
390-
self._resolution = resolution
391-
392-
def __str__(self):
393-
return "{}({})".format(type(self).__name__, self._resolution)
352+
class InvertedHammerTransform(_GeoTransform):
394353

395354
def transform_non_affine(self, xy):
396355
x, y = xy.T
@@ -417,25 +376,8 @@ def _get_core_transform(self, resolution):
417376
class MollweideAxes(GeoAxes):
418377
name = 'mollweide'
419378

420-
class MollweideTransform(Transform):
421-
"""
422-
The base Mollweide transform.
423-
"""
424-
input_dims = 2
425-
output_dims = 2
426-
is_separable = False
427-
428-
def __init__(self, resolution):
429-
"""
430-
Create a new Mollweide transform. Resolution is the number of steps
431-
to interpolate between each input line segment to approximate its
432-
path in curved Mollweide space.
433-
"""
434-
Transform.__init__(self)
435-
self._resolution = resolution
436-
437-
def __str__(self):
438-
return "{}({})".format(type(self).__name__, self._resolution)
379+
class MollweideTransform(_GeoTransform):
380+
"""The base Mollweide transform."""
439381

440382
def transform_non_affine(self, ll):
441383
def d(theta):
@@ -471,27 +413,11 @@ def d(theta):
471413
return xy
472414
transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__
473415

474-
def transform_path_non_affine(self, path):
475-
vertices = path.vertices
476-
ipath = path.interpolated(self._resolution)
477-
return Path(self.transform(ipath.vertices), ipath.codes)
478-
transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__
479-
480416
def inverted(self):
481417
return MollweideAxes.InvertedMollweideTransform(self._resolution)
482418
inverted.__doc__ = Transform.inverted.__doc__
483419

484-
class InvertedMollweideTransform(Transform):
485-
input_dims = 2
486-
output_dims = 2
487-
is_separable = False
488-
489-
def __init__(self, resolution):
490-
Transform.__init__(self)
491-
self._resolution = resolution
492-
493-
def __str__(self):
494-
return "{}({})".format(type(self).__name__, self._resolution)
420+
class InvertedMollweideTransform(_GeoTransform):
495421

496422
def transform_non_affine(self, xy):
497423
x = xy[:, 0:1]
@@ -523,28 +449,19 @@ def _get_core_transform(self, resolution):
523449
class LambertAxes(GeoAxes):
524450
name = 'lambert'
525451

526-
class LambertTransform(Transform):
527-
"""
528-
The base Lambert transform.
529-
"""
530-
input_dims = 2
531-
output_dims = 2
532-
is_separable = False
452+
class LambertTransform(_GeoTransform):
453+
"""The base Lambert transform."""
533454

534455
def __init__(self, center_longitude, center_latitude, resolution):
535456
"""
536457
Create a new Lambert transform. Resolution is the number of steps
537458
to interpolate between each input line segment to approximate its
538459
path in curved Lambert space.
539460
"""
540-
Transform.__init__(self)
541-
self._resolution = resolution
461+
_GeoTransform.__init__(self, resolution)
542462
self._center_longitude = center_longitude
543463
self._center_latitude = center_latitude
544464

545-
def __str__(self):
546-
return "{}({})".format(type(self).__name__, self._resolution)
547-
548465
def transform_non_affine(self, ll):
549466
longitude = ll[:, 0:1]
550467
latitude = ll[:, 1:2]
@@ -568,33 +485,20 @@ def transform_non_affine(self, ll):
568485
return np.concatenate((x, y), 1)
569486
transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__
570487

571-
def transform_path_non_affine(self, path):
572-
vertices = path.vertices
573-
ipath = path.interpolated(self._resolution)
574-
return Path(self.transform(ipath.vertices), ipath.codes)
575-
transform_path_non_affine.__doc__ = Transform.transform_path_non_affine.__doc__
576-
577488
def inverted(self):
578489
return LambertAxes.InvertedLambertTransform(
579490
self._center_longitude,
580491
self._center_latitude,
581492
self._resolution)
582493
inverted.__doc__ = Transform.inverted.__doc__
583494

584-
class InvertedLambertTransform(Transform):
585-
input_dims = 2
586-
output_dims = 2
587-
is_separable = False
495+
class InvertedLambertTransform(_GeoTransform):
588496

589497
def __init__(self, center_longitude, center_latitude, resolution):
590-
Transform.__init__(self)
591-
self._resolution = resolution
498+
_GeoTransform.__init__(self, resolution)
592499
self._center_longitude = center_longitude
593500
self._center_latitude = center_latitude
594501

595-
def __str__(self):
596-
return "{}({})".format(type(self).__name__, self._resolution)
597-
598502
def transform_non_affine(self, xy):
599503
x = xy[:, 0:1]
600504
y = xy[:, 1:2]

0 commit comments

Comments
 (0)